2

Java プロジェクトの実行に問題があります。

E:\Workspace\compiled>java -classpath server\libraries\log4j-1.2.16.jar;E:\Workspace\compiled\server\service-1.0-SNAPSHOT.jar;E:\Workspace\compiled\server\libraries\log4j-1.2.16.jar -Djava.security.policy=E:\Workspace\compiled\socket.policy -Djava.rmi.server.codebase=file:///E:\Workspace\compiled\server\service-1.0-SNAPSHOT.jar -jar E:\Workspace\compiled\server\service-1.0-SNAPSHOT.jar E:\Workspace\compiled\log4j.properties
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/PropertyConfigurator
    at pwr.mgr.server.service.Launcher.main(Launcher.java:18)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.PropertyConfigurator
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

Mavenを使用してコンパイルされ、.jarファイルになります。今日、ログに wimple System.out の代わりに log4j を使用することにしました...この変更の前は問題なく動作していました

これが私がそれを実行する方法です

java -cp .;%SRV_ADDR%;%SRV_LIBS% -Djava.security.policy=%POLICY_FILE% -Djava.rmi.server.codebase=file:///%SRV_ADDR% pwr.mgr.server.service.Launcher %CD%\log4j.properties

SRV_ADDR は私の service.jar を指します (Launcher クラスを使用)

SRV_LIBS は log4j-1.2.16.jar を指します

追加した "。;" 言及されたファイルは、これを起動しようとしているファイルの子ディレクトリにあるため、最初はそれが役立つことを望んでいます。

また、ここのどこかに log4j ライブラリを haev する必要があることにも言及する必要があります。これは、アプリを別のマシンに移動する予定であり、そこに期待するライブラリがわからないためです。おそらく純粋な Java だけなので、すべてを 1 つのパッケージで提供する必要があります。 .

誰かが Launcher クラスに興味を持っている場合、それは非常に簡単です:

public class Launcher {

public static void main(String args[]) {
    PropertyConfigurator.configure(args[0]);
    if (System.getSecurityManager() == null) {
        System.setSecurityManager(new SecurityManager());
    }

    try {
        Runtime.getRuntime().exec("rmiregistry");
        ServerIntf obj = new Server();
        Registry registry = LocateRegistry.getRegistry();
        registry.rebind("Server", obj);
        System.out.println("Server bound in registry");
    } catch (Exception e) {
        System.out.println("Server err: " + e.getMessage());
        e.printStackTrace();
    }
}
}

誰かが私が間違っていることを知っていますか? この 1 つの log4j jar ファイルだけを追加するだけでは不十分でしょうか? Maven リポジトリからコピーしました。

EDIT1は、私が指しているjarをlog4j-1.2.16-javadoc.jarからlog4j-1.2.16.jarに変更しましたが、役に立ちませんでした

4

4 に答える 4

3

を使用する場合java -jar ...引数は無視されます。メイン jar のマニフェストで必要なすべての jar を指定するか (ただし、相対パスしか使用できません)、メイン jar を に追加して、コマンド ラインでメイン クラスを指定します。-classpath-classpath

はい、これも嫌いです。

于 2011-03-30T20:32:31.953 に答える
1

SRV_LIBS は log4j-1.2.16-javadoc.jar を指します

通常、名前の「-javadoc」は、jar にコードが含まれておらず、javadoc ドキュメントのみが含まれていることを意味します。代わりに log4j-1.2.16.jar を試してください。

于 2011-03-30T18:12:48.810 に答える
1

間違った log4j jar を指しているようです。

現在 -classpath server\libraries\log4j-1.2.16-javadoc.jar; 、javadoc jar ファイルをロードしようとしています。

-classpath server\libraries\log4j-1.2.16.jar;代わりに使用してみてください。

于 2011-03-30T18:13:13.977 に答える
0

まず、log4j javadoc jar を使用しています。これには javadoc ドキュメントのみが含まれ、クラス ファイルは含まれません。log4j-1.2.16.jar を使用する必要があります。

于 2011-03-30T18:13:04.493 に答える