Java Jar hell 运行时异常

标签 java elasticsearch integration-testing

我在运行单元测试时遇到了 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 文件。

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

提前致谢。

最佳答案

我已通过覆盖单元测试源文件夹中的 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 构建时得到解决。

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

    -ea -Dtests.security.manager=false

关于Java Jar hell 运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38712251/

相关文章:

java - 是否有用于读取 maven2/3 pom xml 文件的库?

java - 如何扫描同一个包内的txt?

json - Elasticsearch 观察器和 Microsoft Teams webhook

Java ArrayList<ArrayList<String>> 子级上的clear() 清除父级

Elasticsearch Multi Get 与聚合

elasticsearch - 查找包含带有特殊字符的子字符串的文档

java - 单元测试必须位于同一个包中?

ruby-on-rails - 在 rspec 集成测试中测试移动设备但无法设置 session

javascript - API 的集成与单元测试

java - CommonsMultipartFile 的 Jackson 序列化问题