vinoth kumar vinoth kumar - 4 months ago 107
Java Question

Java Jar hell Runtime Exception

I am facing the issue with jar hell while running the unit test.

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


I have got the error like above, resolved those by removing the unnecessary jar file.

But i am facing the issue with the following two jar namely tomcat-embed-core-8.0.36.jar and hibernate-jpa-2.1-api-1.0.0.Final.jar. There is one common class between these two i need both the jar file, can anyone explain me how to resolve the issue. I need both the jar file.

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


Thanks in advance.

Answer

I have fixed it by overriding the JarHell class in the unit test sorce folder.

Steps i have done

  1. create a separate package in the test folder.

    org.elasticsearch.bootstrap

  2. Create a new class and paste the following code.

    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[]{};}
        }
    

  3. Issue was fixed while doing the gradlew build.

  4. To run the integration test separately add the below line to VM arguments in the run configurations.

-ea -Dtests.security.manager=false