Maven을 사용하여 뚱뚱한 항아리 만들기


118

항아리로 배포하려는 코드 기반이 있습니다. 또한 최종 항아리에 번들로 묶고 싶은 외부 항아리에 대한 종속성이 있습니다.

을 사용하여이 작업을 수행 할 수 있다고 들었지만 maven-assembly-plug-in방법을 모르겠습니다. 누군가 나를 몇 가지 예를 들어 줄 수 있습니까?

지금은 마지막 병을 묶기 위해 지방 병을 사용하고 있습니다. maven을 사용하여 동일한 것을 달성하고 싶습니다.

답변:


143

참고 : 스프링 부트 애플리케이션 인 경우 답변 끝을 읽으십시오.

당신에 플러그인 다음 추가 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>

1
이 플러그인의 현재 버전은 이제 2.4입니다
guerda 2013

13
이것은 이제 더 이상 사용되지 않으며 대신 maven-shade-plugin을 사용해야합니다. @phlogratos 답변 : stackoverflow.com/a/16222965/274350을 참조하십시오 .
리처드 Neish

2
maven-assembly-plugin이 fat jar의 크기를 최소화 할 수 있습니까?
May12 2015

1
@Richard 어디에서 더 이상 사용되지 않습니까? 나는 주변에서 아무것도 찾을 수 없습니다 maven.apache.org/plugins/maven-assembly-plugin
user3833308

3
@ user3833308 "deprecated"는 잘못된 단어 일 수 있지만 maven.apache.org/plugins/maven-assembly-plugin 의 문서에 "프로젝트가 아티팩트를 uber-jar에 패키징하려는 경우 어셈블리 플러그인은 기본 더 많은 제어를 위해 Maven Shade Plugin을 사용하십시오. "
Richard Neish 2018 년

55

maven-shade-plugin을 사용할 수 있습니다 .

빌드에서 shade 플러그인을 구성한 후 명령 mvn package은 모든 종속성이 병합 된 단일 jar를 생성합니다.


9
이제 이것이 올바른 방법입니다. maven-assembly-plugin 문서에는 다음과 같이 나와 있습니다. "프로젝트에서 아티팩트를 uber-jar로 패키징하려는 경우 어셈블리 플러그인은 기본 지원 만 제공합니다. 더 많은 제어를 위해 Maven Shade 플러그인을 사용하십시오."
Richard Neish 2014 년

그러나 단일 .jar를 어떻게 게시에 사용합니까?
DanGordon

42

아마도 당신은 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>

참조 :


만난 경우 Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found제거하십시오 <minimizeJar>true</minimizeJar>.
koppor

"java.lang.SecurityException : 매니페스트 기본 속성에 대한 유효하지 않은 서명 파일 다이제스트"예외가 발생하는 경우 위 구성 섹션에이 추가 사항이 도움이됩니다. stackoverflow.com/a/6743609/38368
Danny Varod

12

실제로, 추가

<archive>
   <manifest>
    <addClasspath>true</addClasspath>
    <packageName>com.some.pkg</packageName>                     
    <mainClass>com.MainClass</mainClass>
  </manifest>
</archive>

maven-jar-plugin에 대한 선언은 나를 위해 매니페스트 파일에 기본 클래스 항목을 추가하지 않습니다. 매니페스트에서 가져 오기 위해 maven-assembly-plugin에 추가해야했습니다.


5

패키징을 위해 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.


패키징하려는 종속성을 선택할 수 있습니까? 예를 들어, a.jar 및 b.jar이 외부 jar이고 a.jar 만 최종 jar에 패키징하려는 경우 가능 / 구성 가능한 것이 있습니까?
bianca 2013

나는 또한 하나의 항아리가 최종 항아리에 묶여있는 것을 봅니다. 이것은 최종 항아리의 크기를 많이 증가 시켰습니다. 최종 항아리에 포함하려는 외부 항아리를 선택할 수 있습니까? 다음은 한 병 로그입니다. pastebin.com/UwniQJ2X
bianca 2013

포함 된 것을 구성 할 수 있는지 여부를 모르겠습니다. 기본적으로 one-jar에는 전 이적 종속성을 포함하여 프로젝트에서 지정한 모든 종속성이 포함되므로 예, 종속성이 많으면 최종 jar가 커질 수 있습니다. Java가 "jar of jars"구조로 작동하도록하기 위해 one-jar에 의해 약간의 오버 헤드가 추가됩니다.
matsev 2013-04-26

2

대안은 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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.