尝试使用外部库运行java时NoClassDefFound

时间:2011-03-30 18:06:49

标签: java log4j noclassdeffounderror classnotfoundexception

我在运行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文件。 我今天决定,我将使用log4j进行日志记录,而不是使用wimple System.out ...... 在此更改之前,它工作正常

这是我如何运行它

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库,因为我将把我的应用程序移到另一台机器上,我不知道那里有什么库,也许只有纯java,所以我需要提供一切在一个包中。

如果有人对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();
    }
}
}

有谁知道我做错了什么?也许只添加这一个log4j jar文件是不够的?我从我的maven存储库中复制了它。

EDIT1 已经改变jar我指向log4j-1.2.16-javadoc.jar到log4j-1.2.16.jar但它没有帮助

4 个答案:

答案 0 :(得分:3)

使用java -jar ...时,the -classpath argument is ignored。在主jar的清单中指定所有必需的jar(但是你只能在那里使用相对路径),或者将主jar添加到-classpath并在命令行中提及主类。

是的,我也不喜欢这样。

答案 1 :(得分:1)

  

SRV_LIBS指向log4j-1.2.16-javadoc.jar

通常名称中的“-javadoc”表示jar不包含代码 - 仅包含javadoc文档。请尝试使用log4j-1.2.16.jar。

答案 2 :(得分:1)

看起来你指的是错误的log4j jar。

你现在有 -classpath server\libraries\log4j-1.2.16-javadoc.jar; 它试图加载javadoc jar文件。

请尝试使用-classpath server\libraries\log4j-1.2.16.jar;

答案 3 :(得分:0)

对于初学者,您使用的是log4j javadoc jar。它只包含javadoc文档而不包含任何类文件。您需要使用log4j-1.2.16.jar。