【发布时间】:2017-12-07 22:57:16
【问题描述】:
我收到错误“无法找到或加载主类”,即使该类存在。从this answer 了解到,由于缺少依赖项,该类可能会被找到,但无法加载。
除了手动反编译类,检查它的所有依赖关系,以及它们是否在类路径上,等等,对于每个依赖的类,无限……有没有办法确定类路径中缺少哪个类因此导致 Java 无法加载我的主类?
另一个问题是缺少父/接口类的问题。但是我已经手动检查了所有的祖先类要么在指定的类路径上,要么在 JDK 中,如下所示。
$ cd ~/picketbox
$ java -cp picketbox-4.1.1.Final-redhat-1.jar org.picketbox.datasource.security.SecureIdentityLoginModule HelloWorld
Error: Could not find or load main class org.picketbox.datasource.security.SecureIdentityLoginModule
$ jar xvf picketbox-4.1.1.Final-redhat-1.jar > jarxvf.txt
$ cat jarxvf.txt | grep SecureIdentityLoginModule
inflated: org/picketbox/datasource/security/SecureIdentityLoginModule.class
$ cd org/picketbox/datasource/security/
$ javap SecureIdentityLoginModule.class | grep main
public static void main(java.lang.String[]) throws java.lang.Exception;
$ javap SecureIdentityLoginModule.class | grep extends
public class org.picketbox.datasource.security.SecureIdentityLoginModule extends org.picketbox.datasource.security.AbstractPasswordCredentialLoginModule {
$ cat ~/picketbox/jarxvf.txt | grep AbstractPasswordCredentialLoginModule
inflated: org/picketbox/datasource/security/AbstractPasswordCredentialLoginModule.class
$ javap AbstractPasswordCredentialLoginModule.class | grep extends
public abstract class org.picketbox.datasource.security.AbstractPasswordCredentialLoginModule extends org.jboss.security.auth.spi.AbstractServerLoginModule {
$ cat ~/picketbox/jarxvf.txt | grep AbstractServerLoginModule
inflated: org/jboss/security/auth/spi/AbstractServerLoginModule.class
$ cd ~/picketbox/org/jboss/security/auth/spi/
$ javap AbstractServerLoginModule.class | grep implements
public abstract class org.jboss.security.auth.spi.AbstractServerLoginModule implements javax.security.auth.spi.LoginModule {
$ cd ~/rtjar
$ cp /usr/java/jdk1.8.0_141/jre/lib/rt.jar ./
$ jar xvf rt.jar | grep spi/LoginModule
extracted: javax/security/auth/spi/LoginModule.class
$ cd javax/security/auth/spi/
$ javap LoginModule.class | grep interface
public interface javax.security.auth.spi.LoginModule {
$
【问题讨论】:
-
您是否尝试使用 -XX:+TraceClassLoading 选项?
-
@ClaudioCorsi 我以前不知道这个选项。我刚刚尝试过,但不幸的是它根本没有帮助。它只是显示 Java 从
rt.jar加载了许多 JDK 类,并且仍然给出相同的错误消息。我试图将输出作为编辑附加到我的问题中,但不幸的是它导致我的问题超出了字符数限制。但是那里没有什么有用的东西,只是一堆[Loaded x.y.z.ClassName from /.../rt.jar]形式的行 -
另一个选项是您可以实现一个 jvmti 模块并处理异常抛出的事件。然后您可以调用异常的 printStackTrace 方法。这应该有望提供有关缺少哪个类的线索。
-
@ClaudioCorsi 抱歉,我不知道该怎么做;我什至从未听说过jvmti。您可以发表您的评论作为答案并详细说明吗?
标签: java command-line-interface classloader