我们所有的外部依赖关系都在企业pom中定义。我们不想在企业pom中定义依赖项的范围,因为我们有同时部署到Tomcat和JBoss的应用程序。众所周知,JBoss中捆绑了一些依赖项,但在Tomcat默认安装中可能不存在。
bom-parent是所有特定于应用程序的企业poms的父级。然后,我们在每个应用程序的bom-app1下面的示例中创建了一个二级企业pom。所有项目都继承了应用程序特定的企业poms。
在GitHub上提供示例项目的详细说明和评论
GitHub:https://github.com/samirshaik/mvn-dep-issue.git
问题: 在特定于应用程序的企业pom中,我们只想在第一级企业pom中定义在dependencyManagement部分中声明的依赖项的范围。但这是不可能的,因为Maven迫使我们声明在特定于应用程序的企业pom中重新声明的依赖项的版本。我们继续使用与在第一级企业pom中声明的版本属性相同的版本属性,并且一切正常,除了我们丢失了父依赖项的所有属性(如排除所有传递性依赖项)。
对我们来说,这是非常真实的要求,但看起来像今天设计时那样的dependencyManagement并没有考虑继承的优点。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.samir.enterprise</groupId>
<artifactId>bom-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>Enterprise BOM</name>
<properties>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
下面是子BOM的示例代码片段,应该让我定义依赖项的范围并继承父对象的所有功能。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.samir.enterprise</groupId>
<artifactId>bom-parent</artifactId>
<version>1.0.0</version>
</parent>
<groupId>com.samir.enterprise</groupId>
<artifactId>bom-app1</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>Enterprise Child BOM</name>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>