Maven依赖管理和IDE:`import`范围

时间:2014-11-18 09:05:15

标签: eclipse maven intellij-idea

我有一些多模块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中正常运行?

2 个答案:

答案 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-jbossmy-3rd-party-deps-wildfly)并在每个父项目的配置文件dependencyManagement部分中导入相应的POM。

现在它可以正常工作。