Maven在poms中重复使用

KLE*_*KLE 5 import maven-2 reusability

在我们的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)
Run Code Online (Sandbox Code Playgroud)

注意:这是Maven 的平面结构,因为所有非叶子项目的packaging值都是"pom".(参见BetterBuildsWithMaven一书).

我们dependencyManagement在" myappli"pom 中的" "中定义依赖版本.这很好用.

我们的问题是重用依赖项本身.例如,ejb依赖项对于所有ejb项目(通过设计)是通用的.我们不想削减'粘贴,并且每次改变都要保持这一切!

我们考虑对ejb依赖项使用一些" import notion ",并在应用程序级别定义一次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>
Run Code Online (Sandbox Code Playgroud)

我不知道它是否会改变某些东西,但我们有一个与两个poms相关的层次结构.
我们有一个严格的Maven结构,其中每个目录将所有子目录声明为maven模块,每个子目录将父节点声明为maven父节点.
公共父目录是此结构的一部分.

+---maven
|   \---ejb
+---identite
|   +---ejb
|   |   \---SNR_IDENTITE_METIER
Run Code Online (Sandbox Code Playgroud)

编辑:

珊瑚礁给出的答案似乎是正确的.使用Maven是不可能的,因为我们提供了依赖性,因此不具有传递性:-(

我们在安装Maven时遇到了很多问题.这么多小事情都行不通.今天我发现网站目标无法处理我们用于版本号的属性!

Rob*_*anu 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>
Run Code Online (Sandbox Code Playgroud)

并导入为:

<dependency>
  <groupId>com.example</groupId>
  <artifactId>persistence-deps</artifactId>
  <version>1.0</version>
  <type>pom</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Maven,权威指南 - 分组依赖关系.


ree*_*eef 2

您导入的依赖项是否有提供的范围?事实上,这个作用域是不可传递的(请参阅 Maven依赖关系作用域)。

这可能是不更换的原因。