Java runtime ClassNotFoundException
From json-lib homepage:
Json-lib requires (at least) the following dependencies in your classpath:
- jakarta commons-lang 2.5
- jakarta commons-beanutils 1.8.0
- jakarta commons-collections 3.2.1
- jakarta commons-logging 1.1.1
- ezmorph 1.0.6
That your implementation compiles only shows that the compiler can find the right classes and methods. The implementation of those classes and methods may however depend on other libraries.
More information on project dependencies can be found here.
Shelby Vanhooser
Updated on June 04, 2022Comments
-
Shelby Vanhooser almost 2 years
Just had a question about an odd runtime error that I'm having. I'm working with a JSON server that responds with a JSON object when prompted by an outside source. As of right now, however, I'm simply trying to get the JSON object up and running before sending it out. My code compiles without specifying any classpath, but when it comes to runtime, it throws a
NoClassDefFoundError
as seen here: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
My code follows here:
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"); } }
}
and the JSON folder is in the same directory as
ExampleServer.java
, with the JSON classes residing innet/sf/json
as specified in my imports. Why is it not working until runtime? Is my classpath not right for some reason? What would be the appropriate syntax for including a necessary classpath?Thanks in advance