maven 의 assmbly 기능을 이용해서 단일 dependency 로 만들었을 경우(jar-with-dependencies 사용)에 만들어진 jar 파일로 실행하면 spring.scheas 파일들이 중복되는 오류가 발생한다.

해당 이슈에 대하여서 Spring JIRA 에 등록되어 있다. http://jira.codehaus.org/browse/MASSEMBLY-360

여하튼, 해결 방법은 assembly:assembly 를 시행할 프로젝트의 리소스 폴더에 META-INF 하위로 스프링 스키마 파일들을 복사해놓고 assembly 시키는 것이다.

예를 들어
디렉터리 구조
src/main/resources/META-INF/spring.handlers
src/main/resources/META-INF/spring.schemas

console>mvn assembly:assembly

하면 된다. 스키마 파일들은 스프링 jar 파일들을 풀면 구할 수 있다.
war 프로젝트의 경우에는 war 배포시 WEB-INF/lib 안에 dependency 하고 있는 jar 들이 배포된다.
그러나 jar 프로젝트의 경우에는 컴파일을 하기 위해서 dependency 하고 있는 라이브러리들을 사용할 뿐이지 배포물에는 포함되지 않는다.


1. maven 프로젝트에서 단일 jar 만들기

배포물(jar) 에 해당 라이브러리도 같이 넣고 싶다면 assembly 골을 사용하면 된다.
$emds-core> mvn assembly:assembly

단, 이것을 실행하기 위해선 pom.xml 의 build/plugins 하위에 다음과 같은 설정을 추가해야한다.
만약, 단일 jar 파일을 실행 jar 로 만들 경우엔 manifest 설정도 추가한다
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
이 골은 의존하고 있는 프로젝트의 파일들을 전부 풀어서 하나의 jar 로 만들어버린다. 따라서 많은 수의 라이브러리를 하나의 jar 로 만들고 싶은 경우 사용할 수 있다.

2. maven 프로젝트에서 의존하고 있는 jar 추출하기

그러나 현재 프로젝트에서 사용하고 있는 dependency 라이브러리들에 대해서 다 추출하고 싶다면(실제로 파일로 가져오고 싶다면) dependency:copy-dependencies 명령을 이용해서 가져올 수 잇다.

$emds-core> mvn dependency:copy-dependencies


이 명령은 프로젝트에서 참조하는 라이브러리들을 target/dependency 에 모두 복사해넣는다.
따라서 소스를 풀어서 재결합한 assembly 방식을 피하고 싶다면 이 명령과
package 명령을 통해 만들어진 프로젝트.jar 파일을 사용한다면 해당 프로젝트를 완전히 배포할 수 있다.

+ Recent posts