항아리로 배포하려는 코드 기반이 있습니다. 또한 최종 항아리에 번들로 묶고 싶은 외부 항아리에 대한 종속성이 있습니다.
을 사용하여이 작업을 수행 할 수 있다고 들었지만 maven-assembly-plug-in
방법을 모르겠습니다. 누군가 나를 몇 가지 예를 들어 줄 수 있습니까?
지금은 마지막 병을 묶기 위해 지방 병을 사용하고 있습니다. maven을 사용하여 동일한 것을 달성하고 싶습니다.
답변
참고 : 스프링 부트 애플리케이션 인 경우 답변 끝을 읽으십시오.
당신에 플러그인 다음 추가 pom.xml
최신 버전의 수 에서 발견
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>CHOOSE LATEST VERSION HERE</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
이 플러그인을 구성한 후 실행 mvn package
하면 두 개의 jar가 생성됩니다. 하나는 프로젝트 클래스 만 포함하고 다른 하나는 “-jar-with-dependencies”접미사가있는 모든 종속성이있는 두 번째 fat jar입니다.
classpath
런타임에 올바른 설정 을 원하면 다음 플러그인도 추가하십시오.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
스프링 부트 애플리케이션의 경우 다음 플러그인을 사용하십시오 (적절한 버전 선택).
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<mainClass>${start-class}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
답변
답변
아마도 당신은 maven-shade-plugin
충돌을 피하기 위해 종속성을 번들로 묶고 사용하지 않는 코드를 최소화하고 외부 종속성을 숨길 수 있습니다.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
<createDependencyReducedPom>true</createDependencyReducedPom>
<dependencyReducedPomLocation>
${java.io.tmpdir}/dependency-reduced-pom.xml
</dependencyReducedPomLocation>
<relocations>
<relocation>
<pattern>com.acme.coyote</pattern>
<shadedPattern>hidden.coyote</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
참조 :
답변
실제로, 추가
<archive>
<manifest>
<addClasspath>true</addClasspath>
<packageName>com.some.pkg</packageName>
<mainClass>com.MainClass</mainClass>
</manifest>
</archive>
maven-jar-plugin에 대한 선언은 나를 위해 매니페스트 파일에 기본 클래스 항목을 추가하지 않습니다. 매니페스트에서 가져 오기 위해 maven-assembly-plugin에 추가해야했습니다.
답변
패키징을 위해 onejar-maven-plugin 을 사용할 수 있습니다 . 기본적으로, 프로젝트 jar 파일뿐만 아니라 모든 외부 종속성을 “jar of jar”로 포함하여 프로젝트와 해당 종속성을 하나의 jar로 어셈블합니다.
<build>
<plugins>
<plugin>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
참고 1 : 구성 옵션은 프로젝트 홈 페이지 에서 사용할 수 있습니다 .
참고 2 : 어떤 이유로 인해 onejar-maven-plugin 프로젝트는 Maven Central에 게시되지 않습니다. 그러나 jolira.com 은 원본 프로젝트를 추적하고 groupId로 게시합니다 com.jolira
.
답변
대안은 maven shade 플러그인을 사용하여 uber-jar
.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version> Your Version Here </version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>