如何在maven中使用或滥用工件分类器?

时间:2011-11-07 18:37:48

标签: maven-2 maven-3 pom.xml project-structure classification

我们目前正在尝试将使用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文档   以及打包的类文件。

5 个答案:

答案 0 :(得分:9)

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

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

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

如何使用分类器附加仲裁工件? - 这可以使用build-helper-maven-plugin完成。

答案 1 :(得分:5)

  

......我想知道如何利用它们对我有利......

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

如果您正在将项目移植到maven,请保持简单,只做必要的事情(首先),让所有事情都按照您的意愿运行。然后,在事情按照你想要的方式工作之后,你可以探索maven的更多高级功能来做很酷的事情。

这个答案基于你的问题听起来像“这个功能听起来很整洁,即使我不需要它,我怎么能用它?”有点问题。如果您需要此功能,请更新您的问题,并提供有关如何您正在考虑使用分类器功能的更多信息,我们将更加了解您的帮助。

答案 2 :(得分:4)

与Jesse Web的回答相反,了解分类器是一件好事,这样你就可以利用它们,除了移植到maven之外,还可以避免重构代码。我们在一两年前经历了同样的过程。以前我们在一个代码库中拥有所有内容,并与ant一起构建。在迁移到maven时,我们还发现需要将各种组件分解为他们自己的maven项目。其中一些项目实际上是库,但有一些Web资源(jsp,js,图像等)。最终结果是我们使用分类器“web-resources”和类型“war”(用作叠加层)创建了一个附加工件(如@Male所述)和Web资源。这是当时,并且在更好地理解了maven之后仍然可以实现移植旧的耦合项目的最佳解决方案。我们最终想要分离出这些网络资源,因为它们不属于这个库,但至少它可以作为一个单独的任务完成。

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

如果要将相同工件的不同版本部署到存储库,则可以使用分类器。

这是一个用例:

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

例如,命令:

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。