gpt4 book ai didi

java - 如果缺少类依赖项,我如何确定缺少哪个类?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:32 24 4
gpt4 key购买 nike

我收到错误“无法找到或加载主类”,即使该类在那里。来自 this answer ,我了解到由于缺少依赖项,可能会找到该类,但不会加载该类。

除了手动反编译类,检查它的所有依赖项,以及它们是否在类路径上,等等每个依赖类的无穷无尽....有没有办法确定类路径中缺少哪个类因此导致 Java 无法加载我的主类?

另一个问题是缺少父类/接口(interface)类的问题。但是我手动检查了所有祖先类是否位于指定的类路径或 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 {
$

最佳答案

创建一个辅助类:

public class Helper {
public static void main(String[] args) {
YourActualMainClass.main(args);
}
}

并尝试运行这个辅助类而不是 YourActualMainClass

关键是 Helper 的继承树和它的成员的签名都不依赖于有问题的类,所以加载甚至初始化都会成功,考虑到 HotSpot 的惰性解析策略,所以它会仅在尝试执行 Helper.main 方法时尝试加载和解析 YourActualMainClass。此时,它会抛出一个详细的错误,告诉您实际上缺少哪个类。

这与链接答案中描述的行为相符,即当使用类的继承不依赖于类时,使用类会导致特定的错误消息。


或者,您可以尝试使用 Java 9 运行该应用程序,因为它的启动器会在主类加载失败时打印原因。

关于java - 如果缺少类依赖项,我如何确定缺少哪个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47705225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com