Java runtime ClassNotFoundException

19,005

From json-lib homepage:

Json-lib requires (at least) the following dependencies in your classpath:

  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

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.

Share:
19,005
Shelby Vanhooser
Author by

Shelby Vanhooser

Updated on June 04, 2022

Comments

  • Shelby Vanhooser
    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 in net/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