maven (2.0.9)이 모든 jar 파일을 단일 jar 파일에 포함 시키도록 강제하는 방법이 있습니까?
단일 jar 파일로 빌드 한 프로젝트가 있습니다. 종속성의 클래스도 jar로 복사하기를 원합니다.
업데이트 : 단지 jar 파일에 jar 파일을 포함시킬 수 없다는 것을 알고 있습니다. 종속성으로 지정된 항아리를 풀고 클래스 파일을 내 항아리에 패키지하는 방법을 찾고 있습니다.
답변
“jar-with-dependencies”설명자와 함께 maven-assembly 플러그인을 사용하여이를 수행 할 수 있습니다. 이를 수행하는 pom.xml 중 하나의 관련 청크가 있습니다.
<build>
<plugins>
<!-- any other plugins -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
답변
Maven 2에서이를 수행하는 올바른 방법 은 사전 정의 된 설명자 파일 이있는 Maven2 Assembly Plugin 을 사용하는 것이며 명령 행에서 사용할 수 있습니다.
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
이 jar을 실행 가능하게하려면 플러그인 구성에 실행할 기본 클래스를 추가하십시오.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>my.package.to.my.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
일반 빌드 프로세스의 일부로 해당 어셈블리를 작성하려면 단일 또는 디렉토리 단일 목표 ( assembly
목표는 명령 행에서만 실행해야 package
함)를 다음과 같이 라이프 사이클 단계에 적용 해야합니다.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>create-my-bundle</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
...
</configuration>
</execution>
</executions>
</plugin>
적응 configuration
(말씀으로 매니페스트 물건 예를 들어) 당신의 요구에 맞게 요소를.
답변
실행 가능한 jar 파일을 수행하려면 주 클래스도 설정해야합니다. 따라서 전체 구성이되어야합니다.
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- ... -->
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
답변
있다 그늘 받는다는 플러그인 . 종속성 을 패키지하고 이름을 바꾸는 데 사용할 수 있습니다 (클래스 경로에서 종속성 문제를 생략하기 위해).
답변
<classifier>
태그 를 사용하여 새로 만든 jar을 사용할 수 있습니다 .
<dependencies>
<dependency>
<groupId>your.group.id</groupId>
<artifactId>your.artifact.id</artifactId>
<version>1.0</version>
<type>jar</type>
<classifier>jar-with-dependencies</classifier>
</dependency>
</dependencies>
답변
(나 같은) 당신이 특히처럼 해달라고하면 항아리-와 의존성 접근 위에서 설명한, 내가 선호하는 받는다는-솔루션은 당신이 구축 만 독립형 자바 응용 프로그램이 경우에도 단순히 WAR 프로젝트를 구축하는 것입니다 :
-
일반적인 maven jar-project를 만들어 jar 파일을 빌드하십시오 (종속성 없음).
-
또한 jar 프로젝트가있는 maven war-project ( maven 빌드의 경고 / 오류를 피하는 빈 src / main / webapp / WEB-INF / web.xml 파일 만 사용)를 설정하십시오. 의존성을 높이고 jar 프로젝트를
<module>
전쟁 프로젝트 아래에 만듭니다. (이 전쟁 프로젝트는 모든 jar 파일 종속성을 zip 파일로 감싸는 간단한 방법입니다.) -
war 파일을 생성하기 위해 war 프로젝트를 빌드하십시오.
-
배포 단계에서 .war 파일의 이름을 * .zip으로 바꾸고 압축을 풉니 다.
이제 jar와 응용 프로그램을 실행하는 데 필요한 모든 종속성과 함께 lib 디렉토리 (원하는 곳으로 이동할 수 있음)가 있어야합니다.
java -cp 'path/lib/*' MainClass
(classpath의 와일드 카드는 Java-6 이상에서 작동합니다)
필자는 이것이 maven에서 설정하는 것이 더 간단하고 (어셈블리 플러그인으로 엉망으로 만들 필요가 없음) 응용 프로그램 구조를 더 명확하게 볼 수 있다고 생각합니다 (모든 종속 jar의 버전 번호는 일반보기로 표시됩니다. 모든 것을 단일 jar 파일로 막지 마십시오).
답변
http://fiji.sc/Uber-JAR 은 대안에 대한 훌륭한 설명을 제공합니다.
uber-JAR을 구성하는 일반적인 세 가지 방법이 있습니다.
- 음영 처리되지 않았습니다. 모든 JAR 파일의 압축을 푼 다음 단일 JAR로 다시 압축하십시오.
- Pro : Java의 기본 클래스 로더와 함께 작동합니다.
- 단점 : 경로가 동일한 여러 JAR 파일에 존재하는 파일 (예 : META-INF / services / javax.script.ScriptEngineFactory)은 서로 덮어 쓰여 동작이 잘못됩니다.
- 도구 : Maven Assembly Plugin, Classworlds Uberjar
- 음영 처리 음영 처리되지 않은 것과 동일하지만 모든 종속성의 모든 패키지 이름을 바꾸십시오 (예 : “음영”).
- Pro : Java의 기본 클래스 로더와 함께 작동합니다. 일부 (전부는 아님) 종속성 버전 충돌을 방지합니다.
- 단점 : 경로가 동일한 여러 JAR 파일에 존재하는 파일 (예 : META-INF / services / javax.script.ScriptEngineFactory)은 서로 덮어 쓰여 동작이 잘못됩니다.
- 도구 : Maven Shade Plugin
- JAR의 JAR. 최종 JAR 파일에는 다른 JAR 파일이 포함되어 있습니다.
- Pro : 종속성 버전 충돌을 방지합니다. 모든 리소스 파일이 유지됩니다.
- 단점 : Java가 래핑 된 JAR 파일에서 클래스를로드 할 수 있도록 특수한 “부트 스트랩”클래스 로더를 번들로 제공해야합니다. 클래스 로더 문제 디버깅이 더 복잡해집니다.
- 도구 : Eclipse JAR 파일 내보내기, 1JAR