答案 0 :(得分:8)
您获得的错误不是出现在complilation上,而是出现在您尝试运行应用程序时。这是因为Java无法在项目输出目录(classpath)的Table.class
子目录中找到db
文件。
这可能有多种原因:
Table.java
is excluded from compilation(偶然或故意因为它包含错误而你想在处理其他代码时跳过它)db
子目录Table.java
包含错误的package
语句,或者位于/移动到其他包:
或Windows上包含分号;
,它用于分隔类路径并使类路径无效。有关详细信息,请参阅this thread。请注意,Mac上的Finder可能会在路径中以斜杠显示冒号。在正确配置的项目中,使用正确的运行/调试配置,一切正常:
答案 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重构程序包名称,则这些信息将无法正确更新。