7

在 Java 应用程序中,我试图通过在类上使用newInstance()方法来创建类Class1的实例。Class1 属于我的项目,但它还需要来自另一个项目的Class2,它位于我已添加到项目和 Eclipse 中的构建路径的外部 jar中。Eclipse 似乎在编译项目时找到了 Class2,没有任何问题,但是当我尝试获取 Class1 的实例时,它会抛出关于 Class2的ClassNotFoundException 。

这是 Class1 的样子:

import other.package.Class2;

public class Class1 implements Class1Interface{
    //there's no explicit constructor

    @Override
    public void method1(String param){
        System.out.println("Loading.....");
    }   

    @Override
    public void notifyChanges(String param) throws Exception{
        Class2 class2 = Class2.getInstance(); //here it's used the Class2 from another jar
        ... 
    }
}

这就是我尝试获取它的实例的方式:

String myParam = "blabla";
Class1Interface interf = "my.package.Class1";
try {
    interf = (Class1Interface) Class.forName(interfazws).newInstance();
    interf.method1(myParam);
} catch (InstantiationException e) {
    handle(e);
} catch (IllegalAccessException e) {
    handle(e);
} catch (ClassNotFoundException e) {
    handle(e);
}

当我执行时,我得到:

Caused by: org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'execute' on target class [class my.package.myJobJob] failed; nested exception is java.lang.NoClassDefFoundError: other/package/Class2            
...
Caused by: java.lang.NoClassDefFoundError: other/package/Class2
...
Caused by: java.lang.ClassNotFoundException: other.package.Class2

关于我的项目配置要添加的另一件事是,在 WEB-INF 文件夹下,我有一个名为 libs 的文件夹,其中包含一些 jars,我创建了另一个名为 libs_other_company 的 lib 文件夹,并将 Class2 所在的 jar 放在那里。如果我去 java构建路径我可以看到库选项卡中添加的 jar。

我直接从 Eclipse 在 Tomcat 服务器中运行应用程序(我没有使用 Ant 或 Maven 之类的东西)。

它怎么可能在编译时找到类但在运行时找不到?有什么想法让它起作用吗?

谢谢。

4

1 回答 1

6

您混淆了两个独立的东西,编译时类路径解析和运行时类路径访问。

  1. 当你编译你的应用程序时,你需要让你的应用程序在你的开发环境中使用/引用的类编译类路径;如果您不(这样做),则会发生编译时错误。

  2. 当您运行已编译的应用程序时,您需要将应用程序使用/引用的所有类都包含在您的 JVM 类路径中或包含在您的应用程序包中;如果您不(这样做),则会发生运行时错误。

你体验第二个。

于 2012-11-23T12:58:12.660 回答