【问题标题】:NoClassDefFound when trying to run java with external libraries尝试使用外部库运行 java 时出现 NoClassDefFounderror
【发布时间】:2011-03-30 18:06:48
【问题描述】:

我在运行我的 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 但没有帮助

【问题讨论】:

    标签: java log4j noclassdeffounderror classnotfoundexception


    【解决方案1】:

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

    是的,我也不喜欢这个。

    【讨论】:

    • 它工作得很好,真的很奇怪,真的很奇怪,包括我认为我之前尝试过,但可能有其他问题,谢谢帮助
    【解决方案2】:

    SRV_LIBS 指向 log4j-1.2.16-javadoc.jar

    通常名称中的“-javadoc”表示该 jar 不包含代码 - 只有 javadoc 文档。改用 log4j-1.2.16.jar。

    【讨论】:

    • 我刚刚注意到并改变了,但它没有任何帮助,一定是这里有什么问题
    • 您是否查看过 log4j-1.2.16.jar 以检查它是否包含该类?您确定 %SRV_LIBS% 已正确设置和替换吗?
    • 我做到了,课程就在那里。我做到了,你可以在上面看到异常是执行时命令的样子
    【解决方案3】:

    您似乎指向了错误的 log4j jar。

    您目前拥有 -classpath server\libraries\log4j-1.2.16-javadoc.jar; 它尝试加载 javadoc jar 文件。

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

    【讨论】:

    • 我刚刚注意到并改变了,但它没有任何帮助,一定是这里有什么问题
    【解决方案4】:

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

    【讨论】:

    • 我刚刚注意到并改变了,但它没有任何帮助,一定是这里有什么问题
    猜你喜欢
    • 2011-12-22
    • 2011-06-23
    • 2017-08-08
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2021-09-28
    相关资源
    最近更新 更多