2011-06-02 164 views
1

如果我創建superjar.jar並且它需要jar文件stellar.jar我需要將以下行添加到清單文件superjar.jar Class-Path: path/to/stellar.jar。但是在我的classpath中我已經有了stellar.jar。那麼這裏的交易是什麼?爲什麼superjar.jar不能從我的類路徑中查找stellar.jar的位置?創建Jar文件,重複類路徑

+1

'superjar.jar'是一個可運行的jar文件嗎?在這種情況下,它需要在清單中。 – CoolBeans 2011-06-02 18:26:47

回答

0

我需要將下面的行添加到superjar.jar類路徑清單文件:路徑/到/ stellar.jar。

你需要一個路徑在superjar,如果環境變量CLASSPATH被忽略,它被忽略,如果你使用的superjar爲可執行的JAR文件,並與

java -jar superjar.jar 

superjar.jar啓動可以訪問類路徑,如果啓動時沒有用不同的專用類路徑覆蓋類路徑,並且沒有運行可執行jar的技術,它總是隻使用該jar中的CLASSPATH,並且始終忽略額外的classpath嘗試。

CLASSPATH=/foo/bar/superjar.jar:/opt/some/stellar.jar 
java somepackage.SomeClass 

等級路徑是相對的還是絕對的是一個不同的,無關的討論。以上示例使用Unix/Linux-Syntax。在Windows上,您可以使用反斜槓和分隔符「;」。

+0

那麼基本上你說的是,在使用可執行jar文件時,命令行上指定的類路徑總是被忽略?相反,類路徑總是在清單文件的上下文中派生出來的?看來情況就是這樣。在非可執行的上下文中,這是放鬆的,所以我不需要在清單文件中指定依賴關係,只要我使用-classpath開關指定它們即可。 – fthinker 2011-06-03 21:57:02

+0

是的,如果我理解你是對的。你可以 - 即使你有一個可執行的jar - 通過'java -cp /foo/bar/superjar.jar:/opt/some/stellar.jar somepackage.SomeClass'運行(或者運行其中一個)程序。 ,如果你以這種方式添加所有強制類。這可能很有趣,主要是使用更新版本的JDBC驅動程序或更快的XML解析器。 – 2011-06-04 00:03:19

0

如果CLASSPATH表示一個環境變量,那麼您將要了解Java,所有IDE以及所有Java EE應用服務器都會忽略它。

我沒有在我工作的任何機器上使用CLASSPATH環境變量,因爲它沒用。您需要了解如何正確設置CLASSPATH而不依賴於環境變量。

+0

不,我在這裏沒有使用任何環境變量。儘管我通常會忘記那個有很多混亂的人,但是感謝你們。 – fthinker 2011-06-03 21:50:49

+0

Whups。沒錯,因爲我在這裏的兩臺機器上實際使用了CLASSPATH環境變量。所以它不被忽略,只是不可取。這種混淆通常來自於我在.bashrc中沒有執行'export CLASSPATH';) – fthinker 2011-06-03 22:05:09

0

兩件事情:

  1. 的路徑stellar.jar相對於superjar.jar
  2. 如果stellar.jar已經在類路徑,它是在類路徑中,不論什麼superjar.jar的艙單說。
+0

至少在EXECUTING superjar.jar的環境中,從我的測試看來,您需要在裏面放入stellar.jar清單文件。我從清單文件中清除了它,然後運行java -cp /path/to/stellar.jar superjar.jar並失敗。只有當我在清單中包含Class-Path:/path/to/stellar.jar時才起作用。 – fthinker 2011-06-03 21:52:59

+0

這意味着你的運行時類路徑,包括superjar.jar不包括stellar.jar – 2011-06-03 21:53:59

+0

嗯,這就是問題及其原因,因爲stellar.jar不在清單文件中(清單文件Class-path指令明顯規定了類路徑一個可執行的jar文件) – fthinker 2011-06-03 22:04:17