多模块maven项目 - 依赖项排除

时间:2014-01-21 20:54:24

标签: java maven

我希望我的ModuleTypeA war包含ModuleBase作为与'src / main / java / typeA'包的依赖关系排除和类似的ModuleTypeB war包括ModuleBase作为依赖与'src / main / java / typeB'包排除。< / p>

这是我的项目结构:

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)所以我可以创建一个顶级父项目。

欢迎任何建议。

由于

3 个答案:

答案 0 :(得分:1)

首先,阅读有关依赖项排除的文章: Optional Dependencies and Dependency Exclusions

如果要从ModuleBase构建.war文件,则可以不是ModuleBase的ModuleTypeA的依赖,而是ModuleB的覆盖,类似的ModuleTypeB作为ModuleBase的覆盖。为此,您可以使用Maven War Plugin: 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

答案 1 :(得分:1)

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

您可以使用<systemPath>../module-base/target/rt.jar</systemPath>

设置依赖关系的路径

也许Multiple assemblies from one maven project会帮助您处理汇编主题。

答案 2 :(得分: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时更好地模块化项目并具有适当的依赖性