0

Intellij IDEA 让我因不良行为而发疯:

我有一个(基于 Gradle 的)项目,其中包含两个用 Java 编写的主要类,每个类都在自己的包中。

  • 一种叫做“HelloFX”
  • 一种叫做“ImageViewExample”

项目视图

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

  • 对于“HelloFX”

HelloFX 运行配置

  • 对于“ImageViewExample”

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>

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

4

1 回答 1

0

好的。

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

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

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

这就是为什么不应轻易将 XML 视为配置语言的原因。

对空格敏感

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

如果一个人准备好了,就可以看到空白

嗯,这很容易。

提交给 JetBrains 的错误报告。

于 2021-04-11T18:15:53.293 回答