Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在maven中管理多应用程序项目?_Java_Maven_Module - Fatal编程技术网

Java 如何在maven中管理多应用程序项目?

Java 如何在maven中管理多应用程序项目?,java,maven,module,Java,Maven,Module,我目前正在尝试将一个多应用程序项目从Ant迁移到Maven。 目前,项目由多个包组成,创建某种依赖关系树,没有循环依赖关系。此树的叶子是应用程序包,包含一个主目录。中间节点是库包,由其他库包或应用程序包使用。 允许节点一起成长为单个节点或叶。 我发现,这些包可能应该被分组到maven模块中,现在我有了一个类似的结构: root - lib1 - lib1A (depends on lib1) - lib1B (depends on lib1) - app1A (d

我目前正在尝试将一个多应用程序项目从Ant迁移到Maven。 目前,项目由多个包组成,创建某种依赖关系树,没有循环依赖关系。此树的叶子是应用程序包,包含一个主目录。中间节点是库包,由其他库包或应用程序包使用。 允许节点一起成长为单个节点或叶。 我发现,这些包可能应该被分组到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。 我现在尝试的方法如下:

配置每个应用程序的pom.xml以使用maven assembly插件创建可执行jar。 为特定应用程序构建所需的每个模块。 构建应用程序模块,生成一个可执行的jar。 因此,app2的构建将构建lib1、lib1A和lib1B、lib2、lib2A和lib2B,最后是app2。 然而,为了自动化构建,我需要为每个应用程序创建一个构建脚本,它负责构建所有需要的依赖项,maven应该已经自己完成了。 此外,如果我想一次构建多个应用程序,我需要多次构建所有库,或者自己跟踪已经构建的模块。 由于我是maven的新手,我不确定这是否是管理这样一个多应用程序项目的正确方法。 因此,我想了解一些关于如何正确管理这个用例的建议

编辑: 为了澄清我希望能够做什么:

使用依赖项构建单个应用程序, 没有在父pom上构建所有运行maven的应用程序。 构建多个应用程序(并非所有应用程序都具有依赖关系),而不多次构建依赖关系。
如果您在各自的POM中定义依赖项并在根级别构建整个项目,那么Maven会自动按拓扑顺序对模块进行排序,这意味着只需构建一次每个模块,所有工作都会按正确的顺序进行。

我认为使用Maven multi module,您只需导航到要构建的模块,然后从那里运行maven命令。Maven将自动构建具有相关依赖项的模块,而无需构建不必要的模块

编辑:原来的答案不正确,在做了一些测试后,我发现以下内容应该是有帮助的:
从父级构建单独的模块时,只需添加-pl和-am标志。

我现在使用的是一个父项目,它定义了maven版本、公共依赖项和公共插件配置。 父项目还在模块标记中定义其子模块。 每个子模块都引用此父项目并使用相同的版本。 为了构建应用程序,我在父项目中运行maven,使用-pl和-am标志,如中所述。 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-plapp1a、app2A-am将构建除app2B和lib2B之外的所有模块。 此外,app1A和app2A使用的模块lib1只能构建一次

通常,您希望独立地对每个模块进行版本设置,但在我们的例子中,这将带来巨大的工作量,因为我们有许多模块构建在彼此之上。本例中最低模块lib1中的微小更改将导致几乎每个模块中的更改。 因此,在这种情况下,我们需要增加每个版本号,并更新所有模块中所有引用的依赖项。
相反,我们决定总是重建所有依赖项,从而得到一个总是最新的Jar。这就是为什么我们只在父项目中管理maven版本。

True,但我认为值得特别指出的是,root需要是一个maven父pom,将子项目定义为模块。我不确定问题中建议的结构中是否已经存在这种情况。@JFMeier这是正确的,但我希望能够只构建一个应用程序。构建所有应用程序需要更长的时间,而且并非总是必要的。因此,我正在寻找一种方法来构建单个应用程序,包括它们的模块,而不构建所有应用程序。我编辑了这个问题以澄清这一点。如果这是要求,那么你必须将每个应用程序提取到单独的存储库中,这样你就可以单独构建,并将LIB提取到单独的回购中……除此之外,为什么你需要构建单个应用程序?@khmarbaise,正如我所说,这是一个多应用程序项目,每个应用程序都独立于其他应用程序。它们只共享一些公共代码。我不知道你是否有一些Android开发的经验,但是你有所谓的应用模块和lib模块,应用模块用来创建APK,而l
ib模块用于共享代码。我想在maven中取得类似的成就,但这似乎不是真的。如果我从app1运行mvn clean package,而没有首先构建lib1,我会得到错误:找不到我的工件。测试:lib1:jar:0.0.1-Snapshot我再次进行了仔细检查,似乎你是对的,我以前手动使用过mvn clean安装,然后我可以在单个模块中运行“mvn clean package”,然后它将始终成功。我又做了一些研究,这似乎符合你的问题:这似乎是我的案例的正确解决方案。我目前正在为我们的案例验证这种方法,并将其作为解决方案。然后我认为现在唯一的问题是关于构建自动化脚本。我很久以前也有同样的问题,没有足够的时间研究Jenkins管道脚本的标准解决方案。你的构建自动化脚本面临什么样的问题?仅仅构建所有应用程序而忘记不需要的应用程序有什么害处?@JFMeier这个项目相当大,构建所有应用程序需要很长时间。如果我只对app1A进行了更改,那么就没有理由构建lib1、lib1A和app1A之外的任何东西。构建时间将大大缩短。您可以使用-am和-pl选项来构建包含所有所需库的部分项目,但您很容易进入版本地狱,因为您的模块开始有不同的版本号,其中的部分有时会增加。@JFMeier您所说的版本地狱是什么意思?在我的例子中,所有模块都需要使用所有库的最新版本。app1和app2都依赖于lib。一开始,所有人的POM中都有版本1.0.0-SNAPSHOT。现在,您将从app1及其依赖项库构建一个发行版。您可以将其构建为1.0.0版。之后,您或maven release插件将两个模块POM中的版本更改为1.0.1-SNAPSHOT。现在,您还需要将app2的POM更新为lib的参考1.0.1-SNAPSHOT。不过,app2 POM中的版本是1.0.0-SNAPSHOT。因此,模块的版本开始出现分歧。