我有一些多模块maven项目。它是Java EE应用程序,所以它们最终都会转到单个EAR文件,这就是为什么有一个特殊的独立POM,其中描述了所有依赖关系管理的第三方依赖:
<groupId>mygroup</groupId>
<artifactId>my-3rd-party-deps</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
它还在其依赖管理部分中导入JBoss AS父POM:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jboss.as</groupId>
<artifactId>jboss-as-parent</artifactId>
<version>7.1.3.Final</version>
<type>pom</type>
<scope>import</scope>
</dependency>
每个项目都有自己的父母,我在其中描述
<dependencyManagement>
<dependencies>
<dependency>
<groupId>mygroup</groupId>
<artifactId>my-3rd-party-deps</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
并且每个子模块只描述它们的依赖关系而没有版本。
当您使用命令行时,这非常有效。所有依赖版本都已正确解析。
但是在IDE(我尝试过IDEA,Eclipse和NetBeans)中我遇到了错误。
IDEA
[ERROR] 'dependencies.dependency.version' for org.jboss.spec.javax.ejb:jboss-ejb-api_3.1_spec:jar is missing. @ line 63, column 29 less...
的Eclipse
For artifact {org.jboss.spec.javax.ejb:jboss-ejb-api_3.1_spec:null:jar}: The version cannot be empty. (org.apache.maven.plugins:maven-resources-plugin:2.6:resources:default-resources:process-resources)
虽然org.jboss.spec.javax.ejb:jboss-ejb-api_3.1_spec
的版本在JBoss AS父POM中。
为什么会发生这种情况,如何解决这个问题才能在IDE中正常运行?
答案 0 :(得分:0)
在你的基础pom中你应该
<modules>
<module>subModule</module>
</modules>
然后在你的子模块pom中你应该
<parent>
<artifactId>something</artifactId>
<groupId>something</groupId>
<version>something</version>
<relativePath>../pom.xml</relativePath> <--Notice the path
</parent>
你是否尝试过除导入之外的其他范围?
如果您使用其他范围然后导入,您应该只能在子模块中使用groupId和artifactId。正如您已经在基础pom中定义了版本和范围。 如果在子模块中使用其他版本或作用域,则可以覆盖它们。
您可以做的其他事情是在您的基础pom中定义一个属性
<properties>
<project.jboss.artifact>1.5</project.jboss.artifact>
</properties>
在工件版本中(在子模块pom中),您可以使用变量
<version>${project.jboss.artifact}</version>
答案 1 :(得分:0)
我最终解决了这个问题,这个问题是由dependencyManagement
部分位于my-3rd-party-deps
POM中的个人资料中引起的。我的不好,我在问题中没有提到它。
因此IDE不会将选定的配置文件传播到repo发布的工件(如my-3rd-party-deps
)。
解决方案是创建单独的POM(例如my-3rd-party-deps-jboss
和my-3rd-party-deps-wildfly
)并在每个父项目的配置文件dependencyManagement
部分中导入相应的POM。
现在它可以正常工作。