Maven中的多个分类器

时间:2012-12-19 16:42:30

标签: maven-3

作为一名Maven新手,我想知道是否可以同时使用多个分类器;在我的情况下,它将在一次运行中生成不同的罐子。我使用此命令来构建我的项目:

mvn -Dclassifier=bootstrap package

从逻辑上讲,我认为这是可能的:

mvn -Dclassifier=bootstrap,api package

我正在使用Maven 3.0.4

1 个答案:

答案 0 :(得分:2)

您的项目似乎是重构Maven称之为“模块”的几个候选者。这涉及将代码拆分为单个目录树中的单独项目,其中最顶层通常是具有<packaging>pom</packaging>的父或聚合器POM以及包含子项目目录名称的<modules/>列表。

然后,我建议将API interfaces / exceptions / whatnot放入带有自己的pom.xml的api /子目录中,并将bootstrap类放入带有自己的pom.xml的bootstrap /子目录中。然后,顶级pom.xml将列出这样的模块:

<modules>
  <module>api</module>
  <module>bootstrap</module>
</module>

一旦你重构了项目,你可能想要从bootstrap模块添加一个依赖项到api模块,因为我猜测bootstrap将依赖于接口/等。来自api。

现在,您应该可以进入目录结构的顶层,只需调用:

mvn clean install

这种方法很好,因为它迫使您考虑代码中支持不同的用例,并且它使类之间的依赖循环更难以错过。

如果您想要一个示例,请查看我的一个github项目:Aprox

注意:如果您有许多依赖于api模块的模块,您可能希望将其列在<dependencyManagement/>部分的顶级pom.xml中,这样您就可以离开关闭子模块依赖声明中的版本(参见Introduction to the Dependency Mechanism)。

更新:传统注意事项

如果由于遗留原因等原因无法重构代码库,那么您基本上有两个选择:

  1. 在空的多模块结构中构造一系列pom.xml文件,并使用build-helper-maven-plugin和source includes / excludes来对代码库进行分段,并将类分配给不同的模块。单源树。

  2. 也许使用像程序集插件这样的插件来分割目标/类目录(${project.build.directory})并将类分配给不同的jar。在这种情况下,每个程序集描述符都需要<id/>,默认情况下,此值将成为该程序集jar的分类器。根据这个计划,“主”jar输出仍然是由Maven构建创建的单片输出。如果您不想这样做,可以单独执行程序集插件,并在配置中使用<appendAssemblyId>false</appendAssemblyId>。如果该程序集的输出是一个jar,那么它将有效地替换jar插件中的旧输出。如果您决定采用这种方法,您可能需要阅读程序集插件文档,以尽可能多地了解不同的示例。

  3. 另外,我应该注意到,在这两种情况下,你都会被操纵通过使用pom中的一组配置文件生成的事物列表,以打开/关闭构建的不同部分。我强烈建议制作一个产生一切的默认的,不合格的构建版本。这使得发布插件更容易捕获您想要发布的所有内容,以及适当的up-rev版本等。

    当您无法一次性重构代码库时,这些解决方案通常是我作为迁移步骤推广的。当从诸如Ant构建之类的东西迁移出来时,它们在单个源树中生成多个jar时非常有用。