Выполнение различных команд Bash на основе версии Java - PullRequest
0 голосов
/ 28 января 2010

Я пытаюсь разработать сценарий сборки bash для проекта Java, который будет работать в Ubuntu и Fedora. 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?

Ответы [ 3 ]

4 голосов
/ 28 января 2010

Предполагается, что двоичные файлы 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 голос
/ 28 января 2010

Написание сценариев сборки Java на bash (или на любом другом языке оболочки) имеет ряд проблем:

  • Сценарии, как правило, являются непереносимыми из-за различий оболочки, различного расположения команд, несовместимых опций команд и т. Д. ... даже если вы пытаетесь сделать переносимым.

  • сценарии не могут справиться с зависимостями (или, по крайней мере, нелегко)

  • скрипты не могут справиться с перекомпиляцией только того, что изменилось

Вместо этого я предлагаю вам написать файл "build.xml" и использовать Ant build tool . Преимущество Ant заключается в том, что он работает на любой платформе сборки, работающей на Java, и позволяет позаботиться о подавляющем большинстве различий между платформами. Это что-то вроде лучшего "Make", разработанного специально для сборки Java.

1 голос
/ 28 января 2010
    #!/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 неверен, просто измените его в соответствии с вашими потребностями.

...