2010-01-28 5 views
0

J'essaie de développer un script de génération bash pour un projet Java qui sera exécuté sur Ubuntu et Fedora. Ubuntu utilise le compilateur gcj tandis que Fedora utilise IcedTea.Exécution de commandes Bash différentes basées sur Java Version

Les deux rapportent leurs erreurs et avertissements de manière légèrement différente, et je veux ignorer les avertissements (je sais, pas généralement une bonne idée, mais certains des avertissements sont tout simplement idiot).

Pour gcj, je veux courir:

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

mais pour IcedTea, je veux courir:

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

Je suis encore nouveau pour bash, alors comment pourrais-je écrire un si déclaration qui fonctionnerait l'un contre l'autre basé sur la version javac?

Répondre

4

En supposant que vos binaires java et javac correspondent, et que icedtea est le cas particulier.

#!/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 

Sur mon système, icedtea et le soleil ont la même sortie pour "javac -version", mais pas pour "java -version".

+0

Votez, belle version et simple (ce que j'aime) et fonctionne bien. – Anders

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 

Cela devrait le faire - si j'ai bien compris votre question. Comment obtenez-vous la version - im pas tout à fait sûr, mais si mon javac -version est incorrect il suffit de le modifier en fonction de vos besoins.

+0

Ceci est proche, mais j'obtiens l'erreur "[: javac: opérateur binaire attendu" sur la seconde if instruction. – Cerin

+1

Aussi, si je mets un "echo $ JAVAC_VERSION" juste après la première ligne, il ne montre rien. – Cerin

+0

Reconnu, laissez-moi essayer. – Anders

1

écriture Java créer des scripts en bash (ou toute autre langue shell) a un certain nombre de problèmes:

  • scripts ont tendance à être dû non-portables à débourser des différences, des emplacements de commande, les options de commande incompatibles et ainsi de suite ... même si vous essayez de faire le portable.

  • scripts ne peuvent pas faire face aux dépendances (ou du moins pas facilement)

  • scripts ne peuvent pas faire face à recompiler que des choses qui ont changé

Au lieu de cela, je suggère que vous écrivez un « build. xml "et utilisez le Ant build tool. Ant a l'avantage de fonctionner sur n'importe quelle plate-forme de build qui exécute Java, et de prendre en charge la grande majorité des différences de plate-forme. C'est un peu comme un meilleur "Make" conçu spécifiquement pour la construction de Java.

+0

-1 XML est en quelque sorte mieux que Makefile? Ant est une solution à la recherche d'un problème. il existe simplement parce que son auteur ne pouvait pas garder les onglets où ils appartiennent et les espaces où ils sont autorisés dans Makefiles. –

+1

Ce n'est pas l'utilisation de XML qui rend Ant meilleur que Make. (C'est juste une différence syntaxique triviale IMO.) Plutôt c'est le modèle d'exécution de Ant qui fait toute la différence. Le problème avec Make est qu'il génère des commandes shell à exécuter dans un ordre particulier, et ces commandes sont généralement non portables.En revanche, avec Ant, vous déclarez les tâches à effectuer et laissez l'application Ant (et les classes de plugin) déterminer comment exécuter les tâches. –

Questions connexes