在我们的Maven项目中,我们正在尝试以下目录结构(总共大约有80个项目,只显示了几个项目以便您了解):
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的 flat 结构,因为所有非叶项目的
packaging
值都是“pom”。 (参见BetterBuildsWithMaven一书)。
我们在“dependencyManagement
”pom中的“myappli
”中定义依赖项版本。这很好。
我们的问题在于重用依赖项本身。 例如,ejb依赖项对于所有ejb项目(通过设计)是通用的。 我们不想削减'粘贴,并且每次改变都要保持这一切!
我们考虑对ejb依赖项使用一些“ import notion ”,并在应用程序级别定义一次ejb依赖项。我们的失败尝试是:
parent pom
”概念没问题,但已经被模块使用,因此无法满足我们的要求。无法识别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>
我不知道它是否会改变某些东西,但我们有一个与两个poms相关的层次结构
我们有一个严格的Maven结构,其中每个目录将所有子目录声明为maven模块,每个子目录将父节点声明为maven父节点。
公共父目录是此结构的一部分。
+---maven
| \---ejb
+---identite
| +---ejb
| | \---SNR_IDENTITE_METIER
被修改:
珊瑚礁给出的答案似乎是正确的。使用Maven是不可能的,因为我们提供了依赖关系,因此不具有传递性: - (
我们在安装Maven时遇到很多问题。这么多小事情都行不通。今天我发现网站目标无法处理我们用于版本号的属性!
答案 0 :(得分: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 。
答案 1 :(得分:2)
导入的依赖项是否具有提供的范围? 实际上,这个范围不具有传递性(参见Maven Dependency Scopes)。
这可能是不替换的原因。