0

我想从 maven java 项目创建一个 jar 文件,并将其作为外部 jar 文件添加到另一个项目中。但是我不断收到 NoClassDefFoundError 错误。

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at com.tutelatechnologies.dashboard.DataUsageLogs.Logging.getlogger(Logging.java:10)
    at com.tutelatechnologies.dashboard.DataUsageLogs.Logging.d(Logging.java:26)
    at com.tutelatechnologies.dashboard.DataUsageLogsRunner.DUL_TESTER.main(DUL_TESTER.java:11)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    ... 3 more

jar 文件非常简单。它仅包含使用 Log4J 和 SLF4J 进行日志记录的包装器。我已经把它包括在内:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Logging {

    public void e(String msg, Class inputClass)
    {
        Logger logs = LoggerFactory.getLogger(inputClass);
        logs.error(msg);
    }
    public void w(String msg, Class inputClass)
    {
        Logger logs = LoggerFactory.getLogger(inputClass);
        logs.warn(msg);
    }
    public void d(String msg, Class inputClass)
    {
        Logger logs = LoggerFactory.getLogger(inputClass);
        logs.debug(msg);
    }
    public void t(String msg, Class inputClass)
    {
        Logger logs = LoggerFactory.getLogger(inputClass);
        logs.trace(msg);
    }    
}

现在我右键单击这个项目,选择 Export -> Java -> Jar File 然后单击 Finish。选择所有文件夹。

然后我转到我的新项目并通过右键单击我的项目添加 jar 文件,选择 Build Path-> Configure Build Path。然后在库选项卡中,单击“添加外部罐子”按钮并将其链接到我的 jar 文件。我附上了我的源代码和一个 javadoc,以便我可以验证它是否正确链接。它看起来没问题,但是当我运行它时,我得到了 NoClassDefFoundError。这是因为 Eclipse 不会将依赖项添加到 jar 文件中。

如果我将项目添加到 Java Build 路径,我可以让它工作。但我希望这是一个自包含的 jar 文件。当它击中 LoggerFactory.getLogger(inputClass); 时它会崩溃 它正在寻找 slf4j 依赖项。

以下行是用于测试的唯一行。

Logging.d("test", thisClass.class);

是否可以将所有依赖项打包到一个 jar 文件中并正确链接?

仅供参考,我已经尝试将它制作成一个可运行的 Jar,它可以正常工作,但是 jar 文件不知道如何链接到 log4j.properties 文件。该文件位于 src/main/resources 中。

任何帮助表示赞赏。

干杯,

4

2 回答 2

0

看起来丢失的 jar 是 SLF4J 本身,而不是您的代码。根据您的文件夹结构,您似乎正在使用 Maven。您是否可能仅将 slf4j-api.jar 标记为测试依赖项?您实际上需要针对该插件进行编译(即,将其标记为编译依赖项),但不同的插件可以是测试依赖项,例如 logback-classic 或您正在使用的任何插件。

于 2012-07-11T23:16:25.157 回答
0

我不确定到底是什么问题,但我能够让它工作。我导出了文件,但只选择了相关的源文件和属性文件。然后我将它添加到我的其他项目订单和导出选项卡列表的顶部。

最终,我将 jar 添加为 maven 依赖项,然后将 jar 的所有必要依赖项也添加到新项目中,这很有效。

干杯。

于 2012-10-01T16:56:19.110 回答