插件依赖的Maven依赖管理

65

最近,我遇到了以下问题:

在为我的项目设置依赖管理时,我有一个使用插件及其依赖项的子pom,我希望这些依赖项与我在依赖管理中声明的依赖项同步。

在根pom中,我在我的依赖管理中声明了:

<dependencyManagement>
    <dependencies>
      ...
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-user</artifactId>
            <version>2.4.0</version>
        </dependency>
      ...
    <dependencies>
<dependencyManagement>

在子 POM 中,我有一个需要 gwt-user 的插件:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>gwt-maven-plugin</artifactId>
    <version>2.4.0</version>
    <dependencies>
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-user</artifactId>
            <version>2.4.0</version>
        </dependency>
            ...
        </dependencies>
  ...
</plugin>

然而,如果我删除gwt-maven-plugin中使用的依赖版本,编译就会失败。

是否有其他方法可以实现?

PS:有一个相关的帖子Choosing dependency version in maven and maven plugin,但没有回答我的问题。

4个回答

67

根据以下链接,似乎不可能做到:

这是我找到的一个解决方法,我想和大家分享一下,以防其他人也遇到同样的问题:

在我的根Pom中,我定义了一个属性、一个依赖管理和一个插件管理:

<properties>
    <gwtVersion>2.4.0</gwtVersion>
    <gwtMavenPluginVersion>2.4.0</gwtMavenPluginVersion>
</properties>

<dependencyManagement>
   <dependencies>
    ...
    <dependency>
        <groupId>com.google.gwt</groupId>
        <artifactId>gwt-user</artifactId>
        <version>${gwtVersion}</version>
    </dependency>
    ...
   </dependencies>
</dependencyManagement>

<build>    
  <pluginManagement>
        <plugins>
            <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>gwt-maven-plugin</artifactId>
            <version>${gwtMavenPluginVersion}</version>
            <dependencies>
                <dependency>
                    <groupId>com.google.gwt</groupId>
                    <artifactId>gwt-user</artifactId>
                    <version>${gwtVersion}</version>
                </dependency>
                ...
            </dependencies>
            ...
        </plugins>
  ...
  </pluginManagement>
</build>

而在我的子pom中,利用插件管理提供的关系(参见Maven2 - problem with pluginManagement and parent-child relationship),我只需声明插件依赖:

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>gwt-maven-plugin</artifactId>
</plugin>

现在,如果我更改属性中的版本,它会自动影响所有直接依赖项和插件依赖项。


2
在我看来,如果依赖项仅在插件中需要,则无需使用dependencyManagement部分。 - Franz Ebner
3
供未来参考。pluginManagement位于build标签下。 - TecHunter
你正在使用托管插件的确切配置,但如果我需要指定文件过滤器或插件要处理的包怎么办?当我仅在子POM中指定插件配置时会发生什么? - Timo

8
为了让父POM控制子模块使用哪些插件版本,你应该在父POM的<pluginManagement>部分声明<plugin>
你在<dependencyManagement>部分中将com.google.gwt:gwt-user定义为一个<dependency>
我不确定你是否打算将gwt-user用作插件还是依赖项,但两者都应列为相同实体以使继承工作。

gwt-user被用作一个有依赖关系的插件。OP试图在一个位置定义两者的版本。 - eis
顺便说一下,您无法从定义在dependencyManagement中的父级继承插件。 - Serkan

1
另一种可能性是导入父POM的所有依赖项:
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>gwt-maven-plugin</artifactId>
    <version>2.4.0</version>
    <dependencies>
        <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>${project.artifactId}</artifactId>
             <version>${project.version}</version>
        </dependency>
            ...
        </dependencies>
  ...
</plugin> 

这不是最美观的解决方案,但是它能够工作 :-)


一个更好的解决方案是使用<build> <pluginManagement>。 - Mav3656

0
在我的情况下,我使用了jetty maven插件,并依赖于hsqldb。我从sonatype的书中复制了一些示例代码(我想这就是我得到这些代码的地方),用于使用jetty插件,其中指定了groupId为hsqldb。我正在使用hsqldb的2.3.2版本。在我的父pom文件的dependencyManagement部分和我的持久化模块中,groupId是org.hsqldb。由于不匹配的groupIds导致我出现错误,因为在旧的groupId下没有2.3.2版本。一旦我将groupId从hsqldb更改为org.hsqldb,一切都开始正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接