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

时间:2016-07-01 09:49:33

标签: maven jar maven-plugin maven-shade-plugin

我有一个项目,里面有多个.jar文件。要将此作为依赖项添加,我需要将所有这些jar变成一个大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)的内容。我已经查看了插件的文档,但他们所做的只是通过类文件而不是jar来完成。所以我不知道从现在开始如何继续。

有什么想法吗?

更新

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

 +- 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用作pom.xml mainProject1作为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显示了如何将多个文件合并为一个的示例。但是,在这个例子中,它们不是罐子,而是类和其他。现在,我正在努力实现同样的目标,但只有罐子。

1 个答案:

答案 0 :(得分:1)

有两种方法可以解决您的问题!如果您只想将文件添加到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部分允许您通过提及他们的groupidartifactid

来引用您当地复制品中的jar

这将包括所提及的工件(从您当地的复制品)到您的jar中的class文件,manifest等内容以及文件夹结构。

如果你想在你的jar中包含其他任意文件,你可以使用插件的filter标签,它允许你直接指定文件和文件模式。对于complete syntax reference,请查看此处。

P.S。:如果您要排除某些文件,可以用include标记替换exclude标记; - )