3

私が抱えている奇妙なランタイムエラーについて質問がありました。外部ソースからのプロンプトが表示されたときに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はインポートで指定されたとおりに存在します。実行時まで機能しないのはなぜですか?なんらかの理由でクラスパスが正しくありませんか?必要なクラスパスを含めるための適切な構文は何でしょうか?

前もって感謝します

4

1 に答える 1

20

json-libホームページから:

Json-libには、(少なくとも)クラスパスに次の依存関係が必要です。

  1. jakarta commons-lang 2.5
  2. jakarta commons-beanutils 1.8.0
  3. jakartacommons-コレクション3.2.1
  4. jakartacommons-ロギング1.1.1
  5. ezmorph 1.0.6

実装がコンパイルするということは、コンパイラが適切なクラスとメソッドを見つけることができることを示しているだけです。ただし、これらのクラスとメソッドの実装は、他のライブラリに依存する場合があります。

プロジェクトの依存関係の詳細については、こちらをご覧ください

于 2012-07-19T18:58:09.610 に答える