2016-08-02 2 views
3

Я столкнулся с проблемой jar hell во время выполнения модульного теста.Java Jar hell Runtime Exception

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.

Но я столкнулся с проблемой со следующими двумя банками: 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 

Заранее спасибо.

+0

вы уверены, что вам нужны оба из них во время ваших тестов? Каково название класса, которое принадлежит обоим банкам? – Mysterion

+1

Мне нужно, чтобы во время запуска приложения. Не делая тест интеграции, – devanathan

+0

вы используете maven? показать свой pom.xml? вы можете сделать их предоставленными или что-то вроде этого, скрыть от тестов – Mysterion

ответ

3

Я исправил его, переопределив класс 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[]{};} 
        } 
    

  3. выпуск был зафиксирован, делая gradlew сборки.

  4. Для запуска интеграционного теста отдельно добавьте строку ниже в аргументы виртуальной машины в конфигурациях запуска.

-ea -Dtests.security.manager=false

+0

Это больше похоже на обходное решение, чем на решение, верно? – jbird

+0

yes @jbird, так как мы не можем исправить настоящую проблему. – devanathan