我有一个多模块maven项目(比如project-xxx)。可以说它由5个模块组成:
project-xxx (war)
--> module-1 (jar)
--> module-2 (jar)
--> module-3 (jar)
--> module-4 (jar)
--> module-5 (jar)
构建maven项目时,会生成war
文件,并且它还包含5个模块的jar文件。
现在,出于不同的目的(即部署到分布式缓存,所以我们可以从命令行运行查询),我想生成一个单独的“jar”文件,其中包含来自所有模块的java类。我知道生成多个工件是违反maven的理念而我在SO上读到这个blog post和few other questions。
但是创建这个单个jar文件会大大简化我项目中的其他一些事情。生成这个jar文件的最佳方法是什么?
答案 0 :(得分:1)
我认为您应该考虑引入第一个单独的配置文件,以便profile1包含配置以产生适当的war包装。 Profile2可以包含使用maven-shade-plugin的配置,以便从现有模块中创建UBER jar。剖析是一种非常干净且专注于分解不同问题的方法。
对于maven个人资料,请参阅here。对于maven-shade-plugin,请参阅here。
希望有所帮助。
答案 1 :(得分:1)
我非常非常支持每个Maven项目约定的一个工件。话虽如此,如果您需要包含所有模块的所有类的单个工件,那么请创建一个专用的单个项目来执行此操作:
$res.='<tr><td>'.$string.'</td><td><input type="checkbox" id="'.$id.'" onchange="addClasse(\''.$id.'\')"></td></tr>';
此示例项目依赖于每个模块,然后使用<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>your-group-id</groupId>
<artifactId>one-jar-to-rule-them-all</artifactId>
<version>your-version</version>
<dependencies>
<dependency>
<groupId>your-group-id</groupId>
<artifactId>module-1</artifactId>
<version>your-version</version>
</dependency>
.
.
.
<dependency>
<groupId>your-group-id</groupId>
<artifactId>module-5</artifactId>
<version>your-version</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<!--
This restricts the jar to classes from your group;
you may or may not want to do this.
-->
<artifactSet>
<includes>
<include>your-group-id</include>
</includes>
</artifactSet>
<createDependencyReducedPom>true</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
将所有这些模块组合到一个jar工件中。您还可以将其设为父maven-shade-plugin
的子模块,以便它由反应堆构建。这样,你可以同时拥有war和uber jar,但仍然保持标准Maven构建的模块性。