Java Jar地狱运行时异常

3

在运行单元测试时,我遇到了Jar Hell的问题。

java.lang.RuntimeException: found jar hell in test classpath
    at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:95)
    at org.elasticsearch.test.ESTestCase.<clinit>(ESTestCase.java:99)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at com.carrotsearch.randomizedtesting.RandomizedRunner$2.run(RandomizedRunner.java:585)
Caused by: java.lang.IllegalStateException: jar hell!
class: org.apache.commons.io.CopyUtils
jar1: C:\Users\vvenkatasubbu\.gradle\caches\modules-2\files-2.1\commons-io\commons-io\1.3.2\b6dde38349ba9bb5e6ea6320531eae969985dae5\commons-io-1.3.2.jar
jar2: C:\Users\vvenkatasubbu\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-io\1.3.2\b6dde38349ba9bb5e6ea6320531eae969985dae5\commons-io-1.3.2.jar
    at org.elasticsearch.bootstrap.JarHell.checkClass(JarHell.java:282)
    at org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:186)
    at org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:87)
    at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:93)
    ... 4 more

我遇到了如上所示的错误,通过删除不必要的jar文件解决了这些问题。
但是我遇到了以下两个jar包的问题,即tomcat-embed-core-8.0.36.jar和hibernate-jpa-2.1-api-1.0.0.Final.jar。这两个jar包之间有一个公共类,我需要同时使用这两个jar包,有人能解释一下如何解决这个问题吗?我需要同时使用这两个jar包。
java.lang.RuntimeException: found jar hell in test classpath
        at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:95)
        at org.elasticsearch.test.ESTestCase.<clinit>(ESTestCase.java:99)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at com.carrotsearch.randomizedtesting.RandomizedRunner$2.run(RandomizedRunner.java:585)
    Caused by: java.lang.IllegalStateException: jar hell!
    class: javax.persistence.PersistenceProperty
    jar1: C:\Users\vvenkatasubbu\.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-core\8.0.36\de87fa65671daad59773c8280eeabbd335f42c\tomcat-embed-core-8.0.36.jar
    jar2: C:\Users\vvenkatasubbu\.gradle\caches\modules-2\files-2.1\org.hibernate.javax.persistence\hibernate-jpa-2.1-api\1.0.0.Final\5e731d961297e5a07290bfaf3db1fbc8bbbf405a\hibernate-jpa-2.1-api-1.0.0.Final.jar
        at org.elasticsearch.bootstrap.JarHell.checkClass(JarHell.java:282)
        at org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:186)
        at org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:87)
        at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:93)
        ... 4 more

提前感谢。


你确定在测试期间需要它们两个吗?属于这两个JAR包的类的名称是什么? - Mysterion
1
我需要在运行应用程序时使用它,而不是在进行集成测试时。 - devanathan
你正在使用Maven吗?可以显示你的pom.xml文件吗?你可以将它们设为“provided”或类似的内容,以隐藏它们不参与测试。 - Mysterion
1
以下是可用的依赖项:providedRuntime('org.springframework.boot:spring-boot-starter-tomcat:1.3.7.RELEASE') compile('org.springframework.boot:spring-boot-starter-data-jpa:1.3.7.RELEASE') compile('org.springframework.boot:spring-boot-starter-web:1.3.7.RELEASE') - devanathan
1个回答

5
我已经通过在单元测试源文件中覆盖JarHell类来修复它。
我所做的步骤如下:
1. 在测试文件夹中创建一个单独的包。 org.elasticsearch.bootstrap 2. 创建一个新的类并粘贴以下代码。
package org.elasticsearch.bootstrap;

import java.net.URL;

public class JarHell {
    private JarHell() {}
    public static void checkJarHell() throws Exception {}
    public static void checkJarHell(URL urls[]) throws Exception {}
    public static void checkVersionFormat(String targetVersion) {}
    public static void checkJavaVersion(String resource, String targetVersion) {}
    public static URL[] parseClassPath() {return new URL[]{};}
}
  1. 在执行gradlew build时,问题已得到解决。

  2. 若要单独运行集成测试,请将以下行添加到运行配置的VM参数中。

    -ea -Dtests.security.manager=false

这看起来更像是一种变通方法而不是解决方案,对吧? - jzonthemtn
1
是的,@jbird,由于我们无法解决实际问题。 - devanathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接