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)
何が問題なのでしょうか?
「公式の答え」は、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でテスト済み。
これは Tomcatのバグ で、Java 9バイトコードで再び表面化しました。これを修正する正確なバージョン(Java 8/9バイトコードの両方)は次のとおりです。
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にアップグレードすると問題は解決しました。
私にとっては、問題の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に置かないように注意することでした。
Tomcat 7 + jdk 1.8でこの問題に直面しました
Java 1.7以前のバージョンでは正常に動作しています。
ウィンドウ->設定-> Java->インストールされたjre
私の場合、jre1.8をJDK 1.7に変更しました
それに応じてプロジェクトファセットを変更し、選択したインストール済みJREにある同じJavaバージョンを選択します。