web-dev-qa-db-ja.com

org.Apache.Tomcat.util.bcel.classfile.ClassFormatException:定数プールの無効なバイトタグ:15

Tomcat 7からJava 8を使用して、Tomcat 7から別のサーバーにwebappを移植しています。

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)

何が問題なのでしょうか?

63
JackTurky

「公式の答え」は、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)

アノテーションスキャンを使用してnotの場合、リリース7.0.53からすべて正常に動作します(Java 8のサポートが改善されたコンパイラを更新)。

(UPDATE 2014-10-17)注釈スキャンを使用するareand独自のコードはJava 8ベースではありません。別の解決策は、/etc/Tomcat7/catalina.propertiesに次の行を追加することです(「ant-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でテスト済み。

72
rmuller

これは Tomcatのバグ で、Java 9バイトコードで再び表面化しました。これを修正する正確なバージョン(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
13
vallismortis

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以降)から元に戻されており、再適用されません。

8
Saulo Silva

Jre1.8.0_101-1.8.0_101-fcs.i58.rpmとjdk-1.7.0_80-fcs.x86_64.rpmもインストールしているため、この問題が発生しています。 jre rpmをアンインストールして、アプリケーションを再起動するだけです。うまくいくはずです。

2
C Karthickeyan

私にとって、bcelを6.0にアップグレードすると問題は解決しました。

1
Cody

私にとっては、問題のjarファイルを戦争から削除することで機能しました。 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>

Aspectj 1.8.13の使用中に、同様のエラー(org.aspectj.Apache.bcel.classfile.ClassFormatException:定数プール内の無効なバイトタグ:15)が発生しました。解決策は、すべてのコンパイルをjdk 8に合わせ、Aspectjライブラリ(たとえば1.6.13)の他のバージョンをbuildpath/classpathに置かないように注意することでした。

0
yılmaz

Tomcat 7 + jdk 1.8でこの問題に直面しました

Java 1.7以前のバージョンでは正常に動作しています。

ウィンドウ->設定-> Java->インストールされたjre

私の場合、jre1.8をJDK 1.7に変更しました

それに応じてプロジェクトファセットを変更し、選択したインストール済みJREにある同じJavaバージョンを選択します。

0
Neelam Chahal