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


83

Tomcat7からJava8を使用してTomcat7を使用する別のサーバーにWebアプリを移植しています。

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をサポートするには、aspectJ1.8が必要です。stackoverflow.com/questions/23801950/...
Anant Laxmikant Bobde

@AnantLaxmikantBobdeこれは、この問題の原因とは関係ありません。これは、特定のバージョンのTomcatとそのバージョンのJDKの間のバイトコードの非互換性です。正しい修正については、この回答を参照してください。
vallismortis

回答:


86

「公式の答えは、」Javaの8上のTomcat 7実行されることで、参照 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サポートを備えた更新されたコンパイラ)以降、すべてが正常に機能します。

(更新2014-10-17) されている注釈スキャン使用して、独自のコードは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

Debian7.6上のTomcat7.0.28およびOracleJDK8_25でテスト済み。


7.054 TOMCATまだdoesntのjdk8 -compilerフラグ、上の関連する質問サポートstackoverflow.com/questions/25279729/...
ヘリット・ブリンク

1
明確にするために:metadata-complete = "true"がweb.xmlにある場合、注釈処理を無効にする必要がありますよね?
クリスチャンK.

[Windowsの7]おそらく、コメントが古いですが、7.0.23から8.0.18にTomcatを変更すると、自動的に私のための問題を解決
Yauhen

catalina.properties内のtomcat.util.scan.DefaultJarScanner.jarsToSkipを変更すると、Tomcat8で機能しました。(少なくとも他の問題が明らかになりました!)
JGFMK 2017

1
@SamuelThompson Tomcat 8の正しい修正については、この回答を参照してください。
vallismortis19年

30

これはTomcatのバグであり、Java9バイトコードで再び表面化しました。これを修正する正確なバージョン(両方の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
これで問題は解決しました(Tomcat8.0.27を搭載したJDK8は失敗しました)
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.プルするプロジェクトをクリーンアップしてデプロイします。


私はに戻す必要があった1.14.8バージョン(同じ主要な特徴を持つ私の知る限り、ので、ここでは大したことない)
ATorras

0

私はtomcat7 + jdk1.8でこの問題に直面しました

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

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

私の場合、jre1.8をJDK1.7に変更しました

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


@AshishRatan JDK 8の正しい修正については、この回答を参照してください。
vallismortis19年

0

アスペクトJ1.8.13の使用中に、同様のエラー(org.aspectj.apache.bcel.classfile.ClassFormatException:定数プールの無効なバイトタグ:15)が発生しました。解決策は、すべてのコンパイルをjdk 8に揃え、aspectjライブラリ(たとえば1.6.13)の他のバージョンをbuildpath / classpathに入れないように注意することでした。


0

tomcat7:runを使用してSpringBootアプリケーションを実行するときに同じ問題が発生しました

mavenpom.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.