【发布时间】:2014-03-17 20:26:18
【问题描述】:
我在 SO 和 Internet 上进行了搜索,但没有成功。这就是我所拥有的:
具有 dev 和 appserv 配置文件的多模块项目。当使用 dev 配置文件时(只是 mvn clean install,因为 default=true),然后加载特定的依赖项。一个依赖项是Child-A,必须在Child-B 中加载。我总是从父 POM 构建。
我在父 POM 中定义了激活的配置文件,在 Child-B 我有相同的配置文件和依赖项。
这是我的父母POM:
<project ..>
<groupId>com.organisation</groupId>
<artifactId>project-name</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>child-b</module>
<module>child-a</module>
</modules>
<properties>
<javax.ws.rs.version>2.0</javax.ws.rs.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- project dependencies -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>child-a</artifactId>
<version>${project.version}</version>
</dependency>
<!-- build dependencies -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>${javax.ws.rs.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>child-a</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>${javax.ws.rs.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</profile>
<profile>
<id>app-server</id>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>env</name>
<value>app-server</value>
</property>
</activation>
</profile>
</profiles>
</project>
我的Child-B 模块调用Child-A,在构建Child-B 时的IDE 也看不到Child-A 的类。
<project ..>
<parent>
<groupId>com.organisation</groupId>
<artifactId>project-name</artifactId>
<version>1.0</version>
</parent>
<artifactId>child-b</artifactId>
<packaging>jar</packaging>
<profiles>
<profile>
<id>dev</id>
<dependencies>
<dependency>
<groupId>${project.parent.groupId}</groupId>
<artifactId>child-a</artifactId>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
</dependency>
</dependencies>
</profile>
<profile>
<id>app-server</id>
<dependencies>
...
</dependencies>
</profile>
</profiles>
<dependencies>
...
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
...
</dependencies>
</project>
我看不出这里有什么问题,也无法理解问题出在哪里,为什么Child-B 不将Child-A 作为依赖项。在 profile 内的父 POM 中,我尝试删除 dependencyManagement,但结果仍然相同 - Child-A 在 Child-B 模块中未看到。显然没有配置文件一切正常。
【问题讨论】:
-
最后一个 POM 是 child-A 还是 child-B 的 POM?您在文本中提到 child-B 将 child-A 作为依赖项,但 POM 本身将 child-B 作为依赖项
-
@AdrianShum 嘿,我修正了类型。最后一个 POM 是 Child-B,在内部配置文件中我包含 child-a,但它没有。
-
@Skyzer:虽然可以在
<profile/>中定义依赖关系,但使用它通常不是一个好主意,因为它可能会破坏可移植性并且事情不会很明显。此外,来自dependency:tree的报告将仅显示在pom.xml和激活的配置文件中定义的依赖关系,这意味着它们将仅涵盖其中一种情况。这通常是糟糕的设计,让项目继承这种做事方式就像传播疾病一样。 (只是我的 5 美分建议)。 -
@carlspring 好的,但是我将如何设计呢?例如,我需要为本地测试和应用程序服务器单独构建。在我的应用程序服务器中,一些依赖项应该标记为已提供,因为 Glassfish 已经有 jax-rs,而我的 child-a 依赖项是 Glassfish 中的共享库。因此,在默认情况下构建本地测试时,这些依赖项应包含在范围内
-
相当有办法解决。我建议的一个是将它们分成几个项目。例如有一个包含您的主要代码的 MAIN 项目。一个为依赖于 MAIN 的应用服务器创建 WAR 的 WEB 项目,然后是另一个构建可执行 JAR 的本地项目,该 JAR 也依赖于 MAIN。另一种方法是利用程序集插件,创建不同的程序集,每个程序集都有不同的分类器。