문제가 발생했다
회사내에서 개발중인 java 프로젝트 작업을 하던 도중에 발생한 문제였다.
일종의 Library형태로 개발중이던 패키지를 테스트하는 목적으로,
- 기능을 windows에서 수정하고,
- 이 패키지를 dependency로 사용하는 별도의 프로젝트를 만들어서
- runnable jar로 다시 한번 패키지로 만든 뒤에 linux에서 테스트를 하겠다 는 목적으로 뚝딱거리고 있었다.
개발중인 프로젝트는 Maven프로젝트였는데, 그대로 maven repository서버로 올리기에는 우선은 아직 개발중이고, 개발자수준에서 테스트중인 셈이라 아직은 maven서버로 올리지 않을 생각이었다. 이때 그냥 maven package로 jar파일을 만들었을 때 하위 의존성이 걸린 패키지들을 불러오지 못하는 문제가 있었다. 그래서 그 부분에 대한 해결방법을 대충 찾아서 기록해두려고 한다.
간단한 참고
- 사용중인 IDE툴: Jetbrains사의 Intellij
- 개발 환경: Windows 10
- jdk 버전: 1.8.0_161
설정 방법
jar 패키징
기존 프로젝트를 maven package 명령으로 패키지 한 뒤에 테스트용 프로젝트에서 dependency로 추가하는 경우에 이 jar에 있는 dependency를 제대로 못가져오는 문제가 있다. 따라서 아래와 같이 pom.xml을 일부 수정해서 의존성 패키지들을 불러올 수 있도록 해줘야 한다.
<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
</configuration>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
출처: [Stackoverflow] Including dependencies in a jar with Maven 의 답변 중에서 Leslie Li의 답변
이렇게 하면 jar가 패키지된 폴더에 lib라는 폴더를 새로 만들고, 여기에 이 프로젝트가 의존하는 jar를 몽땅 복사해넣는다.
테스트 프로젝트 생성
Maven 프로젝트를 생성하면 pom.xml이 프로젝트폴더 기준 root에 있을것이다. 이 pom.xml을 로컬 스토리지에 있는 jar를 의존성으로 쓰기위해 아래 내용을 추가한다.
<dependency>
<groupId>[[그룹 이름]]</groupId>
<artifactId>[[프로젝트 이름]]</artifactId>
<version>[[버전]]</version>
<scope>system</scope>
<systemPath>[[jar 파일 위치]]</systemPath>
</dependency>
위 작업들을 마무리한 뒤 maven package를 하면 의존성이 걸린 jar파일들은 전부 타겟 jar파일이 있는 폴더의 하위에 lib파일안으로 복사된다. 그리고 테스트용 프로젝트에서 해당 jar를 포함하면 알아서 의존성 패키지를 긁어다 쓴다. 마찬가지로 더 좋은 방법이 있으면, 내용을 좀 더 수정/보완 하기로 한다.