동일한 groupId를 기반으로하는 하위 모듈 만 포함하는 uber jar를 생성하는 Maven Shade 플러그인 구성

Aug 19 2020

다음과 같은 상황 :

  • STS
  • 자바
  • 메이븐

머신 원

workspace-01

Maven을 사용하는 Java 앱은 단일 모듈을 기반으로 합니다. mvn install리포지토리에 설치 ( )하고 master-project.jar다른 Machine에 있는 파일을 설치하여 다른 프로젝트에 사용합니다.

<dependency>
  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1.SNAPSHOT</version>
</dependency>

여기까지 모두 잘 작동합니다.

workspace-02

앱이 성장했고 다른 작업 공간에서 앱이 다중 모듈 과 함께 작동하도록 마이그레이션되었습니다.

단순화를 위해 다음 구조를 가정 해 보겠습니다.

master-project (<packaging>pom</packaging>)
alpha (<packaging>jar</packaging>)
beta (<packaging>jar</packaging>)
numbers (<packaging>pom</packaging>)
   one (<packaging>jar</packaging>)
   two (<packaging>jar</packaging>)
countries (<packaging>pom</packaging>)
   Europe (<packaging>pom</packaging>)
      France (<packaging>jar</packaging>)
      Italy (<packaging>jar</packaging>)
   AmericaLatina (<packaging>pom</packaging>)
      Peru (<packaging>jar</packaging>)
      Argentina (<packaging>jar</packaging>)

이 모든 모듈을 컴파일 할 수 있습니다. 따라서 성공을 구축하십시오

이제 목표는 master-project.jar내부 jars 방법을 하위 모듈을 포함하여 동일한 파일을 생성하는 것입니다 .

조사 후 해결책은 다음과 같습니다. maven-shade-plugin

  • maven-shade-plugin은 무엇을 위해 사용되며 Java 패키지를 재배치하려는 이유는 무엇입니까?

다음 링크 및 기타 소스를 참조하는 방법을 사용하여 다음 구성 (일부)이 있습니다.

  • Maven 다중 모듈 패키지에서 집계로 JAR 파일 만들기

따라서:

  <modelVersion>4.0.0</modelVersion>
  <packaging>pom</packaging>  <--- it is the main or root pom.xml file

  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <properties>
    ....
  </properties>

  <dependencies>
    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-all</artifactId>
        <version>${hazelcast.version}</version>
        <scope>provided</scope> <!-- Otherwise each uber jar within each submodule is 11.6MB -->
    </dependency>
  </dependencies>

  <modules>
    <module>...</module>
    ...
  </modules>

  <build>
    <plugins>
      ....
      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <executions>
                <execution>
                    <id>create-fat-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                            <includes>
                                <include>com.manuel.jordan</include>
                            </includes>
                        </artifactSet>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

현재 구성에서는 다음이 발생합니다.

target디렉토리 내의 각 모듈에 대해 :

  • 와 함께 파일을 <packaging>pom</packaging>생성 .pom합니다.
  • 함께 <packaging>jar</packaging>두 생성 .jar파일 서브 모듈 자체의 하나와 위버 항아리 다른 (예, 각 모듈에 대한)

목표 : 다음과 같은 것을 생성하기 위해 추가 또는 누락 된 구성은 무엇입니까?

master-project.jar containing
 module1.jar
 module2.jar
 ...
 module3.jar

각각 module#동일한 <groupId>com.manuel.jordan</groupId>선언 이있는 곳 에서 내가 선언 한 이유입니다.

<configuration>
   <artifactSet>
      <includes>
         <include>com.manuel.jordan</include>
      </includes>
   </artifactSet>
</configuration>

그리고 루트 / 메인 pom.xml파일에<packaging>pom</packaging>

따라서 목표는 다른 기계에있는 다른 프로젝트가 평화를 유지하는 것입니다.

<dependency>
  <groupId>com.manuel.jordan</groupId>
  <artifactId>master-project</artifactId>
  <version>0.0.1.SNAPSHOT</version>
</dependency>

따라서 master-project프로젝트가 단일 모듈 인지 다중 모듈 인지 는 중요하지 않습니다.

답변

1 CésarAlves Sep 21 2020 at 23:43

다른 모듈에 대한 종속성으로 마스터 프로젝트 아래에 패키징 jar 모듈을 만들고 거기에만 음영 플러그인 구성을 포함 할 수 있습니다.