Intellij IDEA 让我因不良行为而发疯:
我有一个(基于 Gradle 的)项目,其中包含两个用 Java 编写的主要类,每个类都在自己的包中。
- 一种叫做“HelloFX”
- 一种叫做“ImageViewExample”
两者都使用 JavaFX,因此需要一些特殊的“运行配置”。
- 对于“HelloFX”
- 对于“ImageViewExample”
两种情况下的配置都是相同的(最好不必处理一组巴洛克式的复杂文本框,只需将所有内容都放在属性值文本描述中,也可以复制粘贴,但我离题了)
对于应用程序“HelloFX”,一切都运行良好,但对于应用程序“ImageViewExample”,消息是在模块“JavaFXTrial.main”中找不到“类'pack2.ImageViewExample'。
有些东西阻止了 Intellij IDEA(或者更确切地说,Gradle 运行时?)在一种情况下发现主类,但在另一种情况下则不然。
编译后,编译肯定工作得很好:
JavaFxTrial/
├── build
│ ├── classes
│ │ └── java
│ │ └── main
│ │ ├── pack1
│ │ │ └── HelloFX.class
│ │ └── pack2
│ │ └── ImageViewExample.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
但这只是调用另一个类的主体,在 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
肯定错过了什么,但是什么?
更新:
当右键单击“Run ImageViewExample.main()”(我认为这意味着“通过 Gradle 插件运行”)(“Run HelloFX.main()”导致成功)时,会收到以下消息:
JavaFX runtime components are missing, and are required to run this application
这与“找不到类”不太一样。
运行“with info”然后显示Gradle插件运行以启动“ImageViewExample”的命令行将Gradle缓存的所有JavaFX jar放在CLASSPATH而不是模块路径上,这显然失败了
Error: JavaFX runtime components are missing, and are required to run this application
这可能与它有关......
更新:但可能不是。
右键单击运行只是拼凑一个运行配置,这显然是错误的......但至少找到了主类。
更新更新
通过添加模块路径来修复 Intellij IDEA 创建的运行配置使“运行配置”工作,尽管“运行配置”和新的(现在工作的)“运行配置”在表面上看起来完全一样。
更新^3
即使在查看.idea/workspace.xml
项目时,工作和非工作运行配置也是相同的......除了非工作配置没有被标记为临时
<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>
此设置中有太多移动部件。不喜欢。