在我们的 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 的结构,因为所有非叶项目都有一个 packaging “pom”的值。(参见 BetterBuildsWithMaven 书)。

我们在“中定义依赖版本dependencyManagement“, 在里面 ”myappli“pom。这很好用。

我们的问题是依赖项本身的重用。例如,ejb 依赖项对于所有 ejb 项目都是通用的(按照设计)。我们不想剪切粘贴,并在每次更改时都保留所有内容!

我们正在考虑使用一些“导入概念" 对于 ejb 依赖项,并在应用程序级别定义我们的 ejb 依赖项。我们不成功的尝试是:

  • 梅文”parent pom“这个概念很好,但它已经被模块使用了,所以它不能满足我们的要求。
  • Maven 中找不到导入工具(dependencyManagement 除外)
  • 无法识别 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>

我不知道它是否会改变一些东西,但我们有一个将两个 pom 关联起来的层次结构。
我们有严格的 Maven 结构,其中每个目录将所有子目录声明为 maven 模块,每个子目录将父目录声明为 maven 父目录。
公共父目录是该结构的一部分。

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

已编辑:

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

我们在设置 Maven 时确实遇到了很多问题。很多小事情根本不起作用。今天我发现站点目标无法处理我们用于版本号的属性!

有帮助吗?

解决方案

您导入的依赖项是否有 假如 范围?事实上这个作用域是不可传递的(参见 Maven 依赖范围).

这可能是不更换的原因。

其他提示

您可以使用 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,权威指南 - 依赖分组 了解详情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top