Java运行时ClassNotFoundException

刚刚有一个关于我遇到的奇怪的运行时错误的问题。 我正在使用一个JSON服务器,当外部源提示时,它会响应JSON对象。 但是,截至目前,我只是在发送之前尝试启动并运行JSON对象。 我的代码编译时没有指定任何类路径,但是当涉及到运行时,它会抛出NoClassDefFoundError如下所示:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at ExampleServer.sendData(ExampleServer.java:76) at ExampleServer.runServer(ExampleServer.java:30) at ExampleServer.main(ExampleServer.java:15) Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ... 15 more 

我的代码如下:

 import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.lang.*; import net.sf.json.*; public class ExampleServer{ private DataOutputStream output; private DataInputStream input; private ServerSocket server; private Socket connection; public static void main(String[] args){ new ExampleServer().runServer(); } public void ExampleServer(){ System.out.println("Server object created"); } public void runServer(){ try{ server = new ServerSocket(12345,100); while(true){ try{ waitForConnection(); getStreams(); processConnection(); sendData("Text"); } catch(Exception e){ System.out.println("Server Terminated Exception."); } finally { closeConnection(); } } } catch(Exception e){ e.printStackTrace(); } } private void waitForConnection(){ try{ System.out.println("Waiting for connection."); connection = server.accept(); System.out.println("Connection received from " + connection.getInetAddress().getHostName()); } catch (IOException e){ System.out.println(e); } } private void getStreams() throws IOException{ output = new DataOutputStream(connection.getOutputStream()); input = new DataInputStream(connection.getInputStream()); System.out.println("Got streams"); } private void processConnection() throws IOException{ sendData("This is a test message"); } private void closeConnection(){ try{ if(output != null && connection != null){ sendData("SEVER>>> TERMINATE"); output.close(); connection.close(); } } catch (IOException e){ e.printStackTrace(); } } private void sendData(String message){ try{ JSONObject g = new JSONObject(); g.put("message", message); System.out.println(g.toString()); } catch (Exception e){ System.out.println("Error writing object"); } } 

}

并且JSON文件夹与ExampleServer.java位于同一目录中,其中JSON类位于我的导入中指定的net/sf/json中。 为什么它直到运行时才能工作? 我的课程路径出于某种原因不对吗? 包含必要的类路径的适当语法是什么?

提前致谢

来自json-lib主页 :

Json-lib在类路径中需要(至少)以下依赖项:

  1. jakarta commons-lang 2.5
  2. jakarta commons-beanutils 1.8.0
  3. jakarta commons-collections 3.2.1
  4. jakarta commons-logging 1.1.1
  5. ezmorph 1.0.6

您的实现编译只显示编译器可以找到正确的类和方法。 然而,这些类和方法的实现可能依赖于其他库。

有关项目依赖性的更多信息,请参见此处 。