我目前面临使用命令行执行MUnit测试的问题。
我面临着重复项目工件分配问题"使用版本1.3的mule-domain-maven-plugin that was fixed here 1.2版。删除这行代码会在运行我的MUnit时在mule-domain-config.xml上导致FileNotFoundException。
反编译代码后,我可以看到1.2(适用于我的MUnits),有两行代码:
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);
之间的区别以及如何解决此问题吗?
答案 0 :(得分:1)
差异与主要工件和附加工件之间的差异相同。
首先,简单地说,一个工件是一个包含指向它的Maven coordinates的对象(组ID /工件id /版本/分类器/类型),存储器在哪里解析它或它在哪里已解决,以及一个文件,这是要使用/下载/上传的实际具体文件。
除了POM项目,Maven项目会生成一个主要工件。这取决于它的包装;例如,打包为jar
的项目将创建一个主JAR工件,其文件包含项目的所有类,打包为war
的项目将创建Web应用程序。此外,项目本身与其POM文件相关联;这意味着一个项目,不仅有一个主要工件的文件,而且还引用了创建它的POM文件。仅适用于打包pom
的项目,不会创建主要工件;这是因为这些项目是父项目或聚合器项目,包含要在多个项目之间共享的构建逻辑,但它们不会产生主要的可交付项目。
除此之外,项目还附加或辅助了工件。它们对应于在项目构建期间也生成的其他工件,并且与它们的classifier和/或类型(当然,它们的实际文件)不同。这些附加工件与主工件一起安装和部署。例如,打包jar
的典型项目也会将其Javadoc和Sources生成为JAR文件,作为具有分类器javadoc
和sources
的附加工件。因此,打包pom
的项目只能附加工件,因为它没有主要工件。最后,完全允许一个没有附加工件的项目;
pom
项目的情况下根本没有)。
在Maven插件中,所有这些注意事项都归结为以下几点:
project.getArtifact()
检索项目的主要工件,Artifact
。project.getArtifact().setFile(...)
设置项目主要工件的实际文件。同样,对于打包jar
的项目,这将是在磁盘上生成的实际JAR文件。具体示例:it is what the Maven JAR plugin does。MavenProjectHelper
组件用于将工件附加到项目中。 projectHelper.attachArtifact(project, "zip", file);
会将ZIP类型的工件附加到给定项目,没有分类器,其文件是给定文件。附加工件with a classifier会出现重载。具体示例:it is what the Maven Assembly Plugin does当它被配置为附加它产生的工件时。project.setFile(file)
设置创建它的Maven项目的POM文件。举个例子,我们可以考虑部署的工件under org.mule.tools.maven
in Central。在工件标识mule-maven-plugin
下,有多个文件:
mule-maven-plugin-2.1.jar
是主要的工件文件,mule-maven-plugin-2.1.pom
创建,mule-maven-plugin-2.1-javadoc.jar
和mule-maven-plugin-2.1-sources.jar
附加了各自的分类器。作为第二个示例,请考虑工件标识mule-esb-maven-tools
。部署的唯一文件(散列文件除外)为mule-esb-maven-tools-1.1.pom
。这是完全正常的,因为它是一个POM项目,所以它没有主要工件(没有JAR或其他部署);那里只有项目的POM文件,没有附加工件。