如何在多模块项目中配置Maven shade插件?

如何在多模块项目中配置Maven shade插件?

问题描述:

大家好!我一直试图使用Maven Shade插件获取jar,但我仍然没有获得成功:(

everyone! I have been trying to get jar using Maven Shade Plugin, but I still don't get a success :(

这是我的项目结构:

MainModule
  -Module1
    -src
    -pom.xml
  -Module2
    -src
    -pom.xml
  -pom.xml

Module1(pom.xml ):

Module1 (pom.xml):

<parent>
    <artifactId>MainModule</artifactId>
    <groupId>com.plugintest</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Module1</artifactId>

Module2(pom.xml):

Module2 (pom.xml):

<parent>
    <artifactId>MainModule</artifactId>
    <groupId>com.plugintest</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Module1</artifactId>

MainModule(pom.xml):

MainModule (pom.xml):

<groupId>com.plugintest</groupId>
<artifactId>MainModule</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
    <module>Module1</module>
    <module>Module2</module>
</modules>
<build>
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            </execution>
        </executions>
        </plugin>
    </plugins>
</build>

根据此代码,我得到2个jar文件(Module1-version.jar和Module2-version.jar )。但这不是我想要的。我希望获得1个jar文件(MainModule-version.jar),其中包含另一个(Module1和Module2)。

According this code I get 2 jar-files (Module1-version.jar and Module2-version.jar). But it is not what I want. I wish to get 1 jar file (MainModule-version.jar), wich would contain the other (Module1 and Module2).

请告诉我,为什么不这个Shade插件有效吗?

Please, tell me, why doesn't this Shade Plugin work?

MainModule 不应该生成一个jar文件。它只能生成... pom文件。它包含所有子模块共享的配置。这就是针对每个模块调用shade插件的原因。

You MainModule is not supposed to produce a jar file. It can produce only... pom files. It contains configuration shared across all it child modules. This is why the shade plugin is called against each modules.

相反,创建第三个模块。我们称之为 FinalModule 。此模块是 MainModule 的子元素。将整个< build> 节点从 MainModule pom.xml移至 FinalModule pom.xml。

Instead, create a third module. Let's call it FinalModule. This module is a child of MainModule. Move the whole <build> node from MainModule pom.xml to FinalModule pom.xml.

文件结构:


   MainModule
      -FinalModule
        -src
        -pom.xml
      -Module1
        -src
        -pom.xml
      -Module2
        -src
        -pom.xml
      -pom.xml

FinalModule pom.xml 如下所示:

FinalModule(pom.xml)

FinalModule (pom.xml)

<parent>
    <groupId>com.plugintest</groupId>
    <artifactId>MainModule</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
<artifactId>FinalModule</artifactId>

<dependencies>
    <dependency>
        <groupId>com.plugintest</groupId>
        <artifactId>Module1</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>com.plugintest</groupId>
        <artifactId>Module2</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.2</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

最后,你应该得到这样的结果:

In the end, you should get something like this:

[INFO] 
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ FinalModule ---
[INFO] Building jar: D:\workspaces\java\Parent\FinalModule\target\FinalModule-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-shade-plugin:2.2:shade (default) @ FinalModule ---
[INFO] Including my:Module1:jar:1.0-SNAPSHOT in the shaded jar.
[INFO] Including my:Module2:jar:1.0-SNAPSHOT in the shaded jar.
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing D:\workspaces\java\Parent\FinalModule\target\FinalModule-1.0-SNAPSHOT.jar with D:\workspaces\java\Parent\FinalModule\target\FinalModule-1.0-SNAPSHOT-shaded.jar
[INFO] Dependency-reduced POM written at: D:\workspaces\java\Parent\FinalModule\dependency-reduced-pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Parent ............................................ SUCCESS [0.016s]
[INFO] Module1 ........................................... SUCCESS [1.654s]
[INFO] Module2 ........................................... SUCCESS [0.343s]
[INFO] FinalModule ....................................... SUCCESS [0.953s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------