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

projectHelper.attachArtifact与project.getArtifact().setFile之间的差异

乜思淼
2023-03-14

我目前在使用命令行执行 MUnit 测试时遇到问题。

使用1.3版修复的mule-domain-maven-plugin 1.2版,我面临“重复项目工件分配”的问题。删除这行代码会在运行我的MUnit时导致FileNotFoundException mule-domain-config.xml 。

反编译代码后,我可以看到 1.2(适用于我的 MUnits)有 2 行代码:

this.projectHelper.attachArtifact(this.project, "zip", domain);
this.project.getArtifact().setFile(domain);

我看1.3只有这一行:

this.projectHelper.attachArtifact(this.project, "zip", domain);

有人知道< code > this . project helper . attach artifact(this . project," zip ",domain)的区别吗?和< code>this.project.getArtifact()。setFile(域);如何解决这个问题?

共有1个答案

和和裕
2023-03-14

差异与主工件和附加工件之间的差异相同。

首先,简单地说,工件是一个包含指向它的Maven坐标的对象(group-id/artifact-id/version/classifier/type)、一个解析它的存储库或解析它的位置,以及一个文件,它是要使用/下载/上传的实际具体文件。

除了POM项目,Maven项目生成一个主工件。这取决于它的包装;例如,一个打包为jar的项目将创建一个主JAR工件,其文件包含您项目的所有类,一个打包为war的项目将创建Web应用程序。此外,项目本身与其POM文件相关联;这意味着一个项目不仅有一个用于其主要工件的文件,而且还引用了创建它的POM文件。只有对于打包pom的项目,才不会创建主工件;这是因为这样的项目是父项目或聚合项目,包含要在多个项目之间共享的构建逻辑,但它们不产生主要的可交付成果。

除此之外,一个项目还有附加的或者次要的工件。它们对应于额外的工件,这些工件也是在项目的构建过程中生成的,并且通过它们的分类器和/或类型与主工件不同,当然,还有它们的实际文件。这些额外的工件与主工件一起安装和部署。例如,一个典型的打包< code>jar的项目还会将其Javadoc和源代码生成为jar文件,作为具有分类器< code>javadoc和< code>sources的附加工件。因此,打包< code>pom的项目只能有附加的工件,因为它没有主工件。最后,拥有一个没有附加工件的项目是完全允许的;只有主要的一个(或者在< code>pom项目中根本没有)将被部署。

在Maven插件中,所有这些考虑因素都归结为以下几点:

  • 项目的主工件通过project.getArtifact()作为artifact进行检索
  • project.getArtifact().setFile(…)设置项目主工件的实际文件。同样,对于打包<code>jar</code>的项目,这将是在磁盘上生成的实际jar文件。具体示例:MavenJAR插件就是这样做的
  • MavenProjectHelper组件用于将工件附加到项目projectHelper.attachArtifact(项目,“zip”,文件)会将ZIP类型的工件附加到给定的项目,没有分类器,并且其文件是给定的文件。使用分类器附加工件存在过载。具体示例:当Maven Assembly插件被配置为附加它生成的工件时,它就是这样做的
  • project.setFile(file)设置创建它的Maven项目的POM文件

为了举例,我们可以考虑在 Central的 org.mule.tools.maven 下部署的工件。在工件 id mule-maven-plugin 下,有多个文件:

  • mule-maven-plugin-2.1.jar是主工件文件,
  • 由POM文件mule-maven-plugin-2.1.pom
  • 创建
  • mule-maven-plugin-2.1-javadoc.jarmule-maven-plugin-2.1-sources.jar附加了它们各自的分类器。

作为第二个例子,考虑工件idmule-esb-maven-tools。部署的唯一文件(哈希文件除外)是mule-esb-maven-tools-1.1.pom。这是完全正常的,因为它是一个POM项目,所以它没有主工件(没有JAR或其他部署的);只有项目的POM文件,没有附加的工件。

 类似资料:
  • 在swift中似乎有两个相等运算符:双相等()和三相等(),这两者有什么区别?

  • 嗨,我对时区没有什么疑问: null 我在维基百科和许多相关网站上搜索过,但没有找到相关的解释

  • 什么时候只能使用其中的一个? 何时可以同时使用和如何选择一个?

  • 方法接受一个供应商函数接口,该接口本质上不接受任何参数,并返回。 在哪种情况下需要使用?如果您有一个方法为什么不直接执行而不执行? 似乎并不是要将lambda表达式的执行推迟到以后的某个时间或其他时间,那么这有什么意义呢?(我认为如果它返回一个更安全的会更有用,它的从不抛出并且总是返回true...但显然它不是,它只是返回,就像)。 是不是还有什么我遗漏的不同之处?

  • 我正在使用LWJGL3学习ThinMatrix的Opengl教程。代码中有很多和。他们是什么意思?这些是不同的opengl版本吗?以及为什么其中一些包含另一个对象没有的字段。与一样,GL15有字段,而没有,尽管它看起来是在之后。

  • 问题内容: 我知道这是一个包装类,它包装数字。今天,我看到了另一个主要区别: 我真奇怪! 因此,如果每次使用,我们都必须执行以下操作: 我无法解释为什么Double直接将比较做错了。请为我解释。 问题答案: 而在技术上两个不同的对象和运营商只比较引用。 更好,因为它比较值而不是引用。但是仍然不理想。直接比较浮点值应始终将一些误差(ε)考虑在内()。 注意: 这里的比较会产生,但是比较复杂(内部缓存

  • 、、和“”之间有什么区别? 虽然这是一个简单的问题,但我无法理解它们之间的基本区别。如果可能,请举一些简单的例子。