运行时ClassNotFoundException但应用程序编译

Jav*_*avi 6 java runtime compilation jar classnotfoundexception

在Java应用程序中,我试图通过在类上使用newInstance()方法来创建类Class1的实例.Class1属于我的项目,但它也需要来自另一个项目的Class2,它位于我已添加到项目中的外部jar中以及Eclipse中的构建路径中.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
        ... 
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

当我执行时,我得到:

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
Run Code Online (Sandbox Code Playgroud)

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

我直接从Eclipse运行Tomcat服务器中的应用程序(我没有使用像Ant或Maven这样的东西).

怎么可能在编译时找到类而不是在运行时?有什么想法让它有效吗?

谢谢.

Ger*_*ton 6

您混淆了两个不同的东西,编译时间类路径解析和运行时类路径访问.

  1. 当你编译你的应用程序,你需要有一个应用程序使用的类/是指在开发环境中编译的类路径; 如果你不这样做,那么就会发生编译时错误.

  2. 当你运行你的编译的应用程序,你需要有一个应用程序使用的所有类/是指你的JVM类路径或包含在您的应用程序包; 如果你不这样做,那么就会发生运行时错误.

你经历了第二次.

  • 我知道这就是问题所在.我不明白为什么eclipse没有把jar带到运行时环境. (2认同)