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

基于Java版本运行不同的Bash命令,java,bash,gcj,Java,Bash,Gcj,我正在尝试为一个Java项目开发一个bash构建脚本,该项目将在Ubuntu和Fedora上运行。Ubuntu使用gcj编译器,而Fedora使用IcedTea 两者报告错误和警告的方式略有不同,我想忽略这些警告(我知道,这通常不是一个好主意,但有些警告只是白痴) 对于gcj,我想运行: javac *.java 2>&1 | grep -A 4 "error:" javac *.java 2>&1 | grep -A 4 "error:\|errors\|.jav

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

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

对于gcj,我想运行:

javac *.java 2>&1 | grep -A 4 "error:"
javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:"
但对于IcedTea,我想运行:

javac *.java 2>&1 | grep -A 4 "error:"
javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:"
我对bash还是新手,那么我该如何编写一个if语句,根据javac版本分别运行一个和另一个呢

    #!/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
不正确,请根据您的需要进行相应的更改


如果我没弄错你的问题的话,那就行了。如何获得版本-我不太清楚,但是如果我的
javac-version
不正确,请根据您的需要进行相应的更改。

假设您的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”没有相同的输出。

假设您的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”没有相同的输出。

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

  • 由于shell差异、不同的命令位置、不兼容的命令选项等原因,脚本往往不可移植。。。即使你想让手机便携

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

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


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

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

  • 由于shell差异、不同的命令位置、不兼容的命令选项等原因,脚本往往不可移植。。。即使你想让手机便携

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

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


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

这很接近,但我在第二条if语句中得到了错误“[:javac:binary operator expected”。此外,如果我在第一行后面放一个“echo$javac_VERSION”,它什么也没有显示。已确认,让我试试。这很接近,但我得到了错误”[:javac:binary operator expected”出现在第二条if语句中。另外,如果我在第一行后面放一个“echo$javac_VERSION”,它什么也不显示。已确认,让我试试。投票,好的版本&简单(我喜欢),效果很好。投票,好的版本&简单(我喜欢)而且工作得很好。-1 XML在某种程度上比Makefile好?ant是一种搜索问题的解决方案。它的存在仅仅是因为它的作者无法在Makefiles中记录它们所属的位置和允许它们的空间。并不是使用XML让ant比Make好。(我认为这只是一个微不足道的语法差异。)相反,是Ant的执行模型造成了所有的不同。Make的问题是它生成要按特定顺序执行的shell命令,这些命令通常是不可移植的。相比之下,Ant声明要执行的任务,并让Ant应用程序(和插件类)执行找出如何执行任务。-1 XML在某种程度上优于Makefile?ant是一种解决问题的方法。它的存在仅仅是因为它的作者无法在Makefiles中记录它们所属的位置和允许它们的空间。并不是使用XML使ant优于Make。(我认为这只是一个微不足道的语法差异。)相反,是Ant的执行模型造成了所有的不同。Make的问题是它生成要按特定顺序执行的shell命令,这些命令通常是不可移植的。相比之下,Ant声明要执行的任务,并让Ant应用程序(和插件类)执行找出如何执行任务。