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这样的东西).
怎么可能在编译时找到类而不是在运行时?有什么想法让它有效吗?
谢谢.
您混淆了两个不同的东西,编译时间类路径解析和运行时类路径访问.
当你编译你的应用程序,你需要有一个应用程序使用的类/是指在开发环境中编译的类路径; 如果你不这样做,那么就会发生编译时错误.
当你运行你的编译的应用程序,你需要有一个应用程序使用的所有类/是指你的JVM类路径或包含在您的应用程序包; 如果你不这样做,那么就会发生运行时错误.
你经历了第二次.