티스토리 뷰
maven으로 프로젝트를 진행하다보면 3rd party library를 가져와야 하는 상황이 있다. 3rd party library는 maven central repository에는 물론 등록되지 않은 library이다. 일반적으로 이럴 경우에는 remote repository인 내부 nexus에 이런 파일들을 올려놓고 사용을 하지만 여건상 nexus도 구축을 하지 못하는 상황에서 사용할 수 있는 방법이다.
첫번째 방법은 systemPath 를 이용하는 방법이다.
pom.xml
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>8</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/ojdbc6.jar</systemPath>
</dependency>
pom.xml 에 일반적으로 작성하는 dependency에 추가적으로 scope와 systemPath를 추가적으로 입력해준다. 여기에서 ${project.basedir} 이란 프로젝트의 root directory라고 보면 된다. (프로젝트명이 sample 이라면 sample/lib/ojdbc6.jar) 가장 간단한 방법이며 독립적인 모듈에서 사용하기 좋고 lib 폴더에 적은 양의 3rd party library가 있을 경우 사용하면 좋다.
두번째 방법은 local repository를 만들어서 사용하는 방법이다.
여기서 말하는 local repository는 .m2 나 settings.xml 에서 정의한 local repository가 아니라 프로젝트 내부에 정의한 폴더를 의미한다.
pom.xml
<repositories>
...
<repository>
<id>local-repository</id>
<name>local repository</name>
<url>file://${project.basedir}/lib</url>
</repository>
...
</repositories>
<dependencies>
...
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc</artifactId>
<version>8</version>
</dependency>
...
</dependencies>
.m2 나 settings.xml에 정의한 것처럼 또하나의 local repository를 또 정의해서 사용하는 것이라고 보면 된다. 물론 file:// 로 정의된걸 보면 프로젝트 외부에도 이렇게 만들어서 사용할 수 있지만 배포하려는 서버에 동일한 경로에 파일 또한 따로 배포해줘야한다. 또한 os가 달라서 폴더구조가 다르다면 적용이 어렵다. 이런 수고를 덜기 위해서 이렇게 사용하는 경우는 프로젝트 내부에 만들어서 사용하는것이 편하다.
또하나의 local repository인 만큼 lib 폴더 밑에 3rd party library를 추가할때도 maven의 디렉토리 구조에 맞게 넣어줘야 한다. 위와 같은 경우는 /xxx/xxx/sample/lib/com/oracle/ojdbc/8/lib명.jar 에 넣어줘야 하는 것이다.
하지만 이 경우도 프로젝트가 parent / child 구조라면 적용이 되지 않는다.
이럴때는 parent project는
<properties>
<main.basedir>${project.basedir}</main.basedir>
</properties>
<repositories>
<repository>
<id>local-repository</id>
<name>local repository</name>
<url>file://${project.basedir}/lib</url>
</repository>
</repositories>
child project는
<properties>
<main.basedir>${project.basedir}/..</main.basedir>
</properties>
<repositories>
<repository>
<id>local-repository</id>
<name>local repository</name>
<url>file://${project.basedir}/lib</url>
</repository>
</repositories>
로 구성을 한다. child의 /.. 가 핵심이다.
이렇게 해도 종속성 관련 에러가 난다면 Forces a check for updated releases and snapshots on remote repositories 속성으로 maven 업데이트를 해줘야 한다.
이클립스에서는 프로젝트 우클릭 > Maven > Update Project > Force Update of Snapshots/Releases 체크 후 OK
CLI 상에서는 maven clean compile package -U
를 해주면 해결할 수 있다.
'CI,CD > Build' 카테고리의 다른 글
CentOS (linux) 에서 Nexus 설치하기 (0) | 2020.07.17 |
---|---|
linux에 Apache Ant 설치하기 (0) | 2020.07.16 |
Maven build 시 Exception in thread "main" java.lang.AssertionError 해결방법 (0) | 2020.06.22 |
Maven 명령어 및 옵션 모음 (0) | 2020.06.22 |
maven-dependency-plugin 오류 - Artifact has not been packaged yet. When used on reactor artifact, copy should be executed after packaging: see MDEP-187 (0) | 2020.06.08 |