【问题标题】:Excluding Maven Plugin Dependency With System Scope使用系统范围排除 Maven 插件依赖
【发布时间】:2015-09-16 09:08:28
【问题描述】:

我有一个环境,我需要安装多个 JDK 来编译不同的项目。但是,aspectj-maven-plugin 声明了对 com.sun:tools 的依赖,其中版本设置为 jre 版本,systemPath 设置为 JAVA_HOME。

当然,除非 JAVA_HOME 的 JDK 是给定项目的预期 JDK,否则这是错误的。

以前,我们自己的代码需要 tools.jar 时遇到了一些问题,因此我通过在我们的 Nexus 实例中安装 tools.jar 并为我们的 pom 文件添加适当的依赖项来解决问题。

我想做的是强制 aspectj-maven-plugin 在我们的 Nexus 实例中使用 tools.jar,就像我们自己的代码现在所做的那样,而不是使用系统范围依赖项。

我尝试通过对 com.sun:tools 依赖项的嵌套排除来添加对插件的依赖项,但它似乎不起作用。

我还尝试通过包含对 com.sun:tools:1.8 的依赖项来覆盖插件的依赖项,该依赖项可以在我们的 Nexus 中找到,但由于某种原因,它只尝试从 Maven Central 下载它而忽略了我们的 Nexus实例。

我觉得我很接近,但我错过了让它发挥作用的精确咒语。

有什么想法吗?

【问题讨论】:

  • 当您覆盖插件依赖项时,您是否明确设置覆盖范围?
  • 我想是的。我试过编译。我相信,我也尝试过没有范围。编辑:将范围设置为运行时似乎也失败了,因为它仍在 Maven Central 而不是 Nexus 上查找 tools.jar。
  • 覆盖 标记内的依赖项听起来是个好方法。当然,仅将 com.sun:tools 添加到 标记将无济于事。您可以尝试在 部分而不是常规的 部分中进行覆盖。
  • 为什么不将它添加到依赖项中?
  • 用于您项目的直接依赖项。如果要覆盖 的依赖项,请在 标记内进行。我举个例子。

标签: maven aspectj nexus


【解决方案1】:

覆盖插件的依赖是在<plugin>标签内完成的,例如

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-plugin-plugin</artifactId>
      <version>3.3</version>
      <dependencies>
        <dependency>
          <groupId>com.sun</groupId>
          <artifactId>tools</artifactId>
          <version>1.7.0</version>
          <scope>runtime</scope>
        </dependency>
      </dependencies>
    </plugin>
 </plugins>
</build>

另请参阅:https://maven.apache.org/pom.html#Plugins

我将上面示例中的范围设置为 runtime - 其想法是它应该覆盖插件自己的 POM 为该依赖项定义的 system 范围。请注意,我没有测试它。

此外,如果您希望从内部存储库中下载插件,则必须在您的 pom 中添加一个 &lt;pluginRepositories&gt; 部分 - 一个常规的 &lt;repositories&gt; 部分再次只会影响直接依赖项:

<pluginRepositories>
  <pluginRepository>
    <id>your-internal-nexus-id</id>
    <url>http://your.nexus.com/repository/path</url>
  </pluginRepository>
</pluginRepositories>

另见:https://maven.apache.org/pom.html#Plugin_Repositories

Maven 可能会缓存以前的解析失败。确保您使用参数“-U”尝试下一个构建 - 或 - 您 purge the "lastUpdated" files from your repo

【讨论】:

  • 啊,好的。我没明白你之前的意思。是的,this 是我尝试过的,但没有成功。我认为它覆盖了依赖项,但它不会在我们的 Nexus 中搜索依赖项。它只是尝试 Maven Central 并放弃。
  • 我扩展了答案以提及如何配置插件存储库。它们需要在 POM(或 settings.xml)中单独声明。
  • 啊!这可能是问题所在。让我试一试。
  • 这似乎按预期工作,但我需要再测试一下。谢谢!
  • 酷。如果它解决了您的问题,请不要忘记接受答案。
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 2023-04-01
  • 1970-01-01
  • 2014-10-26
  • 2016-04-17
  • 2019-11-25
  • 2011-08-27
  • 2021-09-28
相关资源
最近更新 更多