我目前在使用命令行执行 MUnit 测试时遇到问题。
我在使用 1.2 版的 mule-domain-maven-plugin 时面临“重复项目 Artifact 分配”的问题 that was fixed here与版本 1.3。删除这行代码会在运行我的 MUnit 时导致 mule-domain-config.xml 出现 FileNotFoundException。
反编译代码后,我可以看到 1.2(适用于我的 MUnit)有 2 行代码:
this.projectHelper.attachArtifact(this.project, "zip", domain);
this.project.getArtifact().setFile(domain);
我可以看到 1.3 只有这一行:
this.projectHelper.attachArtifact(this.project, "zip", domain);
有人知道 this.projectHelper.attachArtifact(this.project, "zip", domain);
和 this.project.getArtifact().setFile(domain); 之间的区别吗?
以及如何解决这个问题?
最佳答案
区别与主神器和附属神器的区别相同。
首先, Artifact 简单来说就是一个包含 Maven coordinates 的对象。指向它(组 ID/ Artifact ID/版本/分类器/类型),一个解决它或它被解决的存储库,以及一个文件,这是要使用/下载/上传的实际具体文件。
除 POM 项目外,Maven 项目会生成一个主 Artifact 。这取决于它的包装;例如一个包装为 jar
的项目将创建一个主 JAR Artifact ,其文件包含项目的所有类,以及一个打包为 war
的项目将创建网络应用程序。此外,项目本身与其 POM 文件相关联;这意味着一个项目不仅有一个用于其主要 Artifact 的文件,而且还具有对创建它的 POM 文件的引用。仅适用于包装项目pom
不会创建主要 Artifact ;这是因为此类项目是父项目或聚合项目,包含要在多个项目之间共享的构建逻辑,但它们不产生主要可交付成果。
除此之外,项目还有附加的或次要的 Artifact 。它们对应于在项目构建期间也会生成的附加 Artifact ,并且与主要 Artifact 的不同之处在于它们的 classifier。和/或类型,当然还有他们的实际文件。这些额外的 Artifact 与主要 Artifact 一起安装和部署。以打包的典型项目为例jar
还将生成其 Javadoc 和 Sources 作为 JAR 文件作为具有分类器 javadoc
的附加 Artifact 和 sources
.接下来就是一个打包的工程pom
只能有附属的神器,因为它没有主神器。最后,完全允许有一个没有附加 Artifact 的项目;只会部署主要的(如果是 pom
项目,则根本不会部署)。
在 Maven 插件中,所有这些考虑因素归结为以下几点:
- 使用
project.getArtifact()
检索项目的主要 Artifact , 作为Artifact
. -
project.getArtifact().setFile(...)
设置项目主要 Artifact 的实际文件。再次,对于一个项目的打包jar
,这将是在磁盘上生成的实际 JAR 文件。具体例子:it is what the Maven JAR plugin does . -
MavenProjectHelper
组件用于将 Artifact 附加到项目。projectHelper.attachArtifact(project, "zip", file);
会将 ZIP 类型的 Artifact 附加到给定项目,没有分类器,并且其文件是给定文件。存在附加 Artifact 的过载 with a classifier .具体例子:it is what the Maven Assembly Plugin does当它被配置为附加它产生的 Artifact 时。 -
project.setFile(file)
设置创建它的 Maven 项目的 POM 文件。
举个例子,我们可以考虑部署的 Artifact under org.mule.tools.maven
in Central .在神器id下 mule-maven-plugin
,有多个文件:
-
mule-maven-plugin-2.1.jar
是主要的 Artifact 文件, - 由 POM 文件创建
mule-maven-plugin-2.1.pom
, - 同时
mule-maven-plugin-2.1-javadoc.jar
和mule-maven-plugin-2.1-sources.jar
附有各自的分类器。
作为第二个例子,考虑 Artifact ID mule-esb-maven-tools
.部署的唯一文件(哈希文件除外)是 mule-esb-maven-tools-1.1.pom
.这是完全正常的,因为它是一个 POM 项目,所以它没有主要 Artifact (没有部署 JAR 或其他);只有项目的 POM 文件,没有附加的 Artifact 。
关于maven - projectHelper.attachArtifact 和 project.getArtifact().setFile 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40788902/