Springframework:PermissibleSubclasses 需要 ASM8/9

bar*_*rry 7 java spring spring-boot payara jakarta-migration

我已经更新了我的项目的库和依赖项,包括:

  1. 从 OpenJDK 11 到 OpenJDK 17.0.2
  2. 从 JavaEE 到 Jakarta 9
  3. 从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>
Run Code Online (Sandbox Code Playgroud)

模块信息的内容

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;
Run Code Online (Sandbox Code Playgroud)

应用类:

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Payara服务器的日志:

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

严重:访问大小为 3703 的 org/springframework/boot/cloud/CloudPlatform.class 时出现异常 java.lang.UnsupportedOperationException:PermissionSubclasses 需要 ASM9 位于 org.objectweb.asm.ClassVisitor.visitPermissedSubclass(ClassVisitor.java:266) 位于 org.objectweb。 asm.ClassReader.accept(ClassReader.java:706) 在 org.objectweb.asm.ClassReader.accept(ClassReader.java:424) 在 org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336 )在 com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:164) 在 com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:130) 在 org.glassfish.hk2。 classmodel.reflect.Parser.doJob(Parser.java:321) 在 org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44) 在 org.glassfish.hk2.classmodel.reflect.Parser$3。在 org.glassfish.hk2.classmodel.reflect.Parser$3 处调用(Parser.java:280)。在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)处调用(Parser.java:269) )在java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)在java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)在java.base/ java.lang.Thread.run(Thread.java:833)

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

严重:访问大小为 9179 的 org/springframework/boot/jdbc/DatabaseDriver.class 时出现异常 java.lang.UnsupportedOperationException:PermissionSubclasses 需要 ASM9 位于 org.objectweb.asm.ClassVisitor.visitPermissionSubclass(ClassVisitor.java:266) 处。 asm.ClassReader.accept(ClassReader.java:706) 在 org.objectweb.asm.ClassReader.accept(ClassReader.java:424) 在 org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336 )在 com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:164) 在 com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:130) 在 org.glassfish.hk2。 classmodel.reflect.Parser.doJob(Parser.java:321) 在 org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44) 在 org.glassfish.hk2.classmodel.reflect.Parser$3。在 org.glassfish.hk2.classmodel.reflect.Parser$3 处调用(Parser.java:280)。在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)处调用(Parser.java:269) )在java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)在java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)在java.base/ java.lang.Thread.run(Thread.java:833)

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

严重:访问大小为 3986 的 org/springframework/boot/convert/PeriodStyle.class 时出现异常 java.lang.UnsupportedOperationException:PermissionSubclasses 需要 ASM9 位于 org.objectweb.asm.ClassVisitor.visitPermissionSubclass(ClassVisitor.java:266) 处。 asm.ClassReader.accept(ClassReader.java:706) 在 org.objectweb.asm.ClassReader.accept(ClassReader.java:424) 在 org.glassfish.hk2.classmodel.reflect.Parser$5.on(Parser.java:336 )在 com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.handleEntry(ReadableArchiveScannerAdapter.java:164) 在 com.sun.enterprise.v3.server.ReadableArchiveScannerAdapter.onSelectedEntries(ReadableArchiveScannerAdapter.java:130) 在 org.glassfish.hk2。 classmodel.reflect.Parser.doJob(Parser.java:321) 在 org.glassfish.hk2.classmodel.reflect.Parser.access$300(Parser.java:44) 在 org.glassfish.hk2.classmodel.reflect.Parser$3。在 org.glassfish.hk2.classmodel.reflect.Parser$3 处调用(Parser.java:280)。在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)处调用(Parser.java:269) )在java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)在java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)在java.base/ java.lang.Thread.run(Thread.java:833)

Mar*_*ark 5

我在使用 Gradle 从命令行构建 Spring Boot 3 项目时遇到了类似的情况。对我有用的解决方案是升级 Gradle 版本。我从 7.2 升级到 7.6,解决了 ASM9 问题。

distributionUrl查看以in开头的行gradle-wrapper.properties,位于gradle/wrapper

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Run Code Online (Sandbox Code Playgroud)