2015-07-07 3 views
2

У меня есть проект с использованием PhantomJS. Существует плагин, который установит его автоматически:TrueZip: NoClassDefFoundError (но только для выключения крюка?)

 <plugin> 
     <groupId>com.github.klieber</groupId> 
     <artifactId>phantomjs-maven-plugin</artifactId> 
     <version>0.2.1</version> 
     <executions> 
      <execution> 
      <goals> 
       <goal>install</goal> 
      </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <version>1.9.2</version> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.18.1</version> 
     <configuration> 
      <systemPropertyVariables> 
      <phantomjs.binary>${phantomjs.binary}</phantomjs.binary> 
      </systemPropertyVariables> 
     </configuration> 
     </plugin> 

И я получаю эту ошибку:

[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 17.665 s 
[INFO] Finished at: 2015-07-07T13:27:39+02:00 
[INFO] Final Memory: 31M/175M 
[INFO] ------------------------------------------------------------------------ 
java.lang.NoClassDefFoundError: de/schlichtherle/truezip/fs/FsSyncOptions 
    at de.schlichtherle.truezip.fs.FsSyncShutdownHook$Hook.run(FsSyncShutdownHook.java:93) 
Caused by: java.lang.ClassNotFoundException: de.schlichtherle.truezip.fs.FsSyncOptions 
    at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) 
    at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:259) 
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:235) 
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:227) 
    ... 1 more 

Добавление этих (в соответствии с this thread):

<dependency> 
    <!-- For the PhantomJS install plugin --> 
    <groupId>de.schlichtherle.truezip</groupId> 
    <artifactId>truezip-driver-file</artifactId> 
    <version>7.7.9</version> 
</dependency> 
<dependency> 
    <!-- For the PhantomJS install plugin --> 
    <groupId>de.schlichtherle.truezip</groupId> 
    <artifactId>truezip-kernel</artifactId> 
    <version>7.7.9</version> 
</dependency> 
<dependency> 
    <!-- For the PhantomJS install plugin --> 
    <groupId>de.schlichtherle.truezip</groupId> 
    <artifactId>truezip-driver-zip</artifactId> 
    <version>7.7.9</version> 
</dependency> 

не помогает (I получить то же сообщение об ошибке).

Однако: Бинарный файл загружается и распаковывается. Системное свойство получает значение. Тесты, которые зависят от этого рабочего режима, отлично.

Кроме того,

$ mvn dependency:tree | grep truezip 
[INFO] +- de.schlichtherle.truezip:truezip-driver-file:jar:7.7.9:compile 
[INFO] +- de.schlichtherle.truezip:truezip-kernel:jar:7.7.9:compile 
[INFO] +- de.schlichtherle.truezip:truezip-driver-zip:jar:7.7.9:compile 
[INFO] | +- de.schlichtherle.truezip:truezip-swing:jar:7.7.9:compile 

... так что только одна версия включена.

+0

Похожее: [Alfresco Maven SDK - сбой] (https://stackoverflow.com/q/29511318/55075). – kenorb

ответ

0

Если вы выполните его с помощью java -jar, или ваш плагин maven вызывает цель «снаружи» предоставленной области, установите область зависимостей в compile.

+0

Изменение области видимости не устранило ошибку. Пробовали «компилировать» и «тестировать». –

+0

Это также может быть проблемой класса (и я думаю, что это действительно так): как вы выполняете свои цели/запускаете приложение? – user

+0

Интересно, что это происходит только при запуске «mvn clean test» (который также загружает PhantomJS), а не при запуске «mvn test» (который уже установил PhantomJS). Похоже, что в самом плагине есть ошибка. –

1

Я мало знаю о PhantomJS, но, как вы поняли, исключение выбрасывается крючком выключения. Этот крючок является защитной сетью, которая фиксирует любые ожидающие изменения архивные файлы с помощью TrueZIP. Вы можете легко удалить его, позвонив de.schlichtherle.truezip.file.TVFS.umount() непосредственно перед завершением JVM. Пожалуйста, заверните вызов в finally -блоке, чтобы убедиться, что он вызван, даже если приложение завершается с помощью Throwable.

+0

Где именно я должен поставить этот вызов, так как это плагин, который вызывает исключение? –

+0

Полагаю, вам нужно связаться с авторами плагина и сообщить им, чтобы добавить отсутствующий звонок. Его нет на их конце, и вы не можете с этим поделать. –

Смежные вопросы