Eclipse将引用的jar添加到导出的jar文件中的问题

时间:2012-07-11 23:01:30

标签: java eclipse logging log4j slf4j

我想从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文件,选择Build Path->配置构建路径。然后在Libraries选项卡中单击“Add external Jars”按钮并将其链接到我的jar文件。我附上了我的源代码和一个javadoc,所以我可以验证它是否正确链接。它看起来没问题,但是当我运行它时,我得到NoClassDefFoundError。这是因为eclipse不会将依赖项添加到jar文件中。

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

以下行是测试此项时使用的唯一行。

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

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

仅供参考,我已经尝试将其设置为Runnable Jar,它可以工作但是jar文件不知道如何链接到log4j.properties文件。该文件位于src / main / resources中。

感谢任何帮助。

干杯,

2 个答案:

答案 0 :(得分:0)

看起来缺少的jar是SLF4J本身,而不是你的代码。根据您的文件夹结构,您看起来像是在使用Maven。是否有可能只将slf4j-api.jar标记为Test依赖项?你实际上需要要编译一个(即,将其标记为编译依赖项),但不同的插件可以是测试依赖,例如logback-classic或你正在使用的任何东西。

答案 1 :(得分:0)

我不确定究竟是什么问题,但我能够让它发挥作用。我导出了文件,但只选择了相关的源和属性文件。然后我将它添加到我的其他项目Order and Export选项卡列表的顶部。

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

干杯。