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


83

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)

무엇이 문제일까요?


Java 8 지원을 받으려면 aspectJ 1.8이 필요합니다. stackoverflow.com/questions/23801950/...
아난 Laxmikant Bobde에게

@AnantLaxmikantBobde Tomcat의 특정 버전과 JDK 버전 간의 바이트 코드 비 호환성 인이 문제의 원인과는 관련이 없습니다. 올바른 수정 사항 은 이 답변 을 참조하십시오 .
vallismortis

답변:


86

"공식적인 대답"은 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로 테스트되었습니다.


7.054 바람둥이 여전히 나던 jdk8 -compiler 플래그에 관련된 질문 지원 stackoverflow.com/questions/25279729/...
리트 직전

1
명확히하기 위해 : 만약 metadata-complete = "true"가 web.xml 주석 처리에 있다면 비활성화되어야합니다. 그렇죠?
Christian K.

아마도 댓글이 오래되었지만 바람둥이를 7.0.23에서 8.0.18로 변경하면 자동으로 문제가 해결됩니다. [Windows 7]
Yauhen

catalina.properties 내에서 tomcat.util.scan.DefaultJarScanner.jarsToSkip을 수정하면 Tomcat 8에서 작동했습니다. (적어도 다른 문제가 드러났습니다!)
JGFMK

1
참조 @SamuelThompson 이 답변을 톰캣 (8)의 올바른 해결을 위해
vallismortis

30

이것은 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

2
이것은 나를 위해 문제를 해결했습니다 (Tomcat 8.0.27이있는 JDK 8 실패)
pablo

1
나는 tomcat 8.0.36 및 log4j-api-2.11.0.jar에서이 문제를 얻습니다
stephan f

2
이것은 문제를 해결했습니다. Tomcat 버전 업데이트
LFelix


2

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


1

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


1

나에게 그것은 전쟁에서 문제의 항아리를 제거함으로써 작동했습니다. 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>

1
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 프로젝트를 정리하고 배포합니다.


나는에 복귀했다 1.14.8 버전 (같은 주요 기능을 AFAIK 그래서 큰 문제가 없습니다 여기에)
ATorras

0

나는 tomcat 7 + jdk 1.8 에서이 문제에 직면했습니다.

Java 1.7 이하 버전에서는 잘 작동합니다.

창-> 환경 설정-> 자바-> 설치된 jre

제 경우에는 jre1.8을 JDK 1.7로 변경했습니다.

그에 따라 프로젝트 패싯을 수정하고 선택한 설치된 JRE에있는 것과 동일한 Java 버전을 선택합니다.


참조 @AshishRatan 이 답변을 JDK 8의 올바른 해결을 위해
vallismortis

0

aspectj 1.8.13을 사용하는 동안 비슷한 오류 (org.aspectj.apache.bcel.classfile.ClassFormatException : Invalid byte tag in constant pool : 15)가 발생했습니다. 해결책은 모든 컴파일을 jdk 8로 정렬하고 aspectj 라이브러리 (예 : 1.6.13)의 다른 버전을 buildpath / classpath에 넣지 않도록주의하는 것이 었습니다.


0

tomcat7 : run으로 스프링 부트 애플리케이션을 실행할 때 동일한 문제가 발생했습니다.

maven pom.xml에서 다음 종속성에 오류가 발생합니다.

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
    </dependency>
SEVERE: Unable to process Jar entry [module-info.class] from Jar [jar:file:/.m2/repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19

Jul 09, 2020 1:28:09 PM org.apache.catalina.startup.ContextConfig processAnnotationsJar
SEVERE: Unable to process Jar entry [module-info.class] from Jar [jar:file:/.m2/repository/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19

그러나 테스트 범위에서 올바르게 지정하면 오류가 발생하지 않습니다.

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
    </dependency>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.