java添加到路徑
我在一個目錄中有一些 .jar 文件,
/home/unix/dfernand/bin/picard/picard-tools-1.106
.但是當我將目錄添加到
PATH
我CLASSPATH
的 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 用於查找執行檔,例如java
orls
或bash
. 所以你不需要觸摸它,除非外殼抱怨類似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
如果這仍然太麻煩,您可以將其放入 shell
alias
或腳本中。使用腳本方法,您也可以直接將您在問題中提到的工作命令行放入腳本中,而完全不接觸環境變數。根據 Java 文件,這實際上似乎是首選方式,可能至少部分是因為將很多東西放在全域使用中
CLASSPATH
會增加類載入的成本,因為需要訪問類路徑中提到的所有(不相關的)位置,也可以找到要載入的類。但是,我不知道這是否會成為桌面應用程序的問題,除非類路徑非常長,包含許多大型檔案。如果許多檔案包含同一類的不同版本,避免全域添加內容也可以防止版本衝突。