Java 找不到 main class,即使 main class 存在
Java cannot find main class even though main class is present
我一直在尝试 运行 一个 jar,但我一直收到错误消息:
Error: Could not find or load main class com.myclass
Caused by: java.lang.ClassNotFoundException: com.myclass
这非常令人困惑,因为我提取了 jar 并且 class 出现在正确的位置。这就是我使用 gradle:
编译 jar 的方式
jar {
manifest {
attributes 'Main-Class': 'com.myclass'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
我认为这是 java 的问题,因为 jar 文件似乎是正确的。有谁知道我该如何解决这个问题?
包是强制性的。未命名包中的东西(当 classes 没有包声明时会发生这种情况)实际上仍在包中,但它是一个你不能输入的包。唯一的例外是当 运行 java -cp classpath;here myclass
时例外情况确实有效。关键是,它在任何清单属性中都不起作用,您根本无法导入它们,并且它们在 module-info 文件中不起作用(即,在其他任何地方出现 class 名称, class无法引用未命名包中的es。
因此,添加一个包语句并将内容移动到与之匹配的子目录中。
当您使用 Eclipse IDE 时,通常编译器也会抛出包名错误。
尝试在特定包中使用 main 方法打包 class。
你的问题没有包含任何可以直接表明你做错了什么的细节。
不过我可以告诉你大概的原理:
解压那个 jar(它是一个 zip 文件,所以任何解压器都可以。或者,jar xvf myjar.jar
在新创建的目录中也可以完成这项工作)。
其中至少应有 2 个文件,位于这些 确切 位置:
com/foo/MyClass.class
META-INF/MANIFEST.MF
然后,使用记事本或从终端 cat
打开清单文件。它应该再次包含这一行,exactly:
Main-Class: com.foo.MyClass
如果这些都是真的,但您在这个问题中报告的错误正在发生,那么我们就遇到了真正奇特的东西,例如损坏的 VM 或损坏的 class 文件。更有可能是您误读了某些内容,请仔细检查名称。
注意:如果您忘记将正确签名的 'main' 方法添加到您的 class,错误是不同的,因此,不是这样。
对于它的价值,这部分:
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
看起来 non-standard。是否有任何您试图让 gradle 构建文件执行的特定操作尚未内置到默认设置中?在这种情况下,您可能做错了;您可能想专门询问另一个 SO 问题,并将这部分(特别是您对清单中的内容以及 class 文件实际上在您的 jar 文件中的位置的发现)作为该问题的脚注。
我一直在尝试 运行 一个 jar,但我一直收到错误消息:
Error: Could not find or load main class com.myclass
Caused by: java.lang.ClassNotFoundException: com.myclass
这非常令人困惑,因为我提取了 jar 并且 class 出现在正确的位置。这就是我使用 gradle:
编译 jar 的方式jar {
manifest {
attributes 'Main-Class': 'com.myclass'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
我认为这是 java 的问题,因为 jar 文件似乎是正确的。有谁知道我该如何解决这个问题?
包是强制性的。未命名包中的东西(当 classes 没有包声明时会发生这种情况)实际上仍在包中,但它是一个你不能输入的包。唯一的例外是当 运行 java -cp classpath;here myclass
时例外情况确实有效。关键是,它在任何清单属性中都不起作用,您根本无法导入它们,并且它们在 module-info 文件中不起作用(即,在其他任何地方出现 class 名称, class无法引用未命名包中的es。
因此,添加一个包语句并将内容移动到与之匹配的子目录中。
当您使用 Eclipse IDE 时,通常编译器也会抛出包名错误。 尝试在特定包中使用 main 方法打包 class。
你的问题没有包含任何可以直接表明你做错了什么的细节。
不过我可以告诉你大概的原理:
解压那个 jar(它是一个 zip 文件,所以任何解压器都可以。或者,jar xvf myjar.jar
在新创建的目录中也可以完成这项工作)。
其中至少应有 2 个文件,位于这些 确切 位置:
com/foo/MyClass.class
META-INF/MANIFEST.MF
然后,使用记事本或从终端 cat
打开清单文件。它应该再次包含这一行,exactly:
Main-Class: com.foo.MyClass
如果这些都是真的,但您在这个问题中报告的错误正在发生,那么我们就遇到了真正奇特的东西,例如损坏的 VM 或损坏的 class 文件。更有可能是您误读了某些内容,请仔细检查名称。
注意:如果您忘记将正确签名的 'main' 方法添加到您的 class,错误是不同的,因此,不是这样。
对于它的价值,这部分:
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
看起来 non-standard。是否有任何您试图让 gradle 构建文件执行的特定操作尚未内置到默认设置中?在这种情况下,您可能做错了;您可能想专门询问另一个 SO 问题,并将这部分(特别是您对清单中的内容以及 class 文件实际上在您的 jar 文件中的位置的发现)作为该问题的脚注。