作为一个 Maven 新手,我想知道是否可以同时使用多个分类器;在我的情况下,它将用于在一次运行中生成不同的罐子。我使用这个命令来构建我的项目:
mvn -Dclassifier=bootstrap package
从逻辑上讲,我认为这是可能的:
mvn -Dclassifier=bootstrap,api package
我正在使用 Maven 3.0.4
作为一个 Maven 新手,我想知道是否可以同时使用多个分类器;在我的情况下,它将用于在一次运行中生成不同的罐子。我使用这个命令来构建我的项目:
mvn -Dclassifier=bootstrap package
从逻辑上讲,我认为这是可能的:
mvn -Dclassifier=bootstrap,api package
我正在使用 Maven 3.0.4
您的项目似乎可以重构为几个 Maven 所谓的“模块”。这涉及将代码拆分为单个目录树中的单独项目,其中最顶层通常是父或聚合器 POM,其中包含子项目目录名称<packaging>pom</packaging>
的列表。<modules/>
然后,我建议将 API 接口/异常/whatnot 放入带有自己的 pom.xml 的 api/ 子目录中,并将引导类放入带有自己的 pom.xml 的 bootstrap/ 子目录中。然后顶级 pom.xml 将列出这样的模块:
<modules>
<module>api</module>
<module>bootstrap</module>
</module>
一旦你重构了项目,你可能想要从 bootstrap 模块添加一个依赖到 api 模块,因为我猜 bootstrap 将依赖于接口/等。从 api。
现在,您应该能够进入目录结构的顶层并简单地调用:
mvn clean install
这种方法很好,因为它迫使您考虑代码中如何支持不同的用例,并且它使类之间的依赖循环更难错过。
如果您想要一个示例,请查看我的一个 github 项目:Aprox。
注意:如果您有许多模块依赖于 api 模块,您可能希望在该部分的顶级 pom.xml 中列出它<dependencyManagement/>
,因此您可以在子模块依赖声明中省略版本(请参阅依赖机制简介) .
更新:遗留注意事项
如果您由于遗留原因等原因无法重构代码库,那么您基本上有两种选择:
在一个空的多模块结构中构建一系列 pom.xml 文件,并使用 build-helper-maven-plugin 以及源包含/排除来分割代码库并将类分配给单个源树中的不同模块。
也许使用像组装插件这样的插件来划分目标/类目录(${project.build.directory}
)并将类分配给不同的 jar。在这种情况下,每个程序集描述符都需要一个<id/>
,默认情况下,该值将成为该程序集 jar 的分类器。在这个计划下,“主要”jar 输出仍将是 Maven 构建创建的单体。如果您不想要这个,您可以使用单独执行的程序集插件,并在配置中使用<appendAssemblyId>false</appendAssemblyId>
. 如果该程序集的输出是 jar,那么它将有效地替换 jar 插件的旧输出。如果您决定采用这种方法,您可能需要阅读程序集插件文档以尽可能多地了解不同的示例。
另外,我应该注意到,在这两种情况下,您都会被困在使用 pom 中的一组配置文件来操作生成的事物列表,以便打开/关闭构建的不同部分。我强烈建议制作默认的、不合格的构建版本,它可以生成所有内容。这使得诸如发布插件之类的东西更有可能适当地捕获您想要发布的所有内容,以及升级版本等。
当你不能一次重构代码库时,这些解决方案通常是我提倡的迁移步骤。当从诸如从单个源代码树生成多个 jar 的 Ant 构建迁移时,它们特别有用。