0

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

两者都以稍微不同的方式报告错误和警告,我想忽略警告(我知道,这通常不是一个好主意,但有些警告简直是白痴)。

对于 gcj,我想运行:

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

但对于 IcedTea,我想运行:

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

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

4

3 回答 3

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”却没有。

于 2010-01-28T13:29:15.760 回答
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的不正确,只需根据您的需要进行更改。

于 2010-01-28T13:23:55.647 回答
1

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

  • 由于 shell 差异、不同的命令位置、不兼容的命令选项等等,脚本往往是不可移植的……即使您尝试使可移植。

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

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

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

于 2010-01-28T15:05:14.743 回答