我的java项目中的use maven-shade-plugin
。
我有一个名为core
的模块,我想将它的所有依赖项打包到一个jar中。我不想每次都创建一个大罐子,并将其与应用程序代码一起部署。我的应用程序jar的大小<1MB,但依赖项>20毫巴
在我的服务器上,我会像一样运行我的应用程序
java -cp core.lib.jar:core.jar myApp
当我更改应用程序代码时,我只需要将core.jar
部署到我的服务器,而只有当我更改依赖关系时,我才需要上传core.lib.jar
(这是非常罕见的(。
有很多关于如何使用java源代码构建fat-jar的文档,但我想排除它们,并将其独立地交付给服务器。
有两个maven插件用于构建fat-jar: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>
当我运行mvn -pl core shade:shade
时,我得到错误:core: Failed to create shaded artifact, project main artifact does not exist
我认为这个选项:果心将从工件中排除我的来源。
我将phase
设置为none
,因为我不想在运行package
时创建fat jar。我想运行mvn shade:shade
并更新fat jar。
我不是maven或其插件方面的专家,因此非常感谢任何帮助:(
我自己还没有使用过shade插件,所以我无法提供任何实用的指导,但似乎你需要一个多模块的maven项目:
- 重构项目(移动文件夹(如下所示:
my-project
|__app
| |__src
| | |__main( (and all the production sources/resources inside)
| | |__test (all the tests/test resources inside)
| |__pom.xml
|__core-lib
| |__pom.xml
|__ pom.xml
CCD_ 12可以是";"多模块";聚合器:它应该有<packaging>pom</packaging>
,并具有以下内容:
<modules>
<module>app</module>
<module>core-lib</module>
</modules>
现在app
模块可以成为编写应用程序代码的地方。它会经常更改,但不会产生任何胖jar——只有一个普通jar,其中只有来自该模块的编译代码(在您的示例中,它将是1mb工件(。
CCD_ 15模块将是在其CCD_;胖罐子";。在dependences
部分中,它将列出您必须"很少"更改的所有第三方依赖项/代码(在您的案例中,是一个有20mb工件的依赖项(。
如果你需要;应用程序";模块可以依赖于";核心库";模块,以便应用程序可以访问库中的类。
所以你通常的工作流程是:
cd my-project/app
mvn package
如果您想同时构建应用程序库和核心库,那么:
cd my-project
mvn package
你可以在这里或这里阅读关于多模块
我需要在插件/配置下移动这个块
<artifactSet>
<excludes>
<exclude>core</exclude>
</excludes>
</artifactSet>
用于executions
块。
现在我可以运行mvn -pl core shade:shade
,并且只有依赖项的胖罐子:(