如何使用 Maven 插件从多个 jar 中创建一个 .jar

How to create a .jar out of multiple jars using Maven Plugin

我有一个项目,其中有多个 .jar 文件。要将其添加为依赖项,我需要将所有这些罐子变成一个大罐子。到目前为止我已经来了:

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>mainProjects</groupId>
      <artifactId>mainProjects.master</artifactId>
      <relativePath>../pom.xml</relativePath>
      <version>1.0.0-SNAPSHOT</version>
   </parent>
   <groupId>mainProjects</groupId>
   <artifactId>sampleModule1</artifactId>
   <name>sampleModule1</name>
   <version>1.0.0.qualifier</version>
   <build>
    <plugins>
     <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <artifactSet>
                    <includes>
                        <include>Sample1.jar</include>
                        <include>Sample2.jar</include>
                     </includes>
                    </artifactSet>
                    <finalName>${project.artifactId}-${project.version}-final</finalName>
                    <outputDirectory>${project.artifactId}/build</outputDirectory>
                    <shadedArtifactAttached>false</shadedArtifactAttached>
                </configuration>
            </execution>
        </executions>
    </plugin>
    </plugins>
</build>
</project>

这会创建最终的 jar,但是,里面没有其他 jar(sample1.jar 和 sample2.jar)中应该有的内容。我查看了插件的文档,但是他们所做的只是通过 class 文件而不是 jars 来完成。所以我不知道以后怎么办了。

有什么想法吗?

更新:

所以为了说清楚,特此分享一下我的项目结构:

 +- mainProjects
 |   +- pom.xml
 |   +- mainProject1
 |   |  +- pom.xml
 |   |  +- src
 |   +- mainProject2 
 |   |  +- pom.xml
 |   |  +- src   
 |   +- group1
 |   |  +- pom.xml  
 |   |  +- sampleModule1
 |   |  | +- pom.xml  
 |   |  | +- build
 |   |  | +- sample1.jar
 |   |  | +- sample2.jar
 |   |  | +- sample3.jar
 |   |  | +- sample4.jar
 |   |  | +- sample5.jar
 |   |  | +- sample6.jar
 |   |  +- sampleModule2
 |   |  | +- pom.xml
 |   |  | +- src

现在,我希望能够使用 sampleModule1 作为 mainProject1pom.xml 中的依赖项作为 jar,如下所示:

      <dependency>
         <groupId>group1</groupId>
         <artifactId>sampleModule1</artifactId>
         <version>1.0.0.qualifier</version>
         <scope>system</scope>
         <systemPath>sampleModule1/build/${project.artifactId}-${project.version}-final.jar</systemPath>
   </dependency>

为了实现这一点,我需要将所有的jar编译成一个jar,这样我就可以使用一个systemPath来添加它。我发现 this 显示了如何将多个文件合并为一个文件的示例。但是,在示例中,它们不是罐子,而是 classes 和其他。现在在这里,我正在尝试实现相同的目标,但只有罐子。

有两种方法可以解决您的问题!如果你只想将文件添加到你的 jar 中,你可以使用 resources 标签来添加它们

<build>
    <resources>
        <resource>
            <filtering>false</filtering>
            <directory>lib</directory>
            <includes>
                <include>*.jar</include>
            </includes>
        </resource>
    </resources>
</build>

这会将您 lib 文件夹中的所有 jar 文件放入主 jar。根文件夹是您从中调用相应 pom.xml 的文件夹。有了这个,您可以将任意文件添加到您的 jar 中。 complete syntax reference 看这里。

另一种方法也许是最方便的方法是使用 maven-shade-plugin 这允许您将几乎所有内容复制到最终 jar 中。

<?xml version="1.0" encoding="UTF-8"?>
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>2.4.3</version>
   <executions>
      <execution>
         <phase>package</phase>
         <goals>
            <goal>shade</goal>
         </goals>
         <configuration>
            <artifactSet>
               <includes>
                  <include>groupid:artifactid_a</include>
                  <include>groupid:artifactid_b</include>
               </includes>
            </artifactSet>
            <filters>
               <filter>
                  <artifact>*:*</artifact>
                  <includes>
                     <include>resources/*.png</include>
                  </includes>
               </filter>
            </filters>
         </configuration>
      </execution>
   </executions>
</plugin>

artifactSet 部分允许您从本地复制中引用 jar,只需提及它们的 groupidartifactid

这会将提到的工件(来自本地复制)的 class 文件、manifest 等内容以及文件夹结构包含到您的 jar 中。

如果你想将其他任意文件包含到你的 jar 中,你可以使用插件的 filter 标签,它允许你直接指定文件和文件模式。 complete syntax reference 看这里。

P.S.: 如果你想排除某些文件,你可以用 exclude 标签替换 include 标签 ;-)