2010-06-12 3 views
6

기존 응용 프로그램을 관리하기 위해 cli 도구를 만들고 있습니다. 단지 내에 존재 내 CLI 도구를 실행할 때 응용 프로그램과 테스트를 모두 잘 구축하고 잘 실행하지만, 그럼에도 불구하고 나는와 Javassist 실패가 나타날 수최대 절전 모드에서의 Javassist 오류 : 유효하지 않은 상수 유형 : 60

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 응용 프로그램)에서 응용 프로그램을 성공적으로 실행할 수는 있지만 생성 된 jar-with-dependencies는 실패합니다. 차이점은 이클립스의 javassist가 포함 된 jar를 검사하지 않는다는 것입니다. 오히려 모든 클래스 파일 (및 일부 종속 타사 jar 파일)을 검사하고 있습니다.

답변

19

this post에서 볼 수 있듯이 문제는 궁극적으로 잘못된 클래스 인 icu4j-2.6.1에 의해 발생합니다. 특히,이 파일이 잘못되었습니다 : 'I didn를 이유입니다 자사의 이적 의존성을 받는다는에 의해이 파일은 간접적으로 포함되고

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 

: 여기

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

가 손상된 파일을 식별하는 간단한 방법 그 페이지를 오류를 참조하는 것으로 인식하고 항아리 내에 포함 된 파일을 문제의 원인과 원인으로 인식합니다. (하지만 당신은 현지화 조각을 필요로하는 경우주의), 모든 것이 나를 위해 제대로 일

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 
+0

스캔 코드 앞에'shopt 내부 -s globstar'를 추가하는 것을 잊지 마세요 게시물의 상단에. –

관련 문제