插件依赖的Maven依赖管理

Posted

技术标签:

【中文标题】插件依赖的Maven依赖管理【英文标题】:Maven dependency management for plugin dependencies 【发布时间】:2012-06-30 13:07:03 【问题描述】:

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

当我为我的项目设置依赖项管理时,我有 child-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没有回答我的问题

【问题讨论】:

【参考方案1】:

根据下面的链接看来是不可能的:

http://maven.40175.n5.nabble.com/dependency-management-within-plugin-dependencies-td78367.html https://issues.apache.org/jira/browse/MNG-2496

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

在我的根 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>

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

【讨论】:

恕我直言,如果仅在插件中需要依赖项,则依赖项管理部分没有用 供以后参考。 pluginManagement 在构建标签下 您正在使用托管插件的确切配置,但是如果我需要指定文件过滤器或插件包以供插件使用怎么办?当我只在我的子 pom 中指定插件的配置时会发生什么?【参考方案2】:

要让父 POM 控制子代使用的插件版本,您应该在父 POM 的 &lt;pluginManagement&gt; 部分中声明 &lt;plugin&gt;

您在&lt;dependencyManagement&gt; 部分将com.google.gwt:gwt-user 定义为&lt;dependency&gt;

我不确定您是否打算将 gwt-user 用作插件或依赖项,但它应该在两者中列为相同的实体,以便继承工作。

【讨论】:

gwt-user 用作具有依赖关系的插件。 OP 正在尝试仅在一个位置获取为两者定义的版本。【参考方案3】:

另一种可能是导入父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> 

不是最漂亮的解决方案,但可以工作:-)

【讨论】:

【参考方案4】:

在我的例子中,我使用的是 jetty maven 插件,它依赖于 hsqldb。我从 sonatype 书中复制了一些示例行(我认为那是我从中获得这些行的地方)以使用 jetty 插件,该插件将 groupId 指定为 hsqldb。我正在使用 2.3.2 版的 hsqldb。在我的依赖管理部分的父 pom 和我的持久性模块中,groupId 是 org.hsqldb。 groupIds 不匹配是导致我出错的原因,因为在那个旧的 groupId 下没有版本 2.3.2。一旦我将 groupId 从 hsqldb 更改为 org.hsqldb 一切都开始工作了。

【讨论】:

以上是关于插件依赖的Maven依赖管理的主要内容,如果未能解决你的问题,请参考以下文章

Maven基础-03-笔记

Maven基础-03-笔记

Maven基础-03-笔记

Intellij IDEA Maven 插件 - 管理依赖项

Maven 发布插件不更新依赖管理中的快照

Maven 基本使用及依赖管理。