Vaadin 24 - 生产模式开启:打包时构建前端出错/无法调用“java.lang.Class.isInterface()”
虽然应用程序在使用 spring-boot:run 启动时运行良好,但我们无法实现打包目标。
在构建前端阶段显示以下错误:
[ERROR] Failed to execute goal com.vaadin:vaadin-maven-plugin:24.0.5:build-frontend (default-cli) on project myproj: Could not execute build-frontend goal: Error occured during goal execution: Cannot invoke "java.lang.Class.isInterface()" because the return value of "org.reflections.Reflections.forClass(String, java.lang.ClassLoader[])" is nullPlease run Maven with the -e switch (or Gradle with the --stacktrace switch), to learn the full stack trace. -> [Help 1]
[ERROR]
POM 非常基础,带有 cfg :
<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<vaadin.version>24.0.5</vaadin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
使用 JDK17 执行目标
错误仅在生产配置文件中显示。没有效果也很好。 我在早期 Vaadin 版本上发现了相同的错误报告,解决了添加 --enable-preview,但无法在此处使用 JDK17 / Vaadin24
作为生产构建的一部分,会扫描类路径以查找某些注释的类,例如
@JsModule
。这是为了能够创建最终应用程序中使用的 JavaScript 包。
所做的基本上是:
reflections
库查找带有注释的类型,例如@JsModule
@JsModule
注释中的值并构建 JavaScript 包第 2 步是这里出错的地方,并且找到了具有给定注释的类,但是当尝试加载该类时,无法加载该类。
正如您所提到的,一个问题可能是该类使用预览功能,而您尚未为生产版本启用预览功能。 https://github.com/vaadin/flow/issues/16577中描述的另一种情况是包含使用较新的 JDK 编译的依赖项 jar。
您应该能够通过在 IDE 中以调试模式运行 Maven 目标并添加
NullPointerException
断点来找到有问题的类。然后可能就会清楚真正的问题是什么。
今天早上也遇到这个问题。代码编译得很好。只有 vaadin-maven-plugin 失败了。
尝试了 Arthur 的建议来调试编译过程。这确实给了我哪个页面类导致问题的答案。但是,我仍然希望能够使用预览功能,而不是被限制在某些类中无法使用它们。
所以我必须弄清楚如何以及在哪里添加缺少的
--enable-preview
标志,因为编译器显然已经有了该设置,而 vaadin 插件无法添加它。
我认为 Maven java 进程应该以
--enable-preview
设置启动,这样当 Vaadin maven 插件需要完成其工作时,就会在进程中设置它。
当然,有多种方法可以做到这一点。
export JAVA_OPTS="--enable-preview"
不起作用export JAVA_TOOL_OPTIONS="--enable-preview"
确实有效,但坚持该项目并不容易。最终决定将包含内容
.mvn/jvm.config
的 --enable-preview
文件添加到项目中。这由 Maven 获取(请参阅配置 Maven),并且很容易在 Git 中检查,因此每个人都拥有它。
这样我们就可以在 Vaadin 页面类中使用 Java (21) 预览功能。