基于Java版本运行不同的Bash命令

时间:2010-01-28 13:04:51

标签: java bash gcj

我正在尝试为将在Ubuntu和Fedora上运行的Java项目开发一个bash构建脚本。当Fedora使用IcedTea时,Ubuntu使用gcj编译器。

两者都以略微不同的方式报告他们的错误和警告,我想忽略警告(我知道,通常不是一个好主意,但有些警告只是愚蠢的)。

对于gcj,我想运行:

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

但对于IcedTea,我想运行:

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

我还是bash的新手,那么我如何根据javac版本编写一个if语句来运行一个而不是另一个?

3 个答案:

答案 0 :(得分:4)

假设您的java和javac二进制文件匹配,并且icedtea是特例。

#!/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和sun对“javac -version”的输出相同,但不适用于“java -version”。

答案 1 :(得分: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不正确,只需根据您的需要进行更改。

答案 2 :(得分:1)

用bash(或任何其他shell语言)编写Java构建脚本存在许多问题:

  • 由于shell差异,不同的命令位置,不兼容的命令选项等等,脚本往往是不可移植的......即使你试图制作便携式文件也是如此。

  • 脚本无法处理依赖关系(或至少不容易)

  • 脚本无法仅处理重新编译已更改的内容

相反,我建议您编写“build.xml”文件并使用Ant build tool。 Ant具有在运行Java的任何构建平台上运行以及处理绝大多数平台差异的优势。它有点像专为构建Java而设计的更好的“Make”。