2010-01-28 41 views
0

我正在嘗試開發一個將在Ubuntu和Fedora上運行的Java項目的bash構建腳本。 Ubuntu使用gcj編譯器,而Fedora使用IcedTea。基於Java版本運行不同的Bash命令

兩人都以略有不同的方式報告他們的錯誤和警告,我想忽略警告(我知道,通常不是一個好主意,但某些警告僅僅是愚蠢的)。

對於GCJ,我想運行:

javac *.java 2>&1 | grep -A 4 "error:" 

但IcedTea項目,我想運行:

javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:" 

我還是新打壞,所以我怎麼會寫的,如果聲明將基於javac版本運行一個和另一個?

回答

4

假設您的java和javac二進制文件相匹配,並且該冰塊是特殊情況。

#!/bin/bash 

ERROR="error:" 

java -version 2>&1 | grep -i icedtea > /dev/null 
if [ $? -eq 0 ]; then 
    ERROR="error:\|errors\|.java:" 
fi 

javac *.java 2>&1 | grep -A 4 $ERROR 

在我的系統,IcedTea項目和太陽有 「的javac -version」 相同的輸出,而不是 「Java的版本」。

+0

投票,好的版本和簡單(我喜歡),並運作良好。 – Anders 2010-01-28 15:27:10

1
#!/bin/sh 

    JAVAC_VERSION="`java -version 2>&1 /dev/null | awk '/IcedTea/ {print $4}' | sed -e 's/[\(0-9]//g'`" 
    ICEDTEA="IcedTea" 

    if [ ${JAVAC_VERSION} = ${ICEDTEA} ]; then 
     javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:" 
    else 
     javac *.java 2>&1 | grep -A 4 "error:" 
    fi 

    exit 0 

這應該這樣做 - 如果我正確地理解你的問題。如何獲得版本 - 我不太確定,但如果我的javac -version不正確,只需根據您的需求進行相應更改即可。

+0

這很接近,但在第二條if語句中出現錯誤「[:javac:binary expected」。 – Cerin 2010-01-28 13:39:48

+1

另外,如果我在第一行之後放置了「echo $ JAVAC_VERSION」,它什麼都不顯示。 – Cerin 2010-01-28 13:44:30

+0

已確認,讓我試試看。 – Anders 2010-01-28 13:53:04

1

編寫Java構建的bash腳本(或任何其他shell語言)有許多問題:

  • 腳本往往是不可移植歸因於外殼的差異,不同的命令位置,不兼容的命令選項等等...即使你嘗試製作便攜式。

  • 腳本不能依賴應付(或至少不容易)

  • 腳本不能重新編譯只有東西應付已改變

相反,我建議你寫一個「版本。 xml「文件並使用Ant build tool。 Ant具有運行在任何運行Java的構建平臺上的優勢,並且能夠處理絕大多數平臺差異。它有點像一個更好的「Make」,專爲構建Java而設計。

+0

-1 XML在某種程度上比Makefile更好?螞蟻是尋找問題的解決方案。它的存在僅僅是因爲它的作者無法將標籤保留在它們所屬的位置以及它們在Makefiles中被允許的位置。 – 2010-01-28 15:30:51

+1

這不是使用XML使Ant比Make更好。 (這只是IMO的一個微不足道的語法差異。)相反,Ant的執行模型使得所有的差異成爲可能。 Make的問題在於它產生的shell命令是以特定的順序執行的,而這些命令通常是不可移植的。相比之下,使用Ant您可以聲明要執行的任務,並讓Ant應用程序(和插件類)找出如何執行這些任務。 – 2010-01-28 16:24:20