Отказ Javassist в в спящем режиме: недопустимый постоянный тип: 60

Я создаю cli инструмент для управления существующим приложением. И приложение и тесты создают прекрасный и хорошо работают, но несмотря на это я получаю javassist отказ при выполнении моего cli инструмента, который существует в банке:

INFO: Bytecode provider name : javassist
...
INFO: Hibernate EntityManager 3.5.1-Final
Exception in thread "main" javax.persistence.PersistenceException: Unable to configure EntityManagerFactory
        at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:371)
        at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:55)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
        ...
        at com.sophware.flexipol.admin.AdminTool.<init>(AdminTool.java:40)
        at com.sophware.flexipol.admin.AdminTool.main(AdminTool.java:69)
Caused by: java.lang.RuntimeException: Error while reading file:flexipol-jar-with-dependencies.jar
        at org.hibernate.ejb.packaging.NativeScanner.getClassesInJar(NativeScanner.java:131)
        at org.hibernate.ejb.Ejb3Configuration.addScannedEntries(Ejb3Configuration.java:467)
        at org.hibernate.ejb.Ejb3Configuration.addMetadataFromScan(Ejb3Configuration.java:457)
        at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:347)
        ... 11 more
Caused by: java.io.IOException: invalid constant type: 60
        at javassist.bytecode.ConstPool.readOne(ConstPool.java:1027)
        at javassist.bytecode.ConstPool.read(ConstPool.java:970)
        at javassist.bytecode.ConstPool.<init>(ConstPool.java:127)
        at javassist.bytecode.ClassFile.read(ClassFile.java:693)
        at javassist.bytecode.ClassFile.<init>(ClassFile.java:85)
        at org.hibernate.ejb.packaging.AbstractJarVisitor.checkAnnotationMatching(AbstractJarVisitor.java:243)
        at org.hibernate.ejb.packaging.AbstractJarVisitor.executeJavaElementFilter(AbstractJarVisitor.java:209)
        at org.hibernate.ejb.packaging.AbstractJarVisitor.addElement(AbstractJarVisitor.java:170)
        at org.hibernate.ejb.packaging.FileZippedJarVisitor.doProcessElements(FileZippedJarVisitor.java:119)
        at org.hibernate.ejb.packaging.AbstractJarVisitor.getMatchingEntries(AbstractJarVisitor.java:146)
        at org.hibernate.ejb.packaging.NativeScanner.getClassesInJar(NativeScanner.java:128)
        ... 14 more

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

cglib находится определенно в пути к классу:

$ unzip -l flexipol-jar-with-dependencies.jar | grep cglib | wc -l
383

Я попробовал и в спящем режиме 3.4 и 3.5 и получаю ту же самую ошибку. Действительно ли это - проблема с javassist?

ОБНОВЛЕНИЕ: Я могу запустить приложение успешно в Eclipse (Щелчок правой кнопкой-> Выполнение Как-> JAVA-приложение), но использование сгенерированных знатоками сбоев банки с зависимостями. Я предполагаю, что различие - то, что с Eclipse javassist не осматривает содержание банки, скорее это осматривает все файлы класса (и возможно несколько зависимых сторонних банок).

6
задан Kaleb Pederson 12 June 2010 в 00:22
поделиться

1 ответ

Проблема в конечном итоге вызвана недопустимым классом в icu4j-2.6.1 , как видно из этого сообщения . В частности, этот файл недействителен:

com/ibm/icu/impl/data/LocaleElements_zh__PINYIN.class

Вот простой способ идентифицировать поврежденный файл:

for x in PATH_TO_EXTRACTED_JAR/**/*.class; do
    java -cp PATH_TO/javassist.jar javassist.tools.Dump $x >/dev/null 2>&1 || echo "$x is invalid"
done

Этот файл косвенно включается maven через его транзитивные зависимости, поэтому я не распознал, что эта страница ссылается на ошибку и файл, содержащийся в банке, является виновником и причиной проблемы. Вот как он оказался в моем пакете jar-with-dependencies:

jaxen-1.1.1 -> xom-1.0 -> icu4j-2.6.1

После добавления следующего исключения к зависимости jaxen у меня все работало правильно (но будьте осторожны, если вам нужны его части локализации) :

<exclusions>
    <exclusion>
        <groupId>com.ibm.icu</groupId>
        <artifactId>icu4j</artifactId>
    </exclusion>
</exclusions>

Другой вариант - удалить файл (ы) с нарушением из jar-файла:

#!/bin/sh                                                                                                                                                                                                                                    
shopt -s extglob
shopt -s globstar
for x in **/*.jar ; do
    zip -d $x 'com/ibm/icu/impl/data/*_zh*' >/dev/null 2>&1 && echo "Removed corrupted files from $x"
done
19
ответ дан 8 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: