gpt4 book ai didi

java - 了解 Maven 依赖关系和组装

转载 作者:行者123 更新时间:2023-11-30 01:57:47 25 4
gpt4 key购买 nike

我对 Maven 没有太多经验,它的编译和打包逻辑让我很困惑。

我有一些依赖项声明为:

<dependency>
<groupId>com.dependency_group</groupId>
<artifactId>dependency_1</artifactId>
<version>1.0.0</version>
</dependency>


<dependency>
<groupId>com.dependency_group</groupId>
<artifactId>dependency_2</artifactId>
<version>1.0.0</version>
<scope>provided</scope>
</dependency>

据我了解,dependency_1 将作为我的 jar 附带的内容添加到我的程序的类路径中,而 dependency_2 另一方面,将作为系统运行时在部署时提供的内容添加到类路径中。

然后我运行 Maven 的 package 目标,我的代码中没有包含任何依赖项(我正在使用 shade 插件,但即使没有它也没有任何变化) .

我预计,当某些依赖项设置为 compile scope 时,它将与我编译的代码一起导出,因为 AFAICS,设置类路径说 a 是没有意义的依赖项将与我的代码一起出现,而 Maven 只是不将依赖项与它一起打包。在我看来,Maven 似乎没有遵守它的契约(Contract)。

所以:

1 - 这背后的逻辑是什么?

2 - 我必须始终使用 Assembly 插件吗?

3 - 是否存在人们将依赖项定义为 compile 并且不希望将其打包在 jar 中的情况?

最佳答案

让我阐明一下这里的要点。基本上有两种 Java Artifact :

  1. 应用程序,即ears、wars、可执行jars
  2. 库,即用作其他 Artifact 依赖项的 jar。

对于应用程序来说,你的推理是完全有道理的。 Wars 和 Ears 会自动打包所有编译依赖项,并且您不需要任何程序集插件。对于库,您不需要将依赖项打包到库中。 Maven 处理传递依赖解析,如果您将一个 fat jar 放在类路径上,Maven 会感到困惑。

问题是,打包 jar 既可以是库,也可以是应用程序。如果您想要一个独立的应用程序,您需要告诉 Maven 打包所有内容,例如通过使用程序集插件或阴影插件。

关于java - 了解 Maven 依赖关系和组装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53798353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com