[java] org.apache.tomcat.util.bcel.classfile.ClassFormatException : 상수 풀의 잘못된 바이트 태그 : 15

Tomcat 7에서 Java 8을 사용하는 다른 서버로 Tomcat 7에서 웹 응용 프로그램을 이식하고 있습니다.

Tomcat이 성공적으로 시작되지만 로그에는 다음 catalina.out이 표시됩니다.

org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15
    at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:131)
    at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:60)
    at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:209)
    at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:119)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2049)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1931)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1899)
    at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1885)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1281)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:855)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:346)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5172)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1100)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1618)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

무엇이 문제일까요?



답변

“공식적인 대답”은 Tomcat 7이 Java 8에서 실행된다는 것입니다.
http://tomcat.apache.org/whichversion.html(“Java 버전 6 이상 “)을 참조하세요.

그러나 주석 스캔이 활성화 된 경우 (web.xml의 metadata-complete = “true”) BCEL로 인해 몇 가지 문제가 있습니다 (새 Java 8 바이트 코드를 처리 할 수 ​​없음). 다음과 같은 예외가 발생합니다 (적어도 Tomcat 7.0.28에서는).

SEVERE: Unable to process Jar entry [jdk/nashorn/internal/objects/NativeString.class] from Jar [jar:file:/usr/lib/jvm/jdk1.8.0_5/jre/lib/ext/nashorn.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15
    at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:131)

주석 스캔을 사용 하지 않는 경우 릴리스 7.0.53 (더 나은 Java 8 지원으로 업데이트 된 컴파일러)부터 모든 것이 잘 작동합니다.

(UPDATE 2014년 10월 17일) 귀하의 경우 하는 주석을 사용한 스캔 기반 자바 (8) 자신의 코드를하지 않는 또 다른 솔루션에 다음 줄을 추가하는 것입니다 /etc/tomcat7/catalina.properties(재산의 일부 있도록 “개미 launcher.jar”이후에 추가 텍스트 tomcat.util.scan.DefaultJarScanner.jarsToSkip) :

junit.jar,junit-*.jar,ant-launcher.jar,\
jfxrt.jar,nashorn.jar

Debian 7.6에서 Tomcat 7.0.28 및 Oracle JDK 8_25로 테스트되었습니다.


답변

이것은 Java 9 바이트 코드로 다시 출현 한 Tomcat 버그 였습니다 . 이 문제를 수정하는 정확한 버전 (Java 8/9 바이트 코드 모두)은 다음과 같습니다.

  • 9.0.0.M18 이후의 트렁크
  • 8.5.12 이상의 경우 8.5.x
  • 8.0.42 이상의 경우 8.0.x
  • 7.0.76 이상의 경우 7.0.x


답변

Tomcat 7.0.58 이상으로 업데이트합니다.

참조 : https://bz.apache.org/bugzilla/show_bug.cgi?id=57173#c16

이 회귀를 유발 한 성능 향상은 트렁크, 8.0.x (8.0.16 이상) 및 7.0.x (7.0.58 이상)에서 되돌아 왔으며 다시 적용되지 않습니다.


답변

이 문제는 jre1.8.0_101-1.8.0_101-fcs.i58.rpm과 jdk-1.7.0_80-fcs.x86_64.rpm을 설치했기 때문에 발생합니다. jre rpm을 제거하고 응용 프로그램을 다시 시작하십시오. 잘 될 것입니다.


답변

나에게 bcel을 6.0으로 업그레이드하면 문제가 해결되었습니다.


답변

나에게 그것은 전쟁에서 문제의 항아리를 제거함으로써 작동했습니다. Maven을 사용하면 예를 들어 제외해야했습니다.

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
        <version>${resteasy.version}</version>
        <exclusions>
            <exclusion>
                <groupId>com.sun.istack</groupId>
                <artifactId>istack-commons-runtime</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.jvnet.staxex</groupId>
                <artifactId>stax-ex</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>txw2</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.xml.fastinfoset</groupId>
                <artifactId>FastInfoset</artifactId>
            </exclusion>
        </exclusions>
    </dependency>


답변

Unable to process Jar entry [module-info.class] from Jar [jar:file:/xxxxxxxx/lombok-1.18.4.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19

1. 업데이트 및 아래 인수 추가 <root or instance tomcat folder>/conf/catalina.properties

org.apache.catalina.startup.ContextConfig.jarsToSkip=...,lombok-1.18.4.jar

2) to-be-pulish 프로젝트를 정리하고 배포합니다.