如何使用 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
作为 mainProject1
的 pom.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,只需提及它们的 groupid
和 artifactid
这会将提到的工件(来自本地复制)的 class
文件、manifest
等内容以及文件夹结构包含到您的 jar 中。
如果你想将其他任意文件包含到你的 jar 中,你可以使用插件的 filter
标签,它允许你直接指定文件和文件模式。 complete syntax reference 看这里。
P.S.: 如果你想排除某些文件,你可以用 exclude
标签替换 include
标签 ;-)
我有一个项目,其中有多个 .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
作为 mainProject1
的 pom.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,只需提及它们的 groupid
和 artifactid
这会将提到的工件(来自本地复制)的 class
文件、manifest
等内容以及文件夹结构包含到您的 jar 中。
如果你想将其他任意文件包含到你的 jar 中,你可以使用插件的 filter
标签,它允许你直接指定文件和文件模式。 complete syntax reference 看这里。
P.S.: 如果你想排除某些文件,你可以用 exclude
标签替换 include
标签 ;-)