插件依赖的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 的 <pluginManagement>
部分中声明 <plugin>
。
您在<dependencyManagement>
部分将com.google.gwt:gwt-user
定义为<dependency>
。
我不确定您是否打算将 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依赖管理的主要内容,如果未能解决你的问题,请参考以下文章