【问题标题】:Aggregate Dependencies in a Multi-Module Maven Project在多模块 Maven 项目中聚合依赖项
【发布时间】:2010-08-08 16:37:42
【问题描述】:

我想弄清楚如何在一个多模块项目中聚合我的 Maven 依赖项。例如,如果我有:

root pom/project1
root pom/project2

我运行mvn dependency:copy-dependencies,最终得到以下依赖项:

root pom/project1/target/dependency
root pom/project2/target/dependency

我真正想要的是,如果我在 pom 根文件夹中运行 mvn 命令,所有依赖项都将复制到 root pom/dependency。是否有一个 Maven 属性可以让我获得根 pom 的输出目录? (类似于${project.build.directory})?我意识到我可以在事后将所有依赖文件夹复制到同一个地方,但我希望有一些更清洁的东西。

【问题讨论】:

    标签: maven-2


    【解决方案1】:

    您必须配置依赖插件以将依赖项复制到特定位置。这可以通过outputDirectory 配置属性来完成。

    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-dependency-plugin</artifactId>
       <executions>
          <execution>
             <id>copy-dependencies</id>
             <phase>package</phase>
             <goals>
                <goal>copy-dependencies</goal>
             </goals>
             <configuration>
                  <outputDirectory>${outputDir}</outputDirectory>
             </configuration>
          </execution>
       </executions>
    </plugin>
    

    但如果您尝试这样做以进行分发,我建议您使用 maven assembly plugin 创建一个程序集

    文档说:

    适用于 Maven 2.0 的程序集插件主要是为了允许用户聚合 项目输出及其依赖项、模块、站点文档和其他文件 到一个可分发的存档中。

    【讨论】:

    • 谢谢!这看起来像我需要的。
    【解决方案2】:

    我真正想要的是,如果我在根 pom 文件夹中运行 mvn 命令,所有依赖项都将复制到根 pom/dependency。是否有一个 Maven 属性可以让我获得根 pom 的输出目录? (类似于${project.build.directory})?

    不,因为模块实际上不应该意识到这一点。

    我意识到我可以在事后将所有依赖文件夹复制到同一个地方,但我希望有一些更清洁的东西。

    Maven 方式将使用Maven Assembly Plugina custom descriptor。但如果你不熟悉 Maven 组装插件及其描述符格式,那就不容易了。

    一个不太干净但更简单的方法是配置Maven Dependency plugin 以使用相对路径将依赖项复制到父项目中。像这样的:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.1</version>
      <configuration>
        <outputDirectory>../root_pom/target/dependency</outputDirectory>
      </configuration>
    </plugin>
    

    但是正如我所说,这引入了模块和根项目之间的紧密耦合,这一点都不好(而且我不会进一步将目标调用作为构建的一部分,模块应该保持独立,你应该能够构建一个模块而无需“检查”父级)。

    【讨论】:

    • @Greg 你有没有找到用程序集插件来做到这一点的方法?
    • @herau 我不记得当时我做了什么来解决这个问题,但如果我用过去几年学到的东西再做一次,我会使用程序集插件。您只需要在根级别添加一个新的 Maven 模块,您可以将其称为“程序集”或任何您想要的。您将所有其他模块作为依赖项包含在程序集项目的 pom 文件中,然后您的程序集描述符将包括以下内容: runtime/ dependencySet> 这应该会让你接近。
    • 好的@Greg,它会尝试的。组装模块是否应该与父模块链接?
    猜你喜欢
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2010-12-16
    • 2012-04-28
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多