2014-08-29 77 views
3

我需要運行帶有自定義類路徑的java命令。如何指定一個與系統無關的類路徑

在Windows上我需要鍵入:

java -cp foo;bar 

在Linux上我需要鍵入:

java -cp foo:bar 

我們目前有一個包含第一個版本,幷包含一個sh文件.bat文件第二版。這在大多數情況下都可以正常工作,但是在Windows上無法使用git-bash,這需要帶有分號分隔符的shell腳本。

是否有任何系統獨立的方式來編寫這樣的類路徑?

我想的有點像

java -cp foo -cp bar 

但這並不這樣。

目前我看到的唯一方法是使用一些shell邏輯來確定操作系統並從中生成正確的命令行。

有沒有更簡單的方法來做到這一點的java方式?

+0

如何在Windows下運行shell腳本? – Jens 2014-08-29 08:11:05

+0

是的,bash也適用於windows。例如,如果你安裝了git,它包含一個非常漂亮的shell:git-bash。 – michas 2014-08-29 08:12:45

+2

不是我所知道的。想到的最接近的事情是將類路徑信息放在清單中並將其打包在jar中。 – aioobe 2014-08-29 08:14:26

回答

1

請不要指定它。使用'java -jar'命令,用包含Main-Class屬性的Manifest.MF命名JAR文件,必要時還可以使用Class-Path屬性,指定其依賴的任何其他JAR的相對位置。由於這是通過空格分隔的相對URL完成的,因此它是自動獨立於系統的。

+0

*由於這是通過相對URL完成的,因此它是自動獨立於系統的。* - 似乎表明您相信存在問題的*路徑*。 Java在Windows和* nix上接受具有'/'的類路徑。它是平臺特定的*路徑分隔符*。 – aioobe 2014-08-29 10:03:01

+0

Class-Path屬性是否允許使用像'lib/*'這樣的通配符? (快速測試不起作用。)classpath中的路徑與當前工作目錄相關,對嗎? – michas 2014-08-29 10:04:54

+0

不,清單文件不支持類路徑通配符。請參閱http://docs.oracle.com/javase/6/docs/technotes/tools/windows/classpath.html:*但是,類路徑通配符在Class-Path jar-manifest頭文件中不受支持*它們受支持當在班級路徑上提供時。 – aioobe 2014-08-29 10:06:20

2
  • 選項1:如果你不介意運行前創建一個罐子,你可以在清單文件中指定的類路徑。這些路徑是空間分隔的。對於使用例如uname檢測OS(見Adding Classes to the JAR File's Classpath

  • 選項2添加代碼。然後執行SEP=\;SEP=:並使用path${SEP}path。 (見例如How to check if running in Cygwin, Mac or Linux?

  • 方案3: grep的java的幫助輸出看人品的Java所期待的分離:

    SEP=$(java -h |& grep "A [:;] separated" | grep -o "[:;]") 
    
  • 方案4:如果您已經安裝了JDK,你可以打印File.pathSeparator

    echo "interface C { static void main(String[] a) { System.out.print(java.io.File.pathSeparator); }}" > C.java 
    javac C.java 
    java C 
    rm C.{java,class} 
    

注:只有路徑分隔符,即; VS :,是特定於平臺。正斜槓(即some/class/path)在分離目錄的所有系統上都正常工作。

+1

當前選項3('SEP = $(java -h |&grep「A [:;]分隔的」| grep -o「[:;]」)')僅適用於英文語言環境。 (SE)= $([$(java -h |&grep「;」| wc -l)== 1]這是我的成功(在德語* Windows 7 *和英語* Ubuntu 14.04 LTS *上成功測試過) && echo「;」|| echo「:」)' – Abdull 2016-04-22 14:10:41

+0

選項3必須是一個笑話。 – 0xF 2017-11-21 21:17:27

+0

@ 0xF,這有點冒險,但如果你想到它,正在運行的系統上的'java'命令是分隔符符號'java'接受的唯一真值源。 'java -h'碰巧打印了正確的符號。增加了第四個選項,這可能不那麼hacky,但需要JDK。 – aioobe 2017-11-21 21:51:06