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 编写的,每个都在自己的包中。
- 一个叫做“HelloFX”
- 一个叫做“ImageViewExample”
两者都使用 JavaFX,因此需要一些特殊的“运行 配置”。
- 对于“HelloFX”
- 对于“ImageViewExample”
两种情况下的配置都相同(如果不必处理巴洛克式的复杂文本框集,只需将所有内容都放在属性值文本描述中就好了,那也可以复制粘贴,但我离题了)
应用程序“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 的错误报告。
Intellij IDEA 的不良行为让我抓狂:
我有一个(Gradle-based)项目,其中有两个主要的 classes 是用 Java 编写的,每个都在自己的包中。
- 一个叫做“HelloFX”
- 一个叫做“ImageViewExample”
两者都使用 JavaFX,因此需要一些特殊的“运行 配置”。
- 对于“HelloFX”
- 对于“ImageViewExample”
两种情况下的配置都相同(如果不必处理巴洛克式的复杂文本框集,只需将所有内容都放在属性值文本描述中就好了,那也可以复制粘贴,但我离题了)
应用程序“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 的错误报告。