>我目前正在尝试将多应用程序项目从Ant
迁移到Maven
。
目前,该项目由多个包组成,创建某种依赖树,没有循环依赖关系。这棵树的叶子是"应用程序"包,包含一个Main
。中间节点是"库"包,由其他库"包"或"应用程序"包使用。
允许节点"一起增长"到单个节点或叶子。 我想出,这些包可能应该分组到 maven 模块中,我现在有一个类似于这样的结构:
root
- lib1
- lib1A (depends on lib1)
- lib1B (depends on lib1)
- app1A (depends on lib1A)
- lib2 (depends on lib1B)
- lib2A (depends on lib2)
- lib2B (depends on lib2)
- app2 (depends on lib2A and lib2B)
- lib3 (depends on lib2A and lib2B)
- app3A (depends on lib3)
- app3B (depends on lib3)
基本上,一个库和一个应用程序可以依赖于一个或多个其他库。
现在,我希望能够自己构建每个应用程序,并为其创建一个可执行的jar。
我现在尝试这样做的方式如下:
- 配置每个
app
的pom.xml
,以使用maven-assembly-plugin
创建可执行 JAR。 - 为特定应用构建所需的每个模块。
- 构建应用程序模块,这将产生一个可执行的 jar。
因此,为app2
而构建将构建lib1
,lib1A
和lib1B
,lib2
,lib2A
和lib2B
,最后app2
。
但是,为了自动化构建,我需要为每个应用程序创建一个构建脚本,该脚本负责构建所有需要的依赖项,maven 应该已经自己完成了。
此外,如果我想一次构建多个应用程序,我需要多次构建所有库,或者自己跟踪已经构建的模块。
由于我是 maven 的新手,我不确定这是否是管理这样一个多应用程序项目的正确方法。
因此,我正在寻求有关如何正确管理此用例的一些建议。
编辑:澄清我希望能够做什么:
- 使用其依赖项构建单个应用程序, 无需构建所有应用程序(在父 POM 上运行 Maven(。
- 使用依赖项生成多个应用(不是全部(,而无需多次生成依赖项。
如果您在相应的POM中定义依赖项并构建整个项目(在根级别(,则Maven会自动按拓扑顺序对模块进行排序,这意味着构建每个模块一次,并且一切都以正确的顺序完成。
我现在使用父项目,它定义了 maven 版本、通用依赖项和通用插件配置。
父项目还在module
-tag 中定义其子模块。
每个子模块都引用此父项目并使用相同的版本。
为了构建应用程序,我正在使用-pl
和-am
标志在父项目中运行 maven,如本评论中所述。-pl
标志告诉 maven 只构建列出的模块,而不是构建整个项目。-am
标志告诉 maven 也构建所需的依赖项。
示例:给定以下结构:
parent
---- lib1
---- lib1A (depends on lib1)
---- lib1B (depends on lib1)
---- lib2 (depends on lib1B)
---- lib2A (depends on lib2)
---- lib2B (depends on lib2)
---- app1A (depends on lib1A)
---- app2A (depends on lib2A)
---- app2B (depends on lib2B)
执行mvn clean install -pl app1A,app2A -am
将构建除app2B
和lib2B
之外的所有模块。
此外,app1A
和app2A
使用的模块lib1
只会构建一次。
通常,您希望独立地对每个模块进行版本控制,但在我们的情况下,这将带来巨大的努力,因为我们有很多模块相互构建。"最低"模块(示例中lib1
(中的微小更改会导致几乎每个模块的更改。
因此,在这种情况下,我们需要增加每个版本号并更新所有模块中所有引用的依赖项。
相反,我们决定始终重建所有依赖项,从而生成始终最新的 Jar。这就是为什么我们只管理父项目中的 maven 版本。
我认为使用 maven多模块,您只需要导航到要构建的模块,然后从那里运行 maven 命令。Maven 将自动构建具有关联依赖项的模块,而无需构建不必要的模块。
编辑:原来的答案不正确,做了一些测试后,我发现以下内容应该有帮助: Maven 模块 + 构建单个特定模块 你只需要在从父级构建特殊模块时添加 -pl 和 -am 标志。