[java] Maven으로 항아리에 종속성 포함

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 프로젝트를 구축하는 것입니다 :

  1. 일반적인 maven jar-project를 만들어 jar 파일을 빌드하십시오 (종속성 없음).

  2. 또한 jar 프로젝트가있는 maven war-project ( maven 빌드의 경고 / 오류를 피하는 빈 src / main / webapp / WEB-INF / web.xml 파일 만 사용)를 설정하십시오. 의존성을 높이고 jar 프로젝트를 <module>전쟁 프로젝트 아래에 만듭니다. (이 전쟁 프로젝트는 모든 jar 파일 종속성을 zip 파일로 감싸는 간단한 방법입니다.)

  3. war 파일을 생성하기 위해 war 프로젝트를 빌드하십시오.

  4. 배포 단계에서 .war 파일의 이름을 * .zip으로 바꾸고 압축을 풉니 다.

이제 jar와 응용 프로그램을 실행하는 데 필요한 모든 종속성과 함께 lib 디렉토리 (원하는 곳으로 이동할 수 있음)가 있어야합니다.

java -cp 'path/lib/*' MainClass

(classpath의 와일드 카드는 Java-6 이상에서 작동합니다)

필자는 이것이 maven에서 설정하는 것이 더 간단하고 (어셈블리 플러그인으로 엉망으로 만들 필요가 없음) 응용 프로그램 구조를 더 명확하게 볼 수 있다고 생각합니다 (모든 종속 jar의 버전 번호는 일반보기로 표시됩니다. 모든 것을 단일 jar 파일로 막지 마십시오).


답변

http://fiji.sc/Uber-JAR 은 대안에 대한 훌륭한 설명을 제공합니다.

uber-JAR을 구성하는 일반적인 세 ​​가지 방법이 있습니다.

  1. 음영 처리되지 않았습니다. 모든 JAR 파일의 압축을 푼 다음 단일 JAR로 다시 압축하십시오.
    • Pro : Java의 기본 클래스 로더와 함께 작동합니다.
    • 단점 : 경로가 동일한 여러 JAR 파일에 존재하는 파일 (예 : META-INF / services / javax.script.ScriptEngineFactory)은 서로 덮어 쓰여 동작이 잘못됩니다.
    • 도구 : Maven Assembly Plugin, Classworlds Uberjar
  2. 음영 처리 음영 처리되지 않은 것과 동일하지만 모든 종속성의 모든 패키지 이름을 바꾸십시오 (예 : “음영”).
    • Pro : Java의 기본 클래스 로더와 함께 작동합니다. 일부 (전부는 아님) 종속성 버전 충돌을 방지합니다.
    • 단점 : 경로가 동일한 여러 JAR 파일에 존재하는 파일 (예 : META-INF / services / javax.script.ScriptEngineFactory)은 서로 덮어 쓰여 동작이 잘못됩니다.
    • 도구 : Maven Shade Plugin
  3. JAR의 JAR. 최종 JAR 파일에는 다른 JAR 파일이 포함되어 있습니다.
    • Pro : 종속성 버전 충돌을 방지합니다. 모든 리소스 파일이 유지됩니다.
    • 단점 : Java가 래핑 된 JAR 파일에서 클래스를로드 할 수 있도록 특수한 “부트 스트랩”클래스 로더를 번들로 제공해야합니다. 클래스 로더 문제 디버깅이 더 복잡해집니다.
    • 도구 : Eclipse JAR 파일 내보내기, 1JAR