2011-03-16 20 views
0

我想了解瓶和包如何在Java工作。爲此,我創建了一個簡單的測試JAR,並試圖使用該jar中包含的類。很簡單,但它給我錯誤,如「未找到類」。這裏的設置:瞭解JAR和包在Java中

1)我有一個名爲MyHelloWorld.java文件,該文件將在JAR包裝:

package com.mytest; 

public class MyHelloWorld { 
    public String getHello() { 
     return "Hello"; 
    } 
    public static void main(String[] args) { 
     System.out.println("Hello world!"); 
    } 
} 

2)我稱之爲「HelloHello.java」另一個文件,它使用的功能getHello()在com.mytest.MyHelloWorld

import com.mytest.*; 

public class HelloHello { 
    public static void main (String[] args) { 
     MyHelloWorld hello = new MyHelloWorld(); 
     System.out.println(hello.getHello()); 
    } 
} 

3)向打包JAR內的MyHelloWorld類,我在當前目錄中創建的文件夾com/mytest,並移動MyHelloWorld.java到該文件夾​​

4)我使用javac MyHelloWorld.java

5)我跑jar -cf myhello.jar ./com/mytest/*.class從根文件夾來創建JAR文件(如在http://www.javacoffeebreak.com/faq/faq0028.html描述)

6)我複製HelloHello.java該文件夾中編譯MyHelloWorld.java和myhello.jar與任何東西的一個新文件夾,來測試這種設置

7)javac -cp ./*.jar HelloHello.java [成功]

8)java -cp ./*.jar HelloHello [錯誤](我也試過只是'的Java的HelloWorld」,WHI CH失敗過,有不同的錯誤消息)

最後這句話失敗消息:

$java -cp ./*.jar HelloHello 
Exception in thread "main" java.lang.NoClassDefFoundError: HelloHello 
Caused by: java.lang.ClassNotFoundException: HelloHello 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:315) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:250) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:398) 

任何想法,爲什麼它的失敗?您可以提供有關它爲何以這種方式工作的任何見解,以及如何在JAR等內定義程序包名稱。

+0

是否有使用IDE的選項,以便您不必處理所有這些問題? – 2011-03-16 00:37:22

+0

這是我的理解更多,但沒有,沒有真正計劃使用IDE ... – mindthief 2011-03-16 00:53:24

回答

1

你應該使用:

java -cp .:./* HelloHello 

java and javac treat -cp argum有點不同。隨着java在CP的*會自動加載所有找到在給定位置的罐子。

另外,結腸:是不同類路徑元件之間的分隔符。

+0

謝謝,*是我正在尋找的解決方案 - 比單獨添加所有jar更清潔! – mindthief 2011-03-16 16:58:58

5

我相信這是看在罐子爲您HelloHello類。您可能也需要類路徑中的當前文件夾。

java -cp .:myhello.jar HelloHello 
+0

謝謝,應該分號是冒號嗎?我在Unix中。以分號運行會給出一條用法消息。我嘗試了'java -cp。:*。jar HelloHello',它現在失敗,並且在線程中發生異常「main」java.lang.NoClassDefFoundError:com/mytest/MyHelloWorld \t at HelloHello.main(HelloHello.java:5) 拋出java.lang.ClassNotFoundException:由造成com.mytest.MyHelloWorld \t在java.net.URLClassLoader的$ 1.run(URLClassLoader.java:200) ...等 ' – mindthief 2011-03-16 00:42:57

+0

也許用分號嘗試,但它引用保護它免受外殼侵害。 'java -cp'。; myhello.jar'HelloHello' – 2011-03-16 01:33:10

+0

剛剛嘗試過,並沒有用'java -cp。:*。jar HelloHello'獲得任何成功。不得不實際命名jar'java -cp。:myhello.jar HelloHello' – Sean 2011-03-16 01:39:54

0

確保如果HelloHello.class是在適當的目錄結構(COM/mytest的)不是改變你的第8步:

8) java com.mytest.HelloHello //or java -cp .;*.jar com.mytest.HelloHello 
+0

所以現在,HelloHello只是導入了com.mytest包,其中MyHelloWorld是一個類。 HelloHello不是該軟件包的一部分。我覺得它不應該成爲軟件包的一部分,因爲在大多數情況下,您將使用定義它們自己的軟件包的JAR。我是否正確理解這一點? – mindthief 2011-03-16 00:46:32

+0

對不起,我以爲它是包com.mytest :) Java包將模塊組織到類中,強烈建議將所有類放入包中 – smas 2011-03-16 00:59:29

0

好,java HelloHello工程太