即使存在主类,Java也找不到主类



我一直试图运行一个jar,但一直收到错误:

Error: Could not find or load main class com.myclass
Caused by: java.lang.ClassNotFoundException: com.myclass

这非常令人困惑,因为我提取了jar,并且类出现在正确的位置。这就是我使用gradle:编译jar的方式

jar {
manifest {
attributes 'Main-Class': 'com.myclass'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}

我认为这是java的一个问题,因为jar文件似乎是正确的。有人知道我该怎么解决吗?

您的问题不包括任何直接表明您做错了什么的细节。

但我可以告诉你一般原理:

打开jar的包装(这是一个zip文件,所以任何解压缩程序都可以。或者,新创建的目录中的jar xvf myjar.jar也可以完成这项工作(。

在它中,应该至少有2个文件,位于确切的位置:

  • com/foo/MyClass.class
  • META-INF/MANIFEST.MF

然后,用记事本或cat从终端打开清单文件。它应该包含这一行,再次精确

  • Main-Class: com.foo.MyClass

如果这些都是真的,但您在这个问题中报告的错误正在发生,那么我们已经得到了真正的奇异东西,例如损坏的VM或损坏的类文件。更有可能你看错了什么,仔细检查一下名字。

注意:如果你忘记给你的类添加一个正确签名的'main'方法,错误就不一样了,所以,不是这样。

就其价值而言,本节:

from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}

看起来不标准。你想让你的gradle构建文件做什么还没有构建到默认值中的事情吗?在这种情况下,你可能做错了;你可能想问另一个SO问题,特别是关于这一点,并将这一部分(特别是关于清单中的内容以及类文件实际在jar文件中的位置的发现(作为该问题的脚注。

包是必需的。未命名包中的东西(当类没有包语句时会发生这种情况(实际上仍在包中,但它是一个无法键入的包。唯一的例外是当运行java -cp classpath;here myclass时,通过例外的方式,它确实起作用。关键是,它在任何manifest属性中都不起作用,根本无法导入它们,而且它们在模块信息文件中也不起作用(即,在其他任何类名出现的地方,都无法引用未命名包中的类(。

所以,添加一个package语句,并在与之匹配的子目录中移动内容。

当您使用Eclipse IDE时,编译器通常也会将此错误与包名称一起抛出。尝试将带有main方法的类打包到特定的包中。

最新更新