Java 运行时ClassNotFoundException,但应用程序编译

Java 运行时ClassNotFoundException,但应用程序编译,java,jar,compilation,runtime,classnotfoundexception,Java,Jar,Compilation,Runtime,Classnotfoundexception,在Java应用程序中,我试图通过对类使用newInstance()方法来创建类Class1的实例。Class1属于我的项目,但它也需要Class2,它来自另一个项目,位于外部jar中,我已将该jar添加到项目和Eclipse中的构建路径中。Eclipse在编译项目时似乎没有遇到任何问题,但当我尝试获取Class1实例时,它抛出了一个关于Class2的ClassNotFoundException 这就是Class1的外观: import other.package.Class2; public

在Java应用程序中,我试图通过对类使用newInstance()方法来创建类Class1的实例。Class1属于我的项目,但它也需要Class2,它来自另一个项目,位于外部jar中,我已将该jar添加到项目和Eclipse中的构建路径中。Eclipse在编译项目时似乎没有遇到任何问题,但当我尝试获取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的文件夹,其中包含一些jar,我创建了另一个名为libs_other_company的lib文件夹,我将Class2放在jar中。如果我转到java构建路径,我可以看到在libraries选项卡中添加的jar

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

它怎么可能在编译时找到类而不是在运行时?有什么办法让它发挥作用吗


谢谢。

您混淆了两件不同的事情:编译时类路径解析和运行时类路径访问

  • 当编译应用程序时,需要在开发环境编译类路径中拥有应用程序使用/引用的类;如果不这样做,则会发生编译时错误

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


  • 您遇到了第二个问题。

    看起来应该已经在这里解决了。我还没检查过,我知道这就是问题所在。我不明白eclipse为什么不将jar带到运行时环境中。因为默认情况下它不会这样做,所以您必须“告诉”它要包含哪些类/jar,否则每个应用程序都必须包含(几乎)所有类。只有您知道要在什么样的环境中运行应用程序。出于这个原因,我更喜欢使用ant构建文件来打包应用程序。那么有没有办法在Eclipse中配置它,或者我必须为此构建ant脚本呢?当您在Eclipse中导出jar文件时,您可以指定(最后一个屏幕或最后一个屏幕之前的一个屏幕)要包含在jar中的内容。它可以为您生成一个ant脚本,您可以稍后编辑。我不会导出任何jar。我是一个动态的网络项目。我可以在任何情况下引发战争。