Przenoszę aplikację internetową z Tomcat 7 na inny serwer z Tomcat 7, ale z Javą 8.
Tomcat uruchamia się pomyślnie, ale w dzienniku catalina.out
otrzymuję:
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)
Jaki może być problem?
Odpowiedzi:
„Oficjalna odpowiedź” jest taka, że Tomcat 7 działa na Javie 8, patrz http://tomcat.apache.org/whichversion.html („Java w wersji 6 i nowszych”).
Jeśli jednak włączone jest skanowanie adnotacji (metadata-complete = "true" w pliku web.xml), występują pewne problemy wynikające z BCEL (niemożność przetworzenia nowych 8-bajtowych kodów Java). Otrzymasz wyjątki, takie jak (przynajmniej z 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)
Jeśli nie używasz skanowania adnotacji, wszystko działa dobrze, począwszy od wersji 7.0.53 (zaktualizowany kompilator z lepszą obsługą Java 8).
(Aktualizacja 17.10.2014) Jeśli Twój są przy użyciu skanowania adnotacji i własny kod Java 8 nie jest oparta, innym rozwiązaniem jest dodanie następującej linii w
/etc/tomcat7/catalina.properties
(tekst dodaje się po „mrówek” tak launcher.jar części majątkutomcat.util.scan.DefaultJarScanner.jarsToSkip
):Testowane z Tomcat 7.0.28 i Oracle JDK 8_25 w systemie Debian 7.6.
źródło
To był błąd Tomcata, który pojawił się ponownie wraz z kodem bajtowym Java 9. Dokładne wersje, które to naprawiają (dla obu kodu bajtowego Java 8/9) to:
źródło
Zaktualizuj do Tomcat 7.0.58 (lub nowszej).
Zobacz: https://bz.apache.org/bugzilla/show_bug.cgi?id=57173#c16
źródło
Ten problem występuje, ponieważ zainstalowano jre1.8.0_101-1.8.0_101-fcs.i58.rpm, a także jdk-1.7.0_80-fcs.x86_64.rpm. więc po prostu odinstaluj swój jre rpm i uruchom ponownie aplikację. Powinno się udać.
źródło
Dla mnie aktualizacja bcel do wersji 6.0 rozwiązała problem.
źródło
U mnie to zadziałało, usuwając te słoiki z wojny. W przypadku Mavena po prostu musiałem na przykład wykluczyć
źródło
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. zaktualizuj i dołącz poniższy argument w
<root or instance tomcat folder>/conf/catalina.properties
org.apache.catalina.startup.ContextConfig.jarsToSkip=...,lombok-1.18.4.jar
2. oczyścić i wdrożyć projekt, który ma być gotowy.
źródło
Napotkałem ten problem z tomcat 7 + jdk 1.8
z java 1.7 i niższymi wersjami działa dobrze.
okno -> preferencje -> java -> zainstalowany jre
w moim przypadku zmieniłem jre1.8 na JDK 1.7
i odpowiednio zmodyfikuj aspekt projektu, wybierz tę samą wersję java, jaka jest w wybranym zainstalowanym środowisku JRE.
źródło
Wystąpił podobny błąd (org.aspectj.apache.bcel.classfile.ClassFormatException: Invalid bajt tag w stałej puli: 15) podczas korzystania z aspektu 1.8.13. Rozwiązaniem było wyrównywanie całej kompilacji do jdk 8 i uważanie, aby nie umieszczać innych wersji biblioteki aspektuj (na przykład 1.6.13) w buildpath / classpath.
źródło
Miałem ten sam problem podczas uruchamiania aplikacji do rozruchu wiosennego z tomcat7: run
Daje błąd z następującą zależnością w maven pom.xml:
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
Ale kiedy poprawnie określę to w zakresie testowym, nie daje błędu:
źródło