在IntelliJ IDEA中运行时出现java.lang.ClassNotFoundException

时间:2017-03-07 23:13:37

标签: java intellij-idea

我创建了一个使用数据库的程序,在IntelliJ IDEA中编译时遇到以下错误。有谁为什么会这样,以及我如何解决它?

enter image description here

5 个答案:

答案 0 :(得分:8)

您获得的错误不是出现在complilation上,而是出现在您尝试运行应用程序时。这是因为Java无法在项目输出目录(classpath)的Table.class子目录中找到db文件。

这可能有多种原因:

  • 错误的主要课程selected in the run/debug configuration
  • Table.java is excluded from compilation(偶然或故意因为它包含错误而你想在处理其他代码时跳过它)
  • 类未编译,因为构建步骤is excluded来自运行/调试配置中的启动前步骤
  • 项目配置错误,并且没有源根 defined for the directory包含db子目录
  • Table.java包含错误的package语句,或者位于/移动到其他包
  • 项目路径在Mac / Linux上包含冒号:或Windows上包含分号;,它用于分隔类路径并使类路径无效。有关详细信息,请参阅this thread。请注意,Mac上的Finder可能会在路径中以斜杠显示冒号。
  • 如果其中一个从属jar经过数字签名,则jar可能无法执行,因为新工件将包含依赖项的部分签名。有关详细信息,请参阅this answer

在正确配置的项目中,使用正确的运行/调试配置,一切正常:

Run

答案 1 :(得分:1)

  
      
  • 如果其中一个从属jar经过数字签名,则jar可能无法执行,因为新工件将包含依赖项的部分签名。有关更多详细信息,请参阅此答案。
  •   

我必须再次强调CrazyCoder在这里的观点。

当您尝试运行包含损坏签名的Jar-File时,(Oracle)JVM用于抛出 SecurityException 。这从“什么是错的” - 观点来看是有道理的。

现在已不再是这样了。他们现在确实在抛出 ClassNotFoundException - 即使该类正好在文件中(无论是否在默认包/顶层或嵌套包结构中的向下)。

答案 2 :(得分:1)

这是IntelliJ想法中的一个已知错误。 要解决此问题,我只删除了.iml和.idea并重新启动IDE。 它适用于大多数情况

编辑:文件将位于项目目录中。

答案 3 :(得分:0)

这对我有用:

我删除了.ide文件夹.iml文件。然后intelliJ生成的所有其他自动生成的文件都重新启动了我的ide,并询问我是否要使用maven来运行我的项目。

很明显我说是:)

答案 4 :(得分:0)

如果您尝试了其他人建议的所有其他操作(删除.idea文件夹,重建等),则还有另一个地方可以检查,尤其是如果您构建了工件罐。当您第一次构建工件容器时,IntelliJ将一个文件夹:META-INF添加到src目录。其中只有一个文件: MANIFEST.MF ,其中包含指向Java的Main-Class的信息。如果您重构了项目包,很遗憾,IntelliJ不会使用新更改来更新此文件。我的 MANIFEST.MF 具有以下正确内容:

Manifest-Version: 1.0
Main-Class: org.umoja4life.fatashibackend.MainKt

其中“ org.umoja4life.fatashibackend”是程序包名称,“ MainKt”是IntelliJ为(伪)“ Main Class”构造的名称,因为已经在文件“ main.kt中定义了main() “ 在软件包目录中。

新手:顺便说一句,这会让您感到困惑,因为尽管有错误消息指出应该存在“ Main {}类”,但实际上没有定义。

在我发现此文件并尝试了其他所有人的建议之后,我发现最快的方法是让IntelliJ启动一个项目(使用正确的包名称!),并使用一个简单的 main.kt 对其进行初始化。 :

fun main() { println("hello world!") }

运行并测试;然后,我重新添加了所有其他文件,对其进行了重建,运行和测试。显然,IntelliJ在某些地方存储了一些秘密状态信息,如果您为已经在运行的项目和jar重构程序包名称,则这些信息将无法正确更新。