【问题标题】:Using Maven, how can I assemble several modules into one artifact?使用 Maven,如何将多个模块组装成一个工件?
【发布时间】:2011-04-11 21:08:28
【问题描述】:

我们有一个包含多个模块的母舰项目:

foo
+ foo-core
+ foo-resource
+ foo-util
+ foo-whatever

我希望允许开发人员将 core、resource 和 util 模块包含为依赖项(不包括 -whatever 模块)。我知道我可以指定它们包含每个依赖项,但是允许它们只指定类似

的东西会很好
<artifactId>foo-sdk</artifactId>

并获得开发 foo 所需的一切。这有一个额外的优势,它使我们能够添加(或删除)进入 sdk 的内容。

如果 foo-sdk 不只是一个 jar 并且其他 jar 卡在其中,那将是最好的。我宁愿它是一个简单地指向其他工件的 pom。

我觉得我以前见过这样做,但找不到执行此操作的说明。我查看了Maven Assembly Plugin,但看起来这不是它的预期用途。

【问题讨论】:

    标签: maven-2


    【解决方案1】:

    您可以使用pom 类型的包装对项目中的依赖项进行分组。来自 Maven 书:

    3.6.1。分组依赖项

    如果你有一组依赖 它们在逻辑上组合在一起。 你可以用 pom 创建一个项目 将依赖项分组的打包 一起。例如,让我们假设 您的应用程序使用 Hibernate, 流行的对象关系映射 框架。每个项目使用 Hibernate 也可能有依赖关系 关于 Spring Framework 和 MySQL JDBC 驱动程序。而不是必须 将这些依赖项包含在每个 使用 Hibernate、Spring、 和 MySQL 你可以创建一个特殊的 POM 无非就是 声明一组公共依赖项。 您可以创建一个名为 persistence-deps(简称 持久性依赖),并且有 每个需要做的项目 持久性取决于这种便利性 项目:

    示例 3.11。在单个 POM 项目中合并依赖项

    <project>
      <groupId>org.sonatype.mavenbook</groupId>
      <artifactId>persistence-deps</artifactId>
      <version>1.0</version>
      <packaging>pom</packaging>
      <dependencies>
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate</artifactId>
          <version>${hibernateVersion}</version>
        </dependency>
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-annotations</artifactId>
          <version>${hibernateAnnotationsVersion}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-hibernate3</artifactId>
          <version>${springVersion}</version>
        </dependency>
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>${mysqlVersion}</version>
        </dependency>
      </dependencies>
      <properties>
        <mysqlVersion>(5.1,)</mysqlVersion>
        <springVersion>(2.0.6,)</springVersion>
        <hibernateVersion>3.2.5.ga</hibernateVersion>
        <hibernateAnnotationsVersion>3.3.0.ga</hibernateAnnotationsVersion>
      </properties>
    </project>
    

    如果您在 名为 persistence-deps 的目录,所有 你需要做的是创建这个 pom.xml 并运行 mvn install。自从 包装类型是pom,这个POM 安装在您的本地存储库中。 您现在可以将此项目添加为 依赖项及其所有依赖项 将被添加为传递 对您的项目的依赖项。当你 声明对此的依赖 persistence-deps 项目,不要 忘记指定依赖类型 作为pom

    示例 3.12。声明对 POM 的依赖

    <project>
      <description>This is a project requiring JDBC</description>
      ...
      <dependencies>
        ...
        <dependency>
          <groupId>org.sonatype.mavenbook</groupId>
          <artifactId>persistence-deps</artifactId>
          <version>1.0</version>
          <type>pom</type>
        </dependency>
      </dependencies>
    </project>
    

    如果您以后决定切换到 不同的 JDBC 驱动程序(例如, JTDS),只需替换依赖项 在persistence-deps项目中使用 net.sourceforge.jtds:jtds 而不是 mysql:mysql-java-connector 和更新 版本号。所有项目 取决于持久性-deps 将使用 JTDS 如果他们决定更新到 较新的版本。合并相关 依赖是减少的好方法 关于 pom.xml 文件的长度 开始不得不依赖一个大 依赖的数量。如果你需要 共享大量依赖 在项目之间,你也可以 建立亲子关系 项目之间并重构所有 对父级的共同依赖 项目,但缺点是 亲子方法是 项目只能有一个父级。 有时分组更有意义 相似的依赖关系在一起 引用 pom 依赖项。这边走, 您的项目可以引用尽可能多的 这些合并的依赖 POM 为 它需要。注意

    Maven 使用依赖的深度 解决冲突时在树中 使用最近获胜的方法。使用 依赖分组技术 以上将这些依赖项推到了一个 在树中水平下降。保持这个 在分组之间进行选择时请注意 一个 pom 或使用 dependencyManagement 在父 POM 中

    【讨论】:

    • "您可以在项目中使用 pom 类型的包装对依赖项进行分组" 完美,谢谢。
    【解决方案2】:

    这不只是另一个子模块 foo-sdk 打包 pom 并依赖于 foo-{core,resource,util} 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2011-02-11
      • 2015-09-29
      • 2014-06-12
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多