如何在JDK 19中运行结构化并发?遇NoClassDefFoundError错误
问题:运行使用结构化并发(JEP 428)的Java项目时出现
NoClassDefFoundError - 尝试使用JEP 428:结构化并发(孵化器版本)这一Project Loom新特性
- 创建了使用
StructuredTaskScope类的库项目,编译正常 - 创建了测试项目演示该库的使用,编译也正常
- 两个项目的pom.xml中均配置了maven-compiler-plugin:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <release>19</release> <compilerArgs> <arg>--enable-preview</arg> <arg>--add-modules=jdk.incubator.concurrent</arg> </compilerArgs> </configuration> </plugin>
- 运行测试项目时出现错误,执行命令:
java -jar target/com.tugalsan.tst.thread-1.0-SNAPSHOT-jar-with-dependencies.jar --enable-preview --add-modules jdk.incubator.concurrent
错误信息:
Exception in thread "main" java.lang.NoClassDefFoundError: jdk/incubator/concurrent/StructuredTaskScope at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1013) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at com.tugalsan.api.thread.server.TS_ThreadFetchAll.<init>(TS_ThreadFetchAll.java:44) at com.tugalsan.api.thread.server.TS_ThreadFetchAll.of(TS_ThreadFetchAll.java:85) at com.tugalsan.tst.thread.Main.main(Main.java:13) Caused by: java.lang.ClassNotFoundException: jdk.incubator.concurrent.StructuredTaskScope at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 12 more
- 尝试使用
--add-modules=jdk.incubator.concurrent格式,问题依旧
解决方法
核心问题是JVM参数位置错误:使用java -jar命令时,所有JVM参数必须放在-jar和jar包路径之前,否则这些参数会被当作程序的命令行参数传递给main方法,而非被JVM处理。
正确运行命令
java --enable-preview --add-modules jdk.incubator.concurrent -jar target/com.tugalsan.tst.thread-1.0-SNAPSHOT-jar-with-dependencies.jar
可选:用Maven插件简化运行
如果不想每次手动输入参数,可以配置exec-maven-plugin,在pom.xml中添加:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <mainClass>com.tugalsan.tst.thread.Main</mainClass> <jvmArgs> <jvmArg>--enable-preview</jvmArg> <jvmArg>--add-modules=jdk.incubator.concurrent</jvmArg> </jvmArgs> </configuration> </plugin>
之后直接执行mvn exec:java即可运行项目,无需手动输入JVM参数。
内容的提问来源于stack exchange,提问作者Tugalsan Karabacak
相关产品推荐
相关产品推荐

