TrueZip: NoClassDefFoundError (но только для перехвата отключения?)
У меня есть проект, использующий PhantomJS. Есть этот плагин, который установит его автоматически:
<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
Добавление этих (согласно этой теме):
<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>
не помогает (получаю такое же сообщение об ошибке).
Однако: бинарный файл загружается и распаковывается. Системное свойство устанавливается. Тесты, которые зависят от этой работы, работают отлично.
Также,
$ 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
... так что включена только одна версия.
2 ответа
Я не знаю много о PhantomJS, но, как вы поняли, исключение вызывается крюком отключения. Этот хук является сетью безопасности, которая фиксирует любые ожидающие изменения в архивных файлах TrueZIP. Вы можете легко удалить его, позвонив по телефону de.schlichtherle.truezip.file.TVFS.umount()
незадолго до завершения JVM. Пожалуйста, заверните звонок в finally
-блок, чтобы он вызывался, даже если приложение завершается с Throwable.
Если вы выполните его через java -jar
или ваш плагин maven вызывает цель "за пределами" предоставленной области, установите область зависимостей в compile
,
Я смог исправить это, изменив версию java с IBM java 1.7 на IBM java 1.8 (ibm_sdk_8.0.3.0) или Oracle java 1.8 (jdk_1.8.0.91_64). Вы можете проверить свою версию Java, набрав
java -version
в терминале или командной строке. ОС = Windows 10