什么是Maven构件?

389

什么是构件,为什么Maven需要它?


5
这里有关于Maven概念的更多信息:http://tshikatshikaaa.blogspot.nl/2012/05/introduction-to-maven-concepts-crash.html - Jérôme Verstrynge
1
顺便提一下,您可以查看官方的Apache Maven词汇表以了解Artifact的定义。 - informatik01
1
这些答案都不完整。你可以通过浏览Maven仓库来看到这一点。一个artifact显然是一个满足某些约束条件的目录,例如它必须包含一个名为maven-metadata.xml和一个名为<artifactId>-<version>.pom的文件。这两个文件都有一些未记录的模式和语义。 - jameshfisher
10个回答

355
一个artifact是一个文件,通常是JAR格式,在Maven仓库中进行部署。
Maven构建会产生一个或多个artifact,例如编译的JAR和“源代码”JAR。
每个artifact都有一个组ID(通常是反转的域名,如com.example.foo),一个artifact ID(只是一个名称)和一个版本字符串。三者共同唯一地标识该artifact。
项目的依赖项被指定为artifacts。

10
“artifact”基本上就是一个JAR文件吗?因此,joda time的JAR文件可以称为joda artifact,hibernate的JAR文件可以称为hibernate artifact等等? - david blaine
59
想一想什么是文物。埃及人创造了许多美妙的文物,例如陶器。但是,如果你手里拿着一个埃及碗,除非你在谈论它确实是一个文物(事实),否则你不会称其为“文物”。你会把它称作碗。他们用这个碗来吃东西。他们没有用文物来进食。 - cbmeeks
10
@cbmeeks 的意思是,“artifact” 不是一个“东西”的名字,而是构建过程中的一个“角色”。 只要 Maven 生成它并且赋予特殊的 Maven “坐标”来标识它,任何东西都可以被归类为“artifact”。 - Garret Wilson
如果我有一个名为"com.example:mylibrary:1.0.0"(groupId:artifactId:version)的东西,它由一个jar、一个pom和一个源jar组成,那么以下哪个是artifact:1.每个文件(pom、jar、源jar)都是单独的artifact;2.共享相同(groupId:artifactId:version)的文件集合构成一个单一的artifact;3.还是其他什么? - Laurence Gonsalves
你没有解释如何根据类名获取groupid和artifactid。我要点踩。 - Philip Rego
1
groupId/artifactId和类名之间并没有必然的关系。通常,groupId/artifactId将与Java包匹配。例如,名为com.example.myproject.MyClass的类可能在groupId com.example和artifactId myproject中找到,但这只是一种约定。Maven本身不强制执行此约定。一些存储库,例如Maven Central,会对新项目强制执行此约定。 - Stuart Sierra

136

在软件领域一般而言,“artifact”是指软件开发过程中产生的任何东西,包括与软件相关的文档或可执行文件。

在Maven术语中,artifact是maven构建的结果输出,通常为一个jarwar或其他可执行文件。在maven中,artifact由groupId、artifactId和version这个坐标系来标识。Maven使用groupIdartifactIdversion来识别构建和运行代码所需的依赖项(通常是其他jar文件)。


我的书上说:“这个在线应用程序的核心构件将是一个名为User的Java类,它将...” 这和你提到的构件一样吗? - david blaine
@davidblaine - 不完全准确,那个句子使用了一个更普遍的意义上的词语。 - Ken Liu

32

我知道这是一个古老的帖子,但我想添加一些细微差别。

有Maven构件、存储库管理器构件以及 Maven Artifact

Maven构件就像其他评论者/响应者所说的那样:它是通过构建Maven项目生成的东西。它可以是一个.jar文件,或者是一个.war文件,或者是一个.zip文件,或者是一个.dll文件,等等。

存储库管理器构件是由存储库管理器管理的一种东西。存储库管理器基本上是用于软件可执行文件和库的高性能命名服务。存储库管理器不关心其构件来自何方(也许它们来自Maven构建、本地文件、Ant构建或手工编译...)。

Maven Artifact 是一个Java类,表示被存储库管理器解引用为存储库管理器构件的“名称”类型。在这种意义下使用时,Artifact 只是由 groupIdartifactIdversionscopeclassifier 等部分组成的显赫名称。

把它们结合起来:

  • 您的Maven项目可能通过其<dependency>元素依赖于多个Artifact
  • Maven与存储库管理器交互,通过指示存储库管理器发送一些对应于内部 Artifact 的存储库管理器构件来解析这些Artifact文件。
  • 最后,在解析后,Maven会构建您的项目并生成一个Maven构件。您可以选择通过使用任何工具将其“转换为”存储库管理器构件,并向存储库管理器发送足够的协调信息,以便其他人在请求存储库管理器时可以找到它。

希望这有所帮助。


1
+1 感谢您在旧帖子中提供新信息!请修正“repoository”这个错别字,尽管有时候“poo”可能是正确的词哈哈...每个人都说“artifact”就是实际的jar文件,更新您的答案以指出当使用例如mvn install时,人们正在尝试弄清楚要放入哪个条目。因此,完整的jar文件名是要输入到-DartifactId=YOUR_ARTIFACT_ID中的内容,对吗?包括版本和.jar的完整jar文件名?似乎这就是您所说的,但更明确的说明会对一些人有所帮助。其他答案也接近这个问题,但我认为您的最好。 - JimLohse

26

Maven将其构建组织为项目。

Maven中的artifact是由Maven项目生成的资源。每个Maven项目可以恰好有一个artifact,例如jar、war、ear等。 项目的配置文件"pom.xml"描述了如何构建该artifact,如何运行单元测试等。 通常,使用Maven构建的软件项目由许多构建artifact(例如jars)的Maven项目组成,这些artifact构成了产品。
例如:

Root-Project   // produces no artifact, simply triggers the build of the other projects
  App-Project  // The application, that uses the libraries
  Lib1-Project // A project that creates a library (jar)
  Lib2-Project // Another library
  Doc-Project  // A project that generates the user documentation from some resources

Maven 产物不仅局限于 Java 资源。您可以生成所需的任何资源,例如文档、项目站点、zip 归档、本地库等。

每个 Maven 项目都有一个唯一标识符,由 [groupId, artifactId, version] 组成。当一个 Maven 项目需要另一个项目的资源时,在其 pom.xml 中使用上述标识符配置依赖项。然后,当触发构建时,Maven 自动解析依赖关系。所需项目的产物随后从本地 repository(用户主目录中的简单目录)或从在您的 pom.xml 中指定的其他(远程)存储库加载。


22

问题:什么是Maven中的Artifact?
答案:Artifact 是一个JAR(WAR或EAR),但它也可能是其他类型的文件。每个Artifact都有:

  • 组ID(如com.your.package),
  • Artifact ID(只是名称),和
  • 版本字符串。
    三者共同唯一标识Artifact。

问题:为什么Maven需要它们?
答案:Maven 用于使它们在我们的应用程序中可用。


不错的回答,正如我在另一个答案中评论的那样,建议明确说明在运行mvn install时我们应该在-DartifactId=YOUR_ARTIFACT_ID中输入什么,这只是一个建议 :) - JimLohse
@JimLohse 谢谢,如果方便的话请随意添加 "edit" 标题 :) - VedantK

11

Maven将构建过程安排为一组构件。这些构件包括:

  1. 组成Maven本身的插件。
  2. 您的代码依赖的依赖项。
  3. 您的构建产生的可以被其他东西使用的任何东西。

这些构件存储在仓库中。


10

Artifact是指JAR文件或其他你存储在仓库中的文件。Maven会从仓库中获取这些文件并构建你的代码。


4
通常我们谈论Maven术语时会涉及到 Group Id、Artifact Id 和 Snapshot Version。
Group Id:项目组的身份标识。 Artifact Id:项目的身份标识。 Snapshot version:项目使用的版本。
Artifact 就是一些生成的文件,如 Jar、War、Ear 等等。
简单来说,Artifacts 就是打包文件。

1
通常,当你创建一个Java项目时,你想使用在其他Java项目中制作的功能。例如,如果你的项目想要发送一封电子邮件,你不需要为此创建所有必要的代码。你可以引入一个Java库来完成大部分工作。 Maven是一个构建工具,将帮助你完成多项任务。其中之一就是以自动化的方式(只需在XML文件中进行一些配置)将这些外部依赖项或工件引入到你的项目中。 当然,Maven还有更多细节,但对于你的问题,这就足够了。 当然,Maven也可以将你的项目构建为一个工件(通常是一个jar文件),可以在其他项目中使用或导入。
这个网站有几篇文章谈论Maven:

https://connected2know.com/programming/what-is-maven/

https://connected2know.com/programming/maven-configuration/


0

在编程中,artifact指的是项目可以使用或生产的一个元素。在Maven术语中,artifact是在Maven项目构建后生成的输出。它可以是例如jar、war或任何其他可执行文件。

此外,Maven artifacts包括五个关键元素,groupId、artifactId、version、packaging和classifier。这些是我们用来识别artifact的元素,被称为Maven coordinates。

请从这里阅读


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接