org.apache.tomcat.util.bcel.classfile.ClassFormatException: Thẻ byte không hợp lệ trong nhóm hằng số: 15


81

Tôi đang chuyển một ứng dụng web từ Tomcat 7 sang một máy chủ khác với Tomcat 7 nhưng với Java 8.

Tomcat khởi động thành công nhưng trong nhật ký catalina.outtôi nhận được:

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)

Điều gì có thể là vấn đề?


Bạn cần khía cạnhJ 1.8 để được hỗ trợ Java 8. stackoverflow.com/questions/23801950/...
Anant Laxmikant Bobde

@AnantLaxmikantBobde Điều đó không liên quan đến nguyên nhân của sự cố này, đó là sự không tương thích bytecode giữa phiên bản cụ thể của Tomcat và phiên bản JDK đó. Xem câu trả lời này để biết cách sửa lỗi chính xác.
vallismortis

Câu trả lời:


86

"Câu trả lời chính thức" là Tomcat 7 chạy trên Java 8, xem http://tomcat.apache.org/whichversion.html ("Java phiên bản 6 trở lên").

Tuy nhiên, nếu tính năng quét chú thích được bật (metadata-complete = "true" trong web.xml) thì có một số vấn đề do BCEL (không thể xử lý mã Java 8 byte mới). Bạn sẽ nhận được các ngoại lệ như (ít nhất là với 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)

Nếu không sử dụng tính năng quét chú thích, mọi thứ hoạt động tốt, bắt đầu từ phiên bản 7.0.53 (trình biên dịch được cập nhật với hỗ trợ Java 8 tốt hơn).

(CẬP NHẬT 2014-10-17) Nếu bạn đang sử dụng tính năng quét chú thích mã của riêng bạn không dựa trên Java 8, một giải pháp khác là thêm dòng sau vào /etc/tomcat7/catalina.properties(văn bản được thêm sau "ant-launcher.jar" nên một phần của thuộc tính tomcat.util.scan.DefaultJarScanner.jarsToSkip):

junit.jar,junit-*.jar,ant-launcher.jar,\
jfxrt.jar,nashorn.jar

Đã thử nghiệm với Tomcat 7.0.28 và Oracle JDK 8_25 trên Debian 7.6.


Tomcat 7,054 vẫn doesnt hỗ trợ cờ jdk8 -compiler, câu hỏi liên quan về stackoverflow.com/questions/25279729/...
Gerrit Brink

1
Để làm rõ: Nếu metadata-complete = "true" có trong web.xml, quá trình xử lý chú thích sẽ bị vô hiệu hóa, phải không?
Christian K.

Có thể, nhận xét đã lỗi thời, nhưng việc thay đổi tomcat từ 7.0.23 thành 8.0.18 sẽ tự động giải quyết vấn đề cho tôi [Windows 7]
Yauhen

Modifiying tomcat.util.scan.DefaultJarScanner.jarsToSkip trong catalina.properties đã làm việc cho Tomcat 8 cho tôi. (Ít nhất nó cũng tiết lộ các vấn đề khác!)
JGFMK 27/09/17

1
@SamuelThompson Xem câu trả lời này cho việc sửa chữa chính xác cho Tomcat 8.
vallismortis

28

Đây là một lỗi Tomcat xuất hiện trở lại với mã bytecode của Java 9. Các phiên bản chính xác sửa lỗi này (cho cả Java 8/9 bytecode) là:

  • thân cho 9.0.0.M18 trở đi
  • 8.5.x cho 8.5.12 trở đi
  • 8.0.x cho 8.0.42 trở đi
  • 7.0.x cho 7.0.76 trở đi

2
Đây giải quyết vấn đề đối với tôi (JDK 8 với Tomcat 8.0.27 thất bại)
pablo

1
Tôi gặp sự cố này với tomcat 8.0.36 và log4j-api-2.11.0.jar
stephan f

2
Điều này đã giải quyết vấn đề. Cập nhật phiên bản Tomcat của bạn
LFelix

8

Cập nhật lên Tomcat 7.0.58 (hoặc mới hơn).

Xem: https://bz.apache.org/bugzilla/show_bug.cgi?id=57173#c16

Cải thiện hiệu suất kích hoạt hồi quy này đã được hoàn nguyên từ thân cây, 8.0.x (cho 8.0.16 trở đi) và 7.0.x (cho 7.0.58 trở đi) và sẽ không được áp dụng lại.


2
Tôi không tìm thấy bất kỳ liên quan nào đến java 8 trong liên kết này.
Michael_S

2

Sự cố này đang xảy ra vì bạn đã cài đặt jre1.8.0_101-1.8.0_101-fcs.i58.rpm cũng như jdk-1.7.0_80-fcs.x86_64.rpm. vì vậy chỉ cần gỡ cài đặt jre rpm và khởi động lại ứng dụng của bạn. Nó sẽ diễn ra.


1

Đối với tôi, nâng cấp bcel lên 6.0 đã khắc phục sự cố.


1

Đối với tôi, nó đã hoạt động, bằng cách loại bỏ những chiếc lọ được đề cập từ chiến tranh. Với Maven, tôi chỉ cần loại trừ ví dụ

    <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. cập nhật và nối đối số bên dưới vào <root or instance tomcat folder>/conf/catalina.properties

org.apache.catalina.startup.ContextConfig.jarsToSkip=...,lombok-1.18.4.jar

2. dọn dẹp và triển khai dự án to-be-pulish.


Tôi đã phải hoàn nguyên về phiên bản 1.14.8 (AFAIK với cùng các tính năng chính, vì vậy không có vấn đề gì lớn ở đây)
ATorras

0

Tôi gặp phải vấn đề này với tomcat 7 + jdk 1.8

với java 1.7 và các phiên bản thấp hơn, nó hoạt động tốt.

window -> tùy chọn -> java -> jre đã cài đặt

trong trường hợp của tôi, tôi đã thay đổi jre1.8 thành JDK 1.7

và theo đó sửa đổi khía cạnh dự án, chọn phiên bản java giống như phiên bản java có trong JRE đã cài đặt đã chọn.


@AshishRatan Xem câu trả lời này cho việc sửa chữa chính xác cho JDK 8.
vallismortis

0

Tôi gặp lỗi tương tự (org.aspectj.apache.bcel.classfile.ClassFormatException: Thẻ byte không hợp lệ trong nhóm hằng số: 15) khi sử dụng khía cạnhj 1.8.13. Giải pháp là căn chỉnh tất cả biên dịch thành jdk 8 và cẩn thận không đặt các phiên bản khác của thư viện khía cạnh (1.6.13) vào buildpath / classpath.


0

Tôi đã gặp vấn đề tương tự khi chạy ứng dụng khởi động mùa xuân của mình với tomcat7: run

Nó gây ra lỗi với phần phụ thuộc sau trong 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

Nhưng khi tôi chỉ định chính xác nó trong phạm vi kiểm tra, nó không đưa ra lỗi:

    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <scope>test</scope>
    </dependency>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.