Java 在maven中仅使用依赖项构建胖jar
我在java项目中使用maven shade插件 我有一个名为Java 在maven中仅使用依赖项构建胖jar,java,maven,maven-shade-plugin,Java,Maven,Maven Shade Plugin,我在java项目中使用maven shade插件 我有一个名为core的模块,我想将其所有依赖项打包到一个jar中。我不想每次都创建一个又大又胖的jar,并将其与我的应用程序代码一起部署。我的应用程序jar的大小20 MB 在我的服务器上,我会像这样运行我的应用程序: java-cp core.lib.jar:core.jar myApp 当我更改应用程序代码时,我只需要将core.jar部署到我的服务器上,当我更改依赖项时,我只需要上传core.lib.jar(这非常罕见) 关于如何使用jav
core
的模块,我想将其所有依赖项打包到一个jar中。我不想每次都创建一个又大又胖的jar,并将其与我的应用程序代码一起部署。我的应用程序jar的大小<1 MB,但依赖项>20 MB
在我的服务器上,我会像这样运行我的应用程序:
java-cp core.lib.jar:core.jar myApp
当我更改应用程序代码时,我只需要将core.jar
部署到我的服务器上,当我更改依赖项时,我只需要上传core.lib.jar
(这非常罕见)
关于如何使用java源代码构建胖jar,有很多文档,但我想将它们排除在外,并独立地将其交付给服务器
有两个maven插件用于构建胖罐子:assembly和shade。我想坚持用阴影
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.3</version>
<executions>
<execution>
<phase>none</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>core</exclude>
</excludes>
</artifactSet>
</configuration>
</execution>
</executions>
</plugin>
org.apache.maven.plugins
maven阴影插件
3.2.3
没有一个
阴凉处
核心
当我运行mvn-pl core shade:shade
时,我得到错误:core:未能创建着色工件,项目主工件不存在
我认为这个选择:
核心
将从工件中排除我的来源
我将phase
设置为none
,因为我不想在运行package
时创建胖jar。
我想运行mvn shade:shade
并更新了fat-jar
我不是maven或其插件方面的专家,因此非常感谢您的帮助:)我自己没有使用shade插件,因此无法提供任何实际指导,但您似乎需要一个多模块maven项目:
my project/pom.xml
可以是一个“多模块”聚合器:它应该具有pom
并具有以下功能:
<modules>
<module>app</module>
<module>core-lib</module>
</modules>
如果要同时构建应用程序库和核心库,请执行以下操作:
cd my-project
mvn package
您可以阅读有关多模块的信息,或者我需要在插件/配置下移动此块
<artifactSet>
<excludes>
<exclude>core</exclude>
</excludes>
</artifactSet>
核心
用于执行
块中
现在我可以运行
mvn-pl-core-shade:shade
,并拥有仅具有依赖项的胖jar:)Maven中所有类型项目的布局都是生产代码的src/main/java
<代码>src/test/java用于测试代码。。。遵守惯例。您的建议违反了应避免的配置范式惯例。@khmarbaise:是的,当然,这是一个打字错误-我已经修复了答案,谢谢您指出这一点。话虽如此,我想强调(主要是针对问过这个问题的Alexander)答案的主要“要点”是建议使用maven的多模块功能。感谢@MarkBramnik的建议!我已经使用了maven多模块特性。我已经有了一些模块,比如:core、app、server等等。我希望避免仅仅为了打包目的而创建模块,并且不要创建app-lib、server-lib、core-lib。通过使用maven汇编插件,您可以打包一个只包含依赖项的jar/zip和另一个包含应用程序代码的jar。
cd my-project
mvn package
<artifactSet>
<excludes>
<exclude>core</exclude>
</excludes>
</artifactSet>