什么时候应该将 Maven 部署文件的 generatePom 设置为 false?

Fre*_*eit 4 java maven maven-deploy-plugin

我像这样调用 deploy-file 将一些 JAR 加载到我的公司存储库中:

mvn org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy-file \
  -Dfile=lib/SomeLib.jar \
  -DrepositoryId=mycompany-central \
  -Durl=http://myserver/artifactory/libs-release-local -DgeneratePom=false \
  -DgroupId=com.some.lib \
  -DartifactId=SomeLib \
  -Dversion=1.2.5.3 
Run Code Online (Sandbox Code Playgroud)

我设置generatePomfalse,我想生成或改变尽可能少的假设下。我正在加载的库碰巧是使用 maven 构建的,并且在META-INF.

问题:一般在什么情况下应该generatePom设置为false?在我的情况下应该generatePom设置为false

A_D*_*teo 5

pom.xml文件是传递依赖项所必需的。传递依赖项是在作为已部署工件的一部分可用dependencies.pom文件的部分(如果有)中定义的依赖项。

.pom文件本质上是原始pom.xml文件的副本,重命名以反映库名称(即artifactId-version.jar, then artifactId-version.pom)。

在解析依赖项时,maven 还将检查其.pom文件,并因此获取有关其依赖项的信息(然后成为传递依赖项)并为其构建(并获取)所需的依赖项图(即,对每个依赖项重新迭代相同的过程)以及每个声明的依赖项)。

来自官方Maven - 依赖机制介绍

通过从指定的远程存储库读取依赖项的项目文件来促进此功能。通常,这些项目的所有依赖项都会在您的项目中使用,项目从其父项或从其依赖项等继承的任何依赖项也是如此。

注意:粗体是我的。项目文件通常是pom.xml文件,*.pom一旦相关工件上传到 Maven 存储库(或安装到本地 Maven 缓存中),就会重命名为文件。

使用-DgeneratePom=false,因此我们应该pom.xml通过pomFile选项传递一个文件,否则(设置generatePomtrue)将自动生成一个新文件

如果没有通过参数提供,则为工件生成最小的 POM pomFiletrue如果本地存储库中还没有现有的 POM,则默认为。

自动生成的.pom文件几乎是空的(Maven 坐标(groupId、artifactId、version)但其中没有任何dependencies部分),因此 Maven 会将这个工件视为没有传递依赖项的库:它找不到任何东西,也无法猜测。

如果实际上不需要传递依赖,那仍然可以。否则,在另一个 Maven 项目中使用 is 作为依赖项时会发生编译(或运行时)错误。相反,如果工件被部署到构建存储中,那么传递依赖变得不那么重要,自动生成的 pom 仍然可以。


从你的评论:

生成的 pom 和使用从 JAR 中提取的 pom 之间有什么区别吗?

如上所述,自动生成的pom.xml文件与原始文件之间存在很大差异。但是这种差异本质上只有在目标工件将被另一个项目用作 maven 依赖项时才重要。pom.xml存储在下面的文件META-INF通常是原始文件的副本。

另外,如果我使用 JAR 中的 pom,deploy-file 会从文件中获取工件名称、groupId 和版本吗?

是的,如官方文档所指定:

groupId:要部署的工件的 GroupId。如果指定,则从 POM 文件中检索。 artifactId:要部署的工件的 ArtifactId。如果指定,则从 POM 文件中检索。 version:要部署的工件的版本。如果指定,则从 POM 文件中检索。

并且也由官方示例指定

请注意,groupId、artifactId、版本和包装信息是从给定的 pom 中自动检索的。