2009-09-02 22 views
5

在我们的Maven项目,我们正在尝试以下目录结构(具有约80个项目总共只有少数显示,让你的想法):Maven的重用劲歌

myappli  (pom) 
-- module1  (pom) 
--|-- utils (pom) 
--|-- ejb  (pom) 
--|--|-- myappli-module1-a-ejb (jar) 
--|--|-- myappli-module1-b-ejb (jar) 
--|-- war  (pom) 
--|-- applet  (pom) 
... 
-- module6  (pom) 
--|-- utils  (pom) 
--|-- ejb  (pom) 
--|--|-- myappli-module6-c-ejb (jar) 
--|-- war  (pom) 
--|-- applet  (pom) 

注意:这是一个平坦结构对Maven,因为所有的非叶项目具有“POM”一个packaging值。 (参见BetterBuildsWithMaven书)。

我们在“myappli”pom中定义了“dependencyManagement”中的依赖项版本。这工作正常。

我们的问题是与自己相依的重用。 例如,EJB依赖通用于所有EJB项目(由设计)。 我们不想cut'n贴,并保持所有以每个变化!

我们正在考虑为ejb依赖性使用一些“导入概念”,并且在应用程序级别定义我们的ejb依赖关系。我们不成功的尝试是:

  • Maven的“parent pom”的概念就可以了,但它已经使用的模块,所以它不适用于我们的要求。
  • 在Maven中找不到任何导入工具(依赖管理除外)
  • 无法识别XML实体定义。我们尝试了类似下面的POM,并得到了错误
    Reason: Parse error reading POM. Reason: could not resolve entity named 'ejbDependencies'”:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE project [
    <!ENTITY ejbDependencies SYSTEM "./ejbDependencies.txt">
    ]>
    <project ...
    ...
    &ejbDependencies;
    ...


编辑:我正在尝试罗伯特建议的解决方案,但有些地方是错误的。

当我编译我的EJB项目,它没有找到依赖自己。编译时(mvn编译),我得到一个错误,说javax.ejb包缺失。

注意:我之前在依赖项目上运行过“mvn install”。

这是我的配置:

<project ...> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>com.company</groupId> 
    <artifactId>myproj-maven</artifactId> 
    <version>3.1-SNAPSHOT</version> 
    </parent> 

    <groupId>com.company</groupId> 
    <artifactId>myproj-maven-ejb</artifactId> 
    <version>${myproj-version}</version> 
    <packaging>pom</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>javax.ejb</groupId> 
     <artifactId>ejb</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>ojdbc</groupId> 
     <artifactId>ojdbc</artifactId> 
    </dependency> 
    </dependencies> 
</project> 

--------------------------------- 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>com.company</groupId> 
    <artifactId>myproj-identite-ejb</artifactId> 
    <version>3.1-SNAPSHOT</version> 
    </parent> 

    <groupId>com.company</groupId> 
    <artifactId>myproj-identite-metier</artifactId> 
    <name>SNR IDENTITE METIER</name> 
    <version>2.0.1</version> 
    <packaging>ejb</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.company</groupId> 
     <artifactId>myproj-maven-ejb</artifactId> 
     <version>${myproj-version}</version> 
     <type>pom</type> 
    </dependency> 
    </dependencies> 
</project> 

我不知道这是否改变了一些东西,但我们有涉及这两个劲歌一个层次。
我们有一个严格的Maven结构,其中每个目录将所有子目录声明为maven模块,并且每个子目录都将父级声明为母版父级。
而常见的父目录是这个结构的一部分。

+---maven 
| \---ejb 
+---identite 
| +---ejb 
| | \---SNR_IDENTITE_METIER 

编辑

由珊瑚礁给出的答案似乎是正确的。这是不可能与Maven做,因​​为提供的依赖,因此不:-(

及物我们确实有很多问题,设置了Maven的。因此,许多小东西就是不工作。今天,我发现!出该网站的目标无法处理性能,我们使用的版本号

回答

2

您的进口依赖项有提供范围吗? 事实上,这个范围不是传递的(参见Maven Dependency Scopes)。

这可能是未更换的原因。

+0

+1确实是这样的原因,一个小测试证明了它。谢谢。 – KLE 2009-09-03 14:10:31

9

您可以使用POM依赖进口依赖到任意项目

一个POM项目可以类似于:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example</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> 
    </dependencies> 
</project> 

,并导入为:

<dependency> 
    <groupId>com.example</groupId> 
    <artifactId>persistence-deps</artifactId> 
    <version>1.0</version> 
    <type>pom</type> 
</dependency> 

详见Maven, the definitive guide - Grouping Dependencies

+0

+1对于看起来很完美的答案。我正在尝试它。 (注意:几分钟前,您还在另一个答案中编辑了我的“错字”;-)) – KLE 2009-09-02 12:16:20

+0

我试过了。我在依赖项目上运行“mvn install”。然后我编译我的ejb项目,它本身没有找到依赖关系。 – KLE 2009-09-03 11:46:40

+0

为了检查,我运行了一个help:effective-pom。它不会替换依赖关系集的依赖关系。这是正常的吗?我怎么能检查我的错在哪里? – KLE 2009-09-03 11:47:58