当前位置: 首页 > 知识库问答 >
问题:

在maven中只使用依赖项构建fat jar

张承颜
2023-03-14

在我的java项目中使用maven-shade-plugin

我有一个名为core的模块,我希望将它的所有依赖项打包到一个JAR中。我不想每次都创建fat big jar,并将其与应用程序代码一起部署。我的应用程序jar的大小<1 MB,但依赖性>20 MB

在我的服务器上,我将运行我的应用程序,如下所示:

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:创建阴影项目失败,项目主项目不存在

我不是maven或其插件的专家,因此非常感谢任何帮助:)

共有1个答案

马飞
2023-03-14

我自己还没有使用过shade插件,所以我不能提供任何实际的指导,但是看起来您需要一个多模块的maven项目:

  1. 重构项目(移动文件夹)如下所示:
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

my-project/pom.xml可以是一个“多模块”聚合器:它应该具有 POM 并具有以下功能:

<modules>
  <module>app</module>
  <module>core-lib</module>
</modules>

core-lib模块将在其pom.xml中包含shade/assembly插件的定义,该模块将负责创建“胖罐子”。在dependences部分中,它将列出您必须“很少”更改的所有第三方依赖项/代码(在您的例子中,是带有20 mb工件的代码)。

如果需要,“app”模块可以依赖于“core-lib”模块,这样应用程序就可以访问库中的类。

所以您通常的工作流程是:

cd my-project/app
mvn package
cd my-project
mvn package

您可以在此处或此处阅读多个模块

 类似资料:
  • 根据JUnit新发布的V.5.2,现在有一个BOM: JUnit BOM:为了使用Maven或Gradle简化依赖性管理,现在在org.JUnit:jUnit-BOM:5.2.0 Maven坐标下提供了一个物料清单POM。 但是有了这个IntelliJ IDEA(v.2018.1.3Ultimate x64,Maven v.3.5.3,target JDK 10.0.1)似乎不知道标记是什么,也不

  • 问题内容: 我已经在互联网上搜索了很长一段时间,但无法弄清楚如何配置Maven-war插件或类似的东西,以便系统依赖项包含在内置战争中(WEB-INF / lib文件夹) 在jar-build的情况下,我使用maven依赖插件: 但是我不明白在打仗的情况下该怎么办。我试过使用maven-war插件,但是在构建中不包括系统依赖项。 [更新] 我有以下类型的行为: 在我的POM中,构建战争时,这些依赖

  • 问题内容: 我想在“常规” Maven 3构建(例如JAR或WAR打包)中使用来自远程Eclipse p2存储库的依赖项- 所有这些都无需将p2存储库转换为本地Maven存储库(这是osgi-to-maven2和m4e似乎可以)。 理想情况下,我只使用http://maven.eclipse.org/nexus/,但这还不包含很多捆绑软件。 使用Maven的systemPath不算在内! 问题答案

  • 问题内容: 如何获取我拥有的jar文件并将其添加到Maven 2的依赖系统中?我将成为此依赖项的维护者,并且我的代码需要在类路径中使用此jar,以便对其进行编译。 问题答案: 您必须分两步执行此操作: 1.给您的JAR一个groupId,artifactId和版本,然后将其添加到您的存储库中。 如果您没有内部存储库,而只是试图将JAR添加到本地存储库,则可以使用任意groupId / artifa

  • 我有一个使用Spring的项目。它使用的是3.1.1版本,但是,由于某些原因,我真的不知道,有些spring工件与两个不同的版本是重复的。我在项目中的所有pom.xml文件中查找这些依赖项。我还使用dependecy插件来找出那些依赖项包含在哪里。 这里有输出的提取 据我所知,这意味着包含在中。 更新:似乎当我评论下一段代码时,罐子不包括在战争中。

  • 我有一个包含多个子项目的根项目。最初,我们将这些项目作为独立的Maven项目保留,但我意识到Gradle更适合我使用。但是对于其中一个子项目,我们宁可不将其转换为Gradle项目,而将其保留为Maven项目。 root/build.gradle root/common.gradle root/api/pom.xml