【问题标题】:Solving a jar hell with maven?用maven解决罐子地狱?
【发布时间】:2014-01-14 08:33:20
【问题描述】:

我正在使用两个 jar A 和 B。B 是一个库,A 的类使用库 B 中的一些旧类。现在,当我在项目类路径中包含两个 jar 时,这给我带来了问题,因为有两个类的名称相同,但其中一个比另一个旧并且行为不同。

我发现这个问题的一个解决方案是首先将库 B 导入 Eclipse,然后单击“确定”并构建项目。然后我添加 jar A。这样我现有的所有代码都将使用 B 的较新版本,而 A 的类将保持不变。

但是现在我想在我的项目中使用 Maven,但我不知道如何再次使用 Maven 制作这个技巧。请帮忙。

【问题讨论】:

  • maven 没有 jar hell :) 但是你的旧配置像 jar hell 解决方案一样臭。
  • @MariuszS 不错,但它是一种更好的地狱。
  • 它在哪里? :) 使用 Maven,只有一个罐子可能。
  • @MariuszS 也许你误会了。之前的解决方案是在使用maven之前完成的。现在我学习了 maven,我想应用相同的技巧,但使用 maven。
  • 我认为这是不可能的,只需使用 jar A 和 B 进行清理即可。

标签: java eclipse maven jar


【解决方案1】:

也许你可以通过重命名你不想要的类的包来解决你的问题。

你可以使用Maven Shade Plugin来做到这一点

这个插件允许在编译时重命名包名。

用法:

   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
        <phase>package</phase>
        <goals>
            <goal>shade</goal>
            </goals>
        <configuration>
                <relocations>
                    <relocation>
                            <pattern>com.example.package.name.YourClass</pattern>
                               <shadedPattern>com.example.rename.package.name.YourClass</shadedPattern>
                    </relocation>
                </relocations>
                    <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
        </configuration>
        </execution>
    </executions>
</plugin>

【讨论】:

    【解决方案2】:

    这不一定是 Maven 问题。默认的类加载器会根据类路径中 jar 的顺序来搜索类。当您将 jars 添加到 Eclipse 时,您这样做的方式是确保它们的顺序将确保加载正确的类 - 特别是 B 出现在 A 之前的类路径中,因此,当两个 jars 中存在同一个类时,它将被加载来自 B.

    从 Maven 2.0.9 版本开始,类路径是按照 POM 中依赖的顺序构建的。因此,如果在依赖项 A 之前声明了依赖项 B,您应该会得到与 Eclipse 相同的行为。

    不用说,以这种方式依赖类路径顺序是相当脆弱的,如果可能的话,我个人希望清理 jar。

    【讨论】:

    • 然后确保 pom 中有非常清晰的 cmets 表明依赖关系的顺序很重要,以防万一有人想在此过程中整理并重新排序它们。
    【解决方案3】:

    这个问题非常真实(除非对我来说)。 如果您检测到哪些库是冲突的,您可以使用exclusions 来阻止导入您不想要的库。 如果你不知道有什么冲突的库,在eclipse中使用默认的maven插件,你可以打开pom文件并在右栏中选择“依赖层次结构”选项卡,你可以看到你项目的所有已解决的依赖关系,在左边哪个库导入每个依赖项。

    希望对你有帮助。

    【讨论】:

    • 这是关于类冲突,而不是依赖冲突。 Eclipse dosent 从 jar 中读取依赖项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多