You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot 3.0.1部署Payara 6报错:PermittedSubclasses需ASM8/9

问题描述

我完成了项目依赖与环境的升级,具体包括:

  • 从OpenJDK 11升级至OpenJDK 17.0.2
  • 从JavaEE迁移至Jakarta 9
  • 从SpringBoot 2.7.4升级至3.0.1

项目可成功构建,但部署到运行OpenJDK 17的Payara Server 6.2022.2时,持续抛出报错,Spring无法启动。我已确认SpringBoot最新版本支持Java 17环境,请问是否存在依赖缺失问题?

项目配置

pom.xml

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.1</version>
    <relativePath/> 
</parent>
<version>1.0</version>
<packaging>war</packaging>

<properties>
    <java.version>17</java.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>tomcat-embed-logging-juli</artifactId>
                <groupId>org.apache.tomcat.embed</groupId>
            </exclusion>
            <exclusion>
                <artifactId>tomcat-embed-websocket</artifactId>
                <groupId>org.apache.tomcat.embed</groupId>
            </exclusion>
            <exclusion>
                <artifactId>tomcat-embed-el</artifactId>
                <groupId>org.apache.tomcat.embed</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-loader</artifactId>
    </dependency>     
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-jose</artifactId>
    </dependency>
    <dependency>
        <groupId>jakarta.platform</groupId>
        <artifactId>jakarta.jakartaee-api</artifactId>
        <version>9.0.0</version>
        <type>jar</type>
    </dependency>
</dependencies>

module-info.java

requires jakarta.jakartaee.api;
requires spring.beans;
requires spring.boot;
requires spring.boot.loader;
requires spring.boot.autoconfigure;
requires spring.context;
requires spring.core;
requires spring.security.config;
requires spring.security.core;
requires spring.security.web;
requires spring.web;

Application类代码

import com.xyz.web.application.resources.env;
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication 
@EnableConfigurationProperties(env.class)
public class Application extends SpringBootServletInitializer {
        
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

Payara Server报错日志

严重:   访问大小为2202的org/springframework/beans/factory/aot/BeanRegistrationsAotContribution$Registration.class时发生异常
java.lang.UnsupportedOperationException: Record requires ASM8
    at org.objectweb.asm.ClassVisitor.visitRecordComponent(ClassVisitor.java:305)
    at org.objectweb.asm.ClassReader.readRecordComponent(ClassReader.java:953)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:731)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
    at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:164)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:130)
    at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321)
    at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

严重:   访问大小为3703的org/springframework/boot/cloud/CloudPlatform.class时发生异常
java.lang.UnsupportedOperationException: PermittedSubclasses requires ASM9
    at org.objectweb.asm.ClassVisitor.visitPermittedSubclass(ClassVisitor.java:266)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:706)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
    at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:164)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:130)
    at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321)
    at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

严重:   访问大小为1750的org/springframework/boot/context/config/ConfigDataNotFoundAction.class时发生异常
java.lang.UnsupportedOperationException: PermittedSubclasses requires ASM9
    at org.objectweb.asm.ClassVisitor.visitPermittedSubclass(ClassVisitor.java:266)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:706)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
    at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:164)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:130)
    at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321)
    at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

严重:   访问大小为9179的org/springframework/boot/jdbc/DatabaseDriver.class时发生异常
java.lang.UnsupportedOperationException: PermittedSubclasses requires ASM9
    at org.objectweb.asm.ClassVisitor.visitPermittedSubclass(ClassVisitor.java:266)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:706)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
    at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:164)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:130)
    at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321)
    at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

严重:   访问大小为3821的org/springframework/boot/convert/DurationStyle.class时发生异常
java.lang.UnsupportedOperationException: PermittedSubclasses requires ASM9
    at org.objectweb.asm.ClassVisitor.visitPermittedSubclass(ClassVisitor.java:266)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:706)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
    at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:164)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:130)
    at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321)
    at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

严重:   访问大小为3986的org/springframework/boot/convert/PeriodStyle.class时发生异常
java.lang.UnsupportedOperationException: PermittedSubclasses requires ASM9
    at org.objectweb.asm.ClassVisitor.visitPermittedSubclass(ClassVisitor.java:266)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:706)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:424)
    at org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:164)
    at com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:130)
    at org.glassfish.hk2.classmodel.reflect.Parser.doJob(Parser.java:321)
    at org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:280)
    at org.glassfish.hk2.classmodel.reflect.Parser$3.call(Parser.java:269)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)

问题分析与解决方案

这不是依赖缺失问题,核心原因是Payara Server 6.2022.2内置的HK2类解析器使用的ASM版本过低,无法处理Spring Boot 3.x中用到的Java 17特性:

  • Java 16引入的Record类型需要ASM8解析
  • Java 17引入的PermittedSubclasses属性需要ASM9解析

解决方案

  1. 升级Payara Server版本:升级到Payara Server 6.2023.1及以上版本,这些版本已经更新了ASM依赖,完全兼容Spring Boot 3.x。
  2. 禁用HK2类扫描:如果暂时无法升级服务器,可在项目中添加WEB-INF/glassfish-web.xml配置,跳过Spring相关类的扫描:
<glassfish-web-app>
    <class-loader delegate="false"/>
    <property name="hk2.metadata.populator.disable" value="true"/>
</glassfish-web-app>
  1. 排查依赖冲突:检查pom.xml中是否存在低版本ASM依赖,Spring Boot 3.x会自动管理ASM版本,无需手动引入,若有间接依赖的低版本ASM,需排除。

内容的提问来源于stack exchange,提问作者barry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:35:18