Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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模块&x2B;构建单个特定模块_Java_Maven 2_Build Process - Fatal编程技术网

Java Maven模块&x2B;构建单个特定模块

Java Maven模块&x2B;构建单个特定模块,java,maven-2,build-process,Java,Maven 2,Build Process,我有一个多模块Maven项目,有一个父项目p和三个子模块a、B和C。B和C都是战争项目,都依赖于A 我可以在p中键入mvn compile,并正确编译所有子模块。当我想对特定模块进行操作时,问题就出现了 我希望能够为项目B打包一个war,但是当我从B的目录运行package命令时,它抱怨找不到a的依赖项 我从这个问题中了解到:也许Maven并不是为这种依赖性解析而设计的,但这就引出了一个问题:我如何打包B 当我真的想要B时,我是否必须为整个项目层次结构运行mvn包 每次要打包B,是否都必须将A的

我有一个多模块Maven项目,有一个父项目
p
和三个子模块
a
B
C
B
C
都是战争项目,都依赖于
A

我可以在
p
中键入
mvn compile
,并正确编译所有子模块。当我想对特定模块进行操作时,问题就出现了

我希望能够为项目
B
打包一个war,但是当我从
B
的目录运行package命令时,它抱怨找不到
a
的依赖项

我从这个问题中了解到:也许Maven并不是为这种依赖性解析而设计的,但这就引出了一个问题:我如何打包
B

  • 当我真的想要
    B
    时,我是否必须为整个项目层次结构运行
    mvn包

  • 每次要打包
    B
    ,是否都必须将A的快照安装到本地存储库中

  • A
    仍在积极开发中时,第二个场景就没什么意思了


    这里有什么最佳实践吗?

    如果您以前在project B上运行过mvn install,它将被安装到您的本地存储库中,因此当您构建包时,Maven可以解决依赖关系。因此,只要您每次更改项目B时都安装它,那么项目A的构建将是最新的

    您可以使用聚合器pom定义多模块项目,以构建一组项目


    还值得一提的是,它将Maven集成到Eclipse中,并允许您(可选地)从工作区解析依赖项。因此,如果您正在处理多个项目,那么工作区内容将用于编译。一旦您对所做的更改感到满意,请运行mvn install(依次在每个项目上运行,或使用聚合器)将其放入本地存储库。

    Maven绝对是为这种依赖性而设计的

    mvn-package
    不会在本地存储库中安装任何东西,它只是打包项目并将其保留在目标文件夹中

    在父项目(A)中执行
    mvn安装
    ,所有子模块都将安装在您计算机的Maven存储库中,如果没有更改,您只需编译/打包子模块(B),Maven将正确使用已打包和已安装的依赖项

    如果您更新了部分代码,则只需在父项目中安装一个
    mvn

    您说“真的只是想要B”,但这是错误的。您需要B,但如果有任何更改(“主动开发”),您也需要更新的A

    因此,有时您希望使用A、B和C。对于这种情况,您有聚合器项目p。对于您希望使用A和B(但不需要C)的情况,您应该创建聚合器项目Q

    2016年编辑:上述信息可能与2009年相关。截至2016年,我强烈建议在大多数情况下忽略这一点,只需使用公认答案中所述的
    -am
    -pl
    命令行标志。如果您使用的是v2.1之前的maven版本,请先更改:)

    看看我的答案

    设计用于处理项目的建筑部分

    您将要使用它的特定目标
    reactor:make

    这里有什么最佳实践吗

    使用Maven,更具体地说:

    -pl, --projects
            Build specified reactor projects instead of all projects
    -am, --also-make
            If project list is specified, also build projects required by the list
    
    因此,只需将
    cd
    放入父p目录并运行:

    mvn install -pl B -am
    
    这将构建B和B所需的模块

    请注意,如果引用的是与目录名不同的
    artifactId
    ,则需要使用冒号:

    mvn install -pl :B -am
    

    如本文所述:

    假设Parent pom.xml包含6个模块,您希望运行ABF

    <modules>
            <module>A</module>
            <module>B</module>
            <module>C</module>
            <module>D</module>
            <module>E</module>
            <module>F</module>
      </modules>
    

    注意:使用-am选项指定项目时,Maven将生成指定项目所依赖的所有项目(直接或间接)。Maven将检查项目列表并沿着依赖关系树走下去,找到它需要构建的所有项目


    -am命令在多模块构建中生成特定项目所需的所有项目时,-amd-还可以生成依赖项选项将Maven配置为构建项目以及依赖于该项目的任何项目。当使用--也生成依赖项时,,Maven将检查反应堆中的所有项目,以找到依赖于特定项目的项目。它将自动生成这些项目,而不会生成其他项目。

    有没有一种简单的方法可以保证我的目标项目的所有依赖项目都已安装?我的层次结构实际上比这里描述的要复杂得多,所以请记住,自从我上次更改代码以来,我是否为每个依赖项目运行过mvn安装可能会很棘手。是的,使用模块构建项目集,请参阅原始答案中添加的链接。对于2011年访问此页面的任何人,这是更好的答案。现在maven本身(maven 2.1及以上版本)对多个模块有了更好的支持,您不需要使用reactor插件。另一个非常有用的选项是“-amd,--也生成dependents”,它根据reactor列表中的项目构建所有模块。构建孙子模块怎么样?@Bax,use
    mvn install-pl.,parent/child,父/子/孙
    使用逗号分隔多个项目和子项目。对于父母来说,“模块”和“项目”这两个术语在您引用的文档中以及在Maven中通常用于同一件事吗?这曾经是正确的答案,但在Maven 2.1中,您不再需要这样做
     mvn --projects A,B,F --also-make clean install
    
    mvn -pl A,B,F -am clean install
    
    mvn -pl A,B,F -amd clean install