Intellij IDEA + Gradle + JavaFX:java.lang.ClassNotFoundException 一个 "Run Configuration" 而不是另一个

IntellijIDEA + Gradle + JavaFX: java.lang.ClassNotFoundException for one "Run Configuration" but not the other

Intellij IDEA 的不良行为让我抓狂:

我有一个(Gradle-based)项目,其中有两个主要的 classes 是用 Java 编写的,每个都在自己的包中。

两者都使用 JavaFX,因此需要一些特殊的“运行 配置”。

两种情况下的配置都相同(如果不必处理巴洛克式的复杂文本框集,只需将所有内容都放在属性值文本描述中就好了,那也可以复制粘贴,但我离题了)

应用程序“HelloFX”一切正常,但应用程序“ImageViewExample”的消息是“Class 'pack2.ImageViewExample' 在模块 'JavaFXTrial.main' 中找不到。

有些东西阻止了 Intellij IDEA(或者更确切地说,Gradle 运行时间?)在一种情况下发现主要 class,但在另一种情况下则不然。

编译确实完美,编译后:

JavaFxTrial/
├── build
│   ├── classes
│   │   └── java
│   │       └── main
│   │           ├── pack1
│   │           │   └── HelloFX.class
│   │           └── pack2
│   │               └── ImageViewExample.class
│   │
│   │

我也可以从命令行启动 class。

所以这在命令行和 Intellij IDEA 中有效:

JAVA=/usr/local/java
IDEA_PROJECTS=$HOME/Development/idea_projects

$JAVA/jdk15_64_adopt/bin/java \
--module-path $JAVA/javafx/javafx-sdk-16/lib/ \
--add-modules javafx.controls \
-cp $IDEA_PROJECTS/JavaFxTrial/build/classes/java/main \
pack1.HelloFX

但这只是调用另一个 class 的主要部分,在 Intellij IDEA 中不起作用:

JAVA=/usr/local/java
IDEA_PROJECTS=$HOME/Development/idea_projects

$JAVA/jdk15_64_adopt/bin/java \
--module-path $JAVA/javafx/javafx-sdk-16/lib/ \
--add-modules javafx.controls \
-cp $IDEA_PROJECTS/JavaFxTrial/build/classes/java/main \
pack2.ImageViewExample

确实漏掉了什么,但是什么?

更新:

当右键单击“运行 ImageViewExample.main()”时(我认为这意味着“运行 通过 Gradle 插件”)(运行 HelloFX.main()" 结果成功),得到消息:

JavaFX runtime components are missing, and are required to run this application

这与“Class 未找到”不太一样。

运行ning "with info" 然后显示 Gradle 插件 运行 启动 "ImageViewExample" 的命令行将所有 JavaFX Gradle 在 CLASSPATH 而不是模块路径上缓存的 jars,这显然因

而失败
Error: JavaFX runtime components are missing, and are required to run this application

这可能与它有关...

更新:但可能不会。

右键单击 运行 只是拼凑出一个 运行 配置,这显然是错误的...但至少找到了主要的 class.

更新更新

通过添加模块路径修复由 Intellij IDEA 创建的 运行 配置使得“运行 配置”尽管有错误“运行 配置”和新的(现在工作)“运行 配置”表面上看起来完全一样。

更新^3

即使在查看项目的 .idea/workspace.xml 时,工作和非工作 运行 配置也是相同的.. 除了非工作的未标记为 temporary

<component name="RunManager" selected="Application.ImageViewExampleB"> 

   <configuration name="HelloFX" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true"> 
     <option name="MAIN_CLASS_NAME" value="pack1.HelloFX" /> 
     <module name="JavaFxTrial.main" /> 
     <option name="VM_PARAMETERS" value="--module-path /usr/local/java/javafx/javafx-sdk-16/lib/ --add-modules javafx.controls " /> 
     <method v="2"> 
       <option name="Make" enabled="true" /> 
     </method> 
   </configuration> 
   
   <configuration name="ImageViewExample" type="Application" factoryName="Application"> 
     <option name="MAIN_CLASS_NAME" value="pack2.ImageViewExample " /> 
     <module name="JavaFxTrial.main" /> 
     <option name="VM_PARAMETERS" value="--module-path /usr/local/java/javafx/javafx-sdk-16/lib/ --add-modules javafx.controls" /> 
     <method v="2"> 
       <option name="Make" enabled="true" /> 
     </method> 
   </configuration> 
   
   <configuration name="ImageViewExampleB" type="Application" factoryName="Application" temporary="true"> 
     <option name="MAIN_CLASS_NAME" value="pack2.ImageViewExample" /> 
     <module name="JavaFxTrial.main" /> 
     <option name="VM_PARAMETERS" value="--module-path /usr/local/java/javafx/javafx-sdk-16/lib/ --add-modules javafx.controls" /> 
     <extension name="coverage"> 
       <pattern> 
         <option name="PATTERN" value="pack2.*" /> 
         <option name="ENABLED" value="true" /> 
       </pattern> 
     </extension> 
     <method v="2"> 
       <option name="Make" enabled="true" /> 
     </method> 
   </configuration> 
   
   <configuration name="JavaFxTrial" type="GradleRunConfiguration" factoryName="Gradle" temporary="true"> 
     <ExternalSystemSettings> 
       <option name="executionName" /> 
       <option name="externalProjectPath" value="$PROJECT_DIR$" /> 
       <option name="externalSystemIdString" value="GRADLE" /> 
       <option name="scriptParameters" value="--info" /> 
       <option name="taskDescriptions"> 
         <list /> 
       </option> 
       <option name="taskNames"> 
         <list /> 
       </option> 
       <option name="vmOptions" value="" /> 
     </ExternalSystemSettings> 
     <ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess> 
     <ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess> 
     <DebugAllEnabled>false</DebugAllEnabled> 
     <method v="2" /> 
   </configuration> 
   <list> 
     <item itemvalue="Application.ImageViewExample" /> 
     <item itemvalue="Application.HelloFX" /> 
     <item itemvalue="Application.ImageViewExampleB" /> 
     <item itemvalue="Gradle.JavaFxTrial" /> 
   </list> 
   <recent_temporary> 
     <list> 
       <item itemvalue="Application.ImageViewExampleB" /> 
       <item itemvalue="Gradle.JavaFxTrial" /> 
       <item itemvalue="Application.HelloFX" /> 
     </list> 
   </recent_temporary> 
</component>

此设置中的移动部件太多。不喜欢。

好的。

事实证明,Build 和 运行 的小部件对空格敏感...

如果查看 workspace.xml 文件,这一点就会变得很明显

<option name="MAIN_CLASS_NAME" value="pack2.ImageViewExample " /> 

这就是为什么 XML 不应该被轻易拒绝作为配置语言的原因。

一个明显的迹象,如果你知道要寻找什么:

嗯,这很简单。

提交给 JetBrains 的错误报告。