Path

java添加到路徑

  • January 22, 2014

我在一個目錄中有一些 .jar 文件,/home/unix/dfernand/bin/picard/picard-tools-1.106.

但是當我將目錄添加到PATHCLASSPATH的 bashrc 中時,java 仍然無法辨識 .jar 文件,我不知道為什麼。

我試過了:

>export PATH="/home/unix/dfernand/bin/picard/picard-tools-1.106:$PATH"
> export CLASSPATH=$CLASSPATH:/home/unix/dfernand/bin/picard/picard-tools-1.106
> java -jar AddOrReplaceReadGroups.jar -h
Unable to access jarfile AddOrReplaceReadGroups.jar
>export CLASSPATH="/home/unix/dfernand/bin/picard/picard-tools-1.106:$CLASSPATH"
>java -jar AddOrReplaceReadGroups.jar -h
Unable to access jarfile AddOrReplaceReadGroups.jar

如果我做,

$$ niveum $$dfernand> java -jar /home/unix/dfernand/bin/picard/picard-tools-1.106/AddOrReplaceReadGroups.jar -h

它有效!但我希望它們在我的PATH/CLASSPATH

有人知道我的錯誤在哪裡嗎?我必須添加其他東西PATH/CLASSPATH嗎?我使用了一些錯誤的語法嗎?

首先,讓我們弄清楚這兩個環境變數之間的區別和它們的用途:

PATH僅由 shell 用於查找執行檔,例如javaorlsbash. 所以你不需要觸摸它,除非外殼抱怨類似java: command not found.

CLASSPATH是 Java 用來查找要載入的類的方法。但是,它的工作方式與 有點不同PATH:它應該包含指向單個或文件的路徑.class,或帶有萬用字元的條目。.zip``.jar

.jar、.zip 或 .class 文件的類路徑。每個類路徑都應以文件名或目錄結尾,具體取決於您將類路徑設置為:

  • 對於包含 .class 文件的 .jar 或 .zip 文件,類路徑以 .zip 或 .jar 文件的名稱結尾。
  • 對於未命名包中的 .class 文件,類路徑以包含 .class 文件的目錄結尾。
  • 對於命名包中的 .class 文件,類路徑以包含“根”包(完整包名中的第一個包)的目錄結尾。類路徑條目可以包含基本名稱萬用字元*,這被認為等同於指定目錄中所有文件的列表,副檔名為 .jar 或 .JAR。例如,類路徑條目 foo/*指定名為 foo 的目錄中的所有 JAR 文件。僅由 * 組成的類路徑條目將擴展為目前目錄中所有 jar 文件的列表。

包含 * 的類路徑條目將不匹配類文件。要匹配單個目錄 foo 中的類和 JAR 文件,請使用 foo;foo/* 或 foo/*;foo。選擇的順序決定了 foo 中的類和資源是否在 foo 中的 JAR 文件之前載入,反之亦然。

在這種情況下,您應該添加AddOrReplaceReadGroups.jar文件的路徑CLASSPATH,然後呼叫具有完整包名的類來啟動應用程序。被呼叫的類應該是包含該main()方法的類。在這種情況下,我不知道該類是什麼,但在Google搜尋後的一個瘋狂猜測是要呼叫的類是net.sf.picard.sam.AddOrReplaceReadGroups.

但是,當類儲存在存檔文件(.zip 或 .jar 文件)中時,類路徑條目是 .zip 或 .jar 文件的路徑並包括該路徑。例如,要使用 .jar 文件中的類庫,該命令應如下所示:

C:> java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool

(以上來自Oracle JavaSE7 文件的引用:設置類路徑,另請參閱關於 PATH 和 CLASSPATH的 Java 教程,以更完整地解釋它們的含義)

AddOrReplaceReadGroups.jar因此,添加路徑後要使用的命令行CLASSPATH應該是:

> java net.sf.picard.sam.AddOrReplaceReadGroups

如果這仍然太麻煩,您可以將其放入 shellalias或腳本中。

使用腳本方法,您也可以直接將您在問題中提到的工作命令行放入腳本中,而完全不接觸環境變數。根據 Java 文件,這實際上似乎是首選方式,可能至少部分是因為將很多東西放在全域使用中CLASSPATH會增加類載入的成本,因為需要訪問類路徑中提到的所有(不相關的)位置,也可以找到要載入的類。但是,我不知道這是否會成為桌面應用程序的問題,除非類路徑非常長,包含許多大型檔案。如果許多檔案包含同一類的不同版本,避免全域添加內容也可以防止版本衝突。

引用自:https://unix.stackexchange.com/questions/110296