【问题标题】:Multimodule maven project - exclusions in depenedency多模块 maven 项目 - 依赖排除
【发布时间】:2014-01-21 20:54:23
【问题描述】:

我希望我的 ModuleTypeA 战争将 ModuleBase 作为依赖项与 'src/main/java/typeA' 包排除在外,类似地 ModuleTypeB 战争将 ModuleBase 作为依赖项与 'src/main/java/typeB' 包排除在外。

这是我的项目结构:

ModuleBase
   |
   |----> src/main/java/base
   |----> src/main/java/typeA
   |----> src/main/java/typeB
   |----> pom.xml

ModuleTypeA
   |
   |----> src/main/java/..
   |----> pom.xml

ModuleTypeB
   |
   |----> src/main/java/..
   |----> pom.xml

我是 Maven 新手,不知道如何实现。 ModuleBase 不能是父项目,因为我需要为此构建一个 jar(不能有包装类型 pom),所以我可以创建一个顶级父项目。

欢迎提出任何建议。

谢谢

【问题讨论】:

  • 为什么你的 ModuleBase 中有 typeA 的代码? AFAIK 您只能在项目级别排除包,因此 ModuleBase 必须排除 typeA 但随后它将被排除在所有项目中,具体取决于 ModuleBase。但问题是为什么在基础中有特定的代码?
  • ModuleBase 中的代码是与基础设施相关的代码,我不想与 ModuleTypeA 中的其他应用程序级代码混合。是的,我知道项目级别的排除项,但这不符合这里的目的。
  • 您可以将代码从 ModuleBase/../typeA 移动到单独的项目并引用它。

标签: java maven


【解决方案1】:

通常应该是这样的:

proj
  + proj-base
    + src/main/java/   // containing base code
    + pom.xml
  + proj-mod-type-a
    + src/main/java/   // containing module a code
    + pom.xml          // dependency to proj-base
  + proj-mod-type-b
    + src/main/java/   // containing module b code
    + pom.xml          // dependency to proj-base
  + proj-a-web
    + src/main/java    // war A source
    + pom.xml          // dependency to proj-base and proj-mod-type-b
  + proj-b-web
    + src/main/java    // war B source
    + pom.xml          // dependency to proj-base and proj-mod-type-a

简而言之,将您的项目拆分为有意义的模块,每个模块都是一个依赖单元。根据您需要的依赖关系构建您的 WAR。

如果proj-base 实际上是一个 WAR,您希望在其他 WAR 中重用其内容,那么您可能会更接近 Maven 中 WAR 覆盖的行为。但是,我相信基本思想还是一样的:更好地模块化您的项目并在构建您的 WAR/EAR 时具有适当的依赖关系

【讨论】:

    【解决方案2】:

    首先,阅读这篇关于依赖排除的文章: Optional Dependencies and Dependency Exclusions

    如果您正在从 ModuleBase 构建 .war 文件,则您不能为 ModuleBase 中的 ModuleTypeA 创建一个依赖项,而是一个覆盖,类似地,ModuleTypeB 战争作为 ModuleBase 的覆盖。为此,您可以使用 Maven War 插件: Maven War Plugin

    这样,为了排除一个包,在你的 pom.xml 中使用这个:

    <excludes>
       <exclude>src/main/java/typeA</exclude>
    </excludes>
    

    更新:

    我还没有尝试过,但是有两种方法可以从 .jar 中排除包。

    1) 使用Maven Assembly Plugin。这是一个你可以参考的例子:

    Exclude files with maven assembly does not work

    2)使用Maven Jar Plugin,以这个答案为例:

    maven-jar-plugin Exclusions Failing

    【讨论】:

    • 看起来覆盖只支持war和zip,所以我必须将ModuleBase构建为war文件。我想知道是否有可能是我的 ModuleBase 是作为 jar 构建的。
    • 感谢您提供的信息和链接。我想似乎最干净的解决方案是重组我的项目树,正如@Adrian 提到的那样。
    【解决方案3】:

    您可以在 ModuleBase 中创建不同的程序集,并在 ModuleTypeA/B 中将它们称为系统依赖项。

    您可以使用&lt;systemPath&gt;../module-base/target/rt.jar&lt;/systemPath&gt; 设置依赖项的路径

    也许Multiple assemblies from one maven project 会帮助您解决组装问题。

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多