16

我们目前正在尝试将使用 ant 构建的非常(非常)大的项目移植到 maven(同时也迁移到 svn)。正在探索重塑项目结构以最适合 Maven 范式的所有可能性。

现在更具体地说,我遇到了分类器,并想知道如何利用它们来发挥自己的优势,同时避免使用“分类器反模式”。

谢谢

来自:http ://maven.apache.org/pom.html

分类器:你可能偶尔会在坐标上找到第五个元素,那就是分类器。我们稍后会访问分类器,但现在知道这些类型的项目显示为 groupId:artifactId:packaging:classifier:version 就足够了。

分类器允许区分从相同 POM 构建但内容不同的工件。它是一些可选且任意的字符串——如果存在的话——被附加到工件名称之后,紧跟在版本号之后。作为这个元素的动机,例如,考虑一个项目,它提供了一个针对 JRE 1.5 的工件,但同时也提供了一个仍然支持 JRE 1.4 的工件。第一个工件可以配备分类器 jdk15,第二个工件配备 jdk14,以便客户端可以选择使用哪一个。

分类器的另一个常见用例是需要将辅助工件附加到项目的主要工件。如果您浏览 Maven 中央存储库,您会注意到分类器源和 javadoc 用于部署项目源代码和 API 文档以及打包的类文件。

4

5 回答 5

9

我认为正确的问题是How to use or abuse attached artifacts maven?因为基本上这就是引入分类器的原因 - 允许您发布附加的工件。

好吧,Maven 项目经常隐含地使用附加的工件,例如使用 maven-javadoc-plugin 或 maven-source-plugin。maven-javadoc-plugin 使用分类器发布包含生成文档的附加工件javadoc,而 maven-source-plugin 使用sources分类器发布源。

现在如何显式使用附加的工件?我使用附加的工件来发布利用 shell 脚本(start.sh 和 Co)。sql使用分类器或类似的东西在附加的工件中发布 SQL 脚本也是一个好主意。

你怎么能用你的分类器附加一个任意的工件?- 这可以通过 build-helper-maven-plugin 完成。

于 2013-12-31T15:10:35.550 回答
5

...我想知道如何利用它们来发挥我的优势...

不要使用它们。它们是可选的和任意的。

如果您正在将项目移植到 maven,请保持简单,并且只做必要的事情(起初)以使一切按您的意愿工作。然后,在事情按照你的意愿工作之后,你可以探索 maven 的更高级功能来做一些很酷的事情。

这个答案是基于你的问题听起来像“这个功能听起来很整洁,即使我不需要它,我怎么能使用它?” 一种问题。如果您需要此功能,请更新您的问题,并提供更多关于您如何考虑使用分类器功能的信息,我们都会更知情地为您提供帮助。

于 2011-11-07T19:09:08.350 回答
4

与 Jesse Web 的回答相反,学习分类器是很好的,这样您就可以利用它们并避免除了移植到 maven 之外还必须重构代码。一两年前我们经历了同样的过程。以前,我们将所有内容都放在一个代码库中,并与 ant 一起构建。在迁移到 maven 的过程中,我们还发现需要将各种组件分解到自己的 maven 项目中。其中一些项目实际上是库,但有一些网络资源(jsp、js、图像等)。最终结果是我们使用分类器“web-resources”和类型“war”(用作覆盖)创建了一个带有 Web 资源的附加工件(如 @Male 所述)。这是当时,并且在更好地理解 maven 之后仍然如此,这是移植旧的、耦合的项目的最佳解决方案。

通常,您希望避免附加工件。这通常表明应该创建一个单独的项目来构建该工件。我建议您在想要将工件附加到单独的分类器的任何时候都考虑这样做。

于 2014-11-07T15:15:39.090 回答
2

我使用分类器来定义主要人工制品的支持人工制品。

例如,我有 com.bar|foo-1.0.war 并有一些关联的配置称为 com.bar|foo-1.0-properties.zip

于 2012-11-13T13:00:13.257 回答
1

当您想要部署到存储库的同一工件的不同版本时,您可以使用分类器。

这是一个用例:

我将它们与 pom 中的属性结合使用。pom 具有可以通过命令行覆盖的默认值。不带选项运行使用默认属性值。如果我构建具有不同属性值的工件版本,我可以使用分类器将其部署到存储库。

例如,命令:

mvn -DmyProperty=specialValue package install:install-file -Dfile=target/my-ear.ear -DpomFile=my-ear/pom.xml -Dclassifier=specialVersion

构建具有特殊属性的耳朵工件版本,并使用分类器“specialVersion”将该工件部署到我的存储库中。

所以,我的仓库可以有 my-ear-1.0.0.ear 和 my-ear-1.0.0-specialVersion.ear。

于 2012-01-26T22:13:20.670 回答