IDEA新建工程编译报错 找不到或无法加载主类 com.company.Main
问题描述
系统是Win10,尝试安装了IDEA的多个版本:2019.3社区版,2020.2社区版,2020.2商业版。
发现都会出现同一个问题:新建的Java或JavaFX项目,编译报错
错误: 找不到或无法加载主类 com.company.Main
原因: java.lang.ClassNotFoundException: com.company.Main
排查
偶尔会出现项目能编译运行,对比发现编译报错的工程对应编译参数,少了-classpath xxx
这样的参数(xxx是工程下的编译输出子目录,例如我的是-classpath D:\work\java\tok\out\production\tok
):
"D:\soft\JetBrains\IntelliJ IDEA Community Edition 2019.3.5\jbr\bin\java.exe" "-javaagent:D:\soft\JetBrains\IntelliJ IDEA Community Edition 2019.3.5\lib\idea_rt.jar=64142:D:\soft\JetBrains\IntelliJ IDEA Community Edition 2019.3.5\bin" -Dfile.encoding=UTF-8 -classpath D:\work\java\tok\out\production\tok sample.Main
"D:\soft\JetBrains\IntelliJ IDEA Community Edition 2019.3.5\jbr\bin\java.exe" "-javaagent:D:\soft\JetBrains\IntelliJ IDEA Community Edition 2019.3.5\lib\idea_rt.jar=64158:D:\soft\JetBrains\IntelliJ IDEA Community Edition 2019.3.5\bin" -Dfile.encoding=UTF-8 sample.Main
由于IDEA右下方小窗出现过提示,说Windows Defender可能无法加载config和system文件,于是做过如下尝试:
- 修改IDEA安装目录下
bin/idea.properties
中的config和system路径,从C:/Users/zz/.IdeaC2019.3
换成D:/soft/JetBrains/.IdeaC
;测试无效 - 关闭Windows Defender,临时生效,但后续新建工程又出现编译问题
- 关闭IDEA,删掉工程的
.idea
目录,重开IDEA,无效 - 关掉当前工程的IDEA窗口,从其他的IDEA窗口,新建工程,并且目录选择为刚刚出问题的工程目录(也即是overwrite),可行
仔细观察,发现:
- 每个工程根目录有个同名的
.iml
文件 - 每个工程的
.idea/modules.xml
文件中,会提到一个.iml
文件 - 理论上,两个地方的
.iml
应该一致,而报编译错的工程里是不一样的:- 对于JavaFX工程,是
JavaFxApplication.xml
<module fileurl="file://$PROJECT_DIR$/JavaFxApplication.iml" filepath="$PROJECT_DIR$/JavaFxApplication.iml" />
- 对于Java命令行工程,是
untitledxxx.iml
<module fileurl="file://$PROJECT_DIR$/untitled104.iml" filepath="$PROJECT_DIR$/untitled104.iml" />
- 对于JavaFX工程,是
- 而我的工程,并不是叫做
untitled104
或JavaFxApplication
尝试按照Android Studio中的修改gradle插件默认下载地址的方式,也就是改模板的方式,但并没有在IDEA的目录下找到相关插件的模板文件,这个方法宣告失败。给JetBrain Support发了邮件,不知道会不会有回复。
https://stackoverflow.com/questions/44717130/idea-plugin-gradle-wrong-iml-file-used
结论
IDEA 新建工程后,需要手动修改 .idea/modules.xml 中 .iml文件的名字为工程名字,例如:
<module fileurl="file://$PROJECT_DIR$/duoheshui.iml" filepath="$PROJECT_DIR$/duoheshui.iml" />
Greatness is never a given, it must be earned.