【发布时间】:2019-10-10 08:10:48
【问题描述】:
我目前正在尝试将一个多应用项目从 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)。
- 使用它们的依赖项构建多个应用程序(不是全部),而无需多次构建依赖项。
【问题讨论】:
-
只构建所有应用程序(而忘记那些您不需要的应用程序)有什么害处?
-
@JFMeier 项目很大,构建所有应用程序需要很长时间。如果我只对
app1A进行更改,则没有理由构建除lib1、lib1A和app1A之外的任何东西。构建时间会大大缩短。 -
您可以使用
-am和-pl选项来使用您需要的所有库构建项目的一部分,但是您很容易进入版本地狱,因为您的模块启动有不同的版本号,其中的一部分有时会增加。 -
@JFMeier “版本地狱”是什么意思?就我而言,所有模块总是需要使用所有库的最新版本。
-
假设你有一个简单的结构,比如 app1、app2 和 lib。 app1 和 app2 都依赖于 lib。一开始,所有人的 POM 中都有
1.0.0-SNAPSHOT版本。现在,您从 app1 及其依赖库构建一个版本。您将它们构建为版本1.0.0。之后,您(或 maven 发布插件)将两个模块 POM 中的版本更改为1.0.1-SNAPSHOT。现在您还需要更新 app2 的 POM 以引用 lib 的1.0.1-SNAPSHOT。不过,app2 的 POM 中的版本是1.0.0-SNAPSHOT。因此,您的模块版本开始出现分歧。