我正在尝试为将在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语句来运行一个而不是另一个?
答案 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”。