为什么我在生产模式下打包 Vaadin 24 时收到“无法调用 java.lang.Class.isInterface()”错误?

问题描述 投票:0回答:2

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

vaadin vaadin-flow
2个回答
0
投票

作为生产构建的一部分,会扫描类路径以查找某些注释的类,例如

@JsModule
。这是为了能够创建最终应用程序中使用的 JavaScript 包。

所做的基本上是:

  1. 为所有可用类设置类加载器
  2. 使用
    reflections
    库查找带有注释的类型,例如
    @JsModule
  3. 收集所有
    @JsModule
    注释中的值并构建 JavaScript 包

第 2 步是这里出错的地方,并且找到了具有给定注释的类,但是当尝试加载该类时,无法加载该类。

正如您所提到的,一个问题可能是该类使用预览功能,而您尚未为生产版本启用预览功能。 https://github.com/vaadin/flow/issues/16577中描述的另一种情况是包含使用较新的 JDK 编译的依赖项 jar。

您应该能够通过在 IDE 中以调试模式运行 Maven 目标并添加

NullPointerException
断点来找到有问题的类。然后可能就会清楚真正的问题是什么。


0
投票

今天早上也遇到这个问题。代码编译得很好。只有 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) 预览功能。

© www.soinside.com 2019 - 2024. All rights reserved.