我有一个项目,里面有多个.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显示了如何将多个文件合并为一个的示例。但是,在这个例子中,它们不是罐子,而是类和其他。现在,我正在努力实现同样的目标,但只有罐子。
答案 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
部分允许您通过提及他们的groupid
和artifactid
这将包括所提及的工件(从您当地的复制品)到您的jar中的class
文件,manifest
等内容以及文件夹结构。
如果你想在你的jar中包含其他任意文件,你可以使用插件的filter
标签,它允许你直接指定文件和文件模式。对于complete syntax reference,请查看此处。
P.S。:如果您要排除某些文件,可以用include
标记替换exclude
标记; - )