【问题标题】:Maven define sub-dependency for included JAR dependencyMaven为包含的JAR依赖定义子依赖
【发布时间】:2015-07-29 03:30:13
【问题描述】:

我正在开发一个 Java 项目,使用 maven 作为我们的依赖管理器/构建工具。我目前在解决依赖项对正确版本的依赖时遇到问题。

有问题的依赖项称为 jasperreports-functions-6.1.0.jar,它不是托管在 maven 存储库中,而是以 jar 形式提供。

我遇到的问题是 jasperreports-functions 需要 commons-lang 2.6。不方便的是,在“编译”期间,Maven 本身会构建 commons-lang 2.1 来创建缩减的 pom。这似乎导致 jasperreports-functions 尝试使用 commons-lang 2.1,因为它可用,但这无效(运行时方法未定义的错误。)

我尝试将 commons-lang 2.6 添加为依赖项,但 jasperreports-functions 似乎仍在使用 2.1 版本。

pom.xml snip:

    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>6.1.0</version>
    </dependency>

    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports-functions</artifactId>
        <version>6.1.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/jasperreports-functions-6.1.0.jar</systemPath>
    </dependency>

    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>

使用 "mvn dependency:tree" 我可以看到没有依赖项需要 commons-lang。

如果我从“.m2\repository\commons-lang\commons-lang”中删除 2.1,它将由 maven 重新创建。如果我清空文件夹并锁定它的权限,然后再次运行 maven,我会收到错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-jar-plugin:2.4:jar (default-jar) on project JavaLibrary: Execution default-jar of goal org.apache.maven.plugins:maven-jar-plugin:2.4:jar failed: Plugin org.apache.maven.plugins:maven-jar-plugin:2.4 or one of its dependencies could not be resolved: Failed to collect dependencies at org.apache.maven.plugins:maven-jar-plugin:jar:2.4 -> commons-lang:commons-lang:jar:2.1: Failed to read artifact descriptor for commons-lang:commons-lang:jar:2.1: Could not transfer artifact commons-lang:commons-lang:pom:2.1 from/to central (https://repo.maven.apache.org/maven2): C:\Users\Lowell\.m2\repository\commons-lang\commons-lang\2.1\commons-lang-2.1.pom.part.lock (Access is denied) -> [Help 1]

如何强制 jar 依赖使用某个版本的子依赖?

【问题讨论】:

    标签: java maven jar


    【解决方案1】:

    您是否尝试过重新排序依赖项, 首先加载 commons-lang 然后加载 jasperreports ? 编辑: 也许这对你有帮助:dependency:analyze-dep-mgt

    【讨论】:

    • 重新排序似乎没有帮助。我已经尝试过您的第二个建议,但也没有帮助,但我会继续研究。
    • 您是否尝试将 commons-lang 2.6 库添加到本地 maven 存储库并将 pom.xml 指向该库?
    【解决方案2】:

    你所做的应该足够了。较新的版本应该覆盖旧版本,并且您明确指定的版本应该覆盖任何临时依赖项。我相信 Maven 2.x 在这方面存在问题,这就是我更新到 Maven 3.x 的原因

    我怀疑问题出在其他地方。我建议尝试删除 common-lang 2.1,我怀疑这应该告诉你真正的问题是什么。

    【讨论】:

    • 我将研究 Maven 3。请参阅我在主帖中关于删除 2.1 的编辑
    • 这表明 maven-jar-plugin 需要 commons-lang 2.1。你确定 jasper 在运行时使用它吗?
    • 是的,看起来 maven 使用 2.1 来创建简化的 pom。我相当肯定 Jasper 使用的是 2.1,因为我收到了一个未定义的方法错误,而且我调用的方法直到 2.6 才引入。编辑:事实证明我已经在使用 maven 3.3
    【解决方案3】:

    试试这个:
    1> Maven clean。
    2> 右键单击​​项目->maven -> 更新项目配置->强制更新

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 2014-06-08
      • 2015-07-12
      • 2010-12-16
      • 2016-06-04
      相关资源
      最近更新 更多