2

我使用 eclipse ide 在 java 中创建了一个简单的项目来测试 log4j 功能。我需要使用 java 中的 jar 工具从命令提示符运行应用程序。logtest.java 文件是一个简单的 java 文件,它定义了一个如下的记录器。它正在引用另一个 Jar 文件中的 Logger。下面是目录结构。

package com;

import org.apache.log4j.Logger;

public class logtest {

    private static Logger logger = Logger.getLogger(logtest.class);

    public static void main(String[] args) {
        System.out.println("---------------HIIIIII-----------");
    }

下面是我在eclipse项目中创建的目录结构。

src/com/logtest.java

lib/log4j-1.2.17.jar

清单文件条目如下,我手动创建了 maifest 文件。

Manifest-Version: 1.0
Main-Class: com.logtest
Class-Path: lib/log4j-1.2.17.jar

Jar 文件的内容如下,我使用 jar 实用程序解压缩。

META-INF/MANIFEST.MF
.project
com/logtest.class
manifest.mf
lib/log4j-1.2.17.jar
.classpath

我已经导出了 jar 文件,当我尝试使用 commond java -jar JarTest2.jar 运行时,出现以下错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
    at com.logtest.<clinit>(logtest.java:6)

Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
    at java.net.URLClassLoader$1.run(Unknown Source)
    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

我知道它是一个未找到异常的类,但奇怪的是,当我使用 jdk1.5 创建同一个 jar 并运行命令工具时,jar 成功运行并且 java 类执行没有任何错误。

我不知道为什么会这样,因为一切都是一样的。

我的是一台 64 位 Windows 7 机器,而另一台运行它的机器是 32 位 XP 机器。

当然,两台机器上的eclipse ide版本不同。

你能否让我知道我正在做的事情有什么问题,或者我错过了什么。

感谢 Vikeng21

4

2 回答 2

1

我很确定 Java 不支持嵌入式 Jars。我建议将 lib/log4j-1.2.17.jar 文件移到文件系统中(以便它在与可执行 Jar 相同的目录中创建一个子文件夹 ./lib 并查看是否有所不同。

如果你真的想使用嵌入式 Jar,你可以阅读One-Jar

你应该有一个目录结构

.\JarTest2.jar
.\lib\log4j-1.2.17.jar

在您的文件系统上。log4jJar 不应嵌入(包含在)文件JarTest2.jar

于 2012-08-12T19:16:25.887 回答
0

请检查您的 log4j.jar 是否重复。例如,一个 log4j.jar 在 lib 文件夹下,另一个在 Eclipse 的引用库下。如果重复,请移除一个 jar 并重新部署。

于 2012-08-13T04:20:22.870 回答