2012-08-12 92 views
2

我已經在java中使用eclipse ide創建了一個簡單的項目來測試log4j功能。 我需要使用java中的jar工具從命令提示符運行應用程序。 logtest.java文件是簡單的java文件,它定義了一個記錄器,如下所示。 它引用另一個Jar文件中的Logger。下面是目錄結構。在JDK 1.6中執行jar文件給出問題

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 

清單文件條目如下,我手動創建了maifst文件。

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文件,當我嘗試使用的罐子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 

的commond java的運行我知道它的一類未發現異常,但奇怪的是,當我使用jdk1.5創建相同的jar並運行命令工具時,jar運行成功,並且java類沒有任何錯誤地執行。

我不知道爲什麼這是因爲一切都是一樣的。

mine是一臺64位Windows 7機器,其運行的其他機器是一臺32位XP機器。

當然,eclipse ide的版本在兩臺機器上都不同。

您能否讓我知道我在做什麼或者我是否錯過了其他東西。

感謝 Vikeng21

+0

你說你想測試Log4j? 但是在你的'main'方法中,你正在使用'System.out.println',這不是'log4j'。 – 2012-08-12 19:55:23

+0

嗨,埃米爾。我的意圖是看到記錄器能夠正常工作,並從另一個目錄中的另一個jar文件(log4j.jar)中識別出來。系統只是爲了測試目的,我認爲這裏無論是否存在都不重要,但請強調手頭的問題。 – vikeng21 2012-08-13 02:51:26

回答

1

我敢肯定,Java不支持嵌入式罐。我建議將lib/log4j-1.2.17.jar文件移出到文件系統(以便它可以在與您的可執行文件Jar &相同的工作站中創建一個子文件夾./lib,看看這是否有所作爲。

如果你真的想用嵌入式罐子,你可以採取的One-Jar

讀您應該有

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

目錄結構在你的文件系統。該log4j罐不應該被嵌入(包含在)JarTest2.jar文件

+0

感謝MadProgrammer。你能否詳細說明你的文件系統是什麼意思。一個例子對我更好地理解會有幫助。那麼你對32位Windows XP機器上發生的奇怪事情有什麼看法? java如何識別那裏的log4j jar。只是對這種令人不安的行爲感到好奇。 – vikeng21 2012-08-12 19:36:41

+1

查看更新。我懷疑你的開發機器有一個類路徑設置,指向log4j.jar文件在你的文件系統 – MadProgrammer 2012-08-12 19:46:19

+0

WOW多數工作的地方。感謝很多MadProgrammer。以及我將不得不根據這個想法改變其他依賴罐子的所有classpath設置。我也想嘗試OnJar,但現在這已經足夠了。非常感謝所有人。 – vikeng21 2012-08-13 06:18:16

0

請檢查您的log4j.jar是否重複。例如,一個log4j.jar位於lib文件夾下,另一個位於eclipse的Referenced庫下。如果重複,則刪除一個jar並重新部署。

+0

謝謝Sai.yes下有一個參考庫。我試圖刪除參考庫下的log4j jar,但delet選項未啓用。你可以讓我知道我可以如何刪除,以後我可以重新部署。我正在使用Eclipse Indigo進行開發。 – vikeng21 2012-08-13 05:08:21

+0

@ vikeng21右鍵單擊參考庫和Build Path> Configure Build Path,然後選擇log4j.jar並將其刪除。只應在lib文件夾下添加log4j.jar。 – 2012-08-13 05:17:02

+0

我按照你所說的完成了,但從參考庫中刪除log4j.jar後,它從類路徑中被移除,並且java類開始顯示錯誤。你看到我的文件夾結構嗎?我將src文件夾中的所有類指向指向log4j.jar所在的lib目錄。這是正確的還是缺少的東西?我想要一個包含所有依賴jar的jar包 – vikeng21 2012-08-13 05:23:24