Dans de nombreux projets Java, on voit souvent que les paramètres personnalisés du programme appellent le script shell de package de commande java. Par exemple,
$ Ant_home / bin / ant, $ groovy_home / bin / groovy
, Même dans notre programme TimeMachine Scheduler, peut être vu
$ Etmachine_Home / bin / scheduler.sh
Il est ennuyeux et facile de fabriquer ces scripts d'emballage. La plupart des problèmes proviennent de la définition du chemin de classe correct au programme. Si vous développez des projets internes pour une entreprise, vous pouvez rester à l'écart de la voie enchevêtrée et du problème variable environnementale. Mais pour les projets open source, les gens doivent rendre les emballages plus flexibles et universels. La plupart des versions .bat ont été fournies. Windows DOS est en effet un terminal brutal et restreint sans répondre à votre script de projet. Par conséquent, j'encourage souvent les autres à utiliser autant que possible Cygwi. Au moins, il a une véritable coquille de bash. D'autres problèmes courants sont que ces emballages perdront bientôt le contrôle et de nombreux scripts redondants apparaîtront autour de votre projet.
Introduction du script d'emballage Run-Java
Si vous voyez le code de $ timemachine_home / bin / scheduler.sh, vous verrez qu'il est en fait appelé le script Run-Java dans le même répertoire.
Dir = $ (dirname 0 $) scheduler_home = $ dir / run-java -dscheduler.home = "$ scheduler_home" timemachine.tool.tool.dulerserver "" $ @ "
Comme vous pouvez le voir, notre run-java peut utiliser l'option -D, non seulement cela, il peut également utiliser l'option -cp! De plus, vous pouvez spécifier ces options derrière la classe principale! Cela peut faire du java Run-java par d'autres scripts, et peut toujours ajouter des attributs système supplémentaires et un chemin de classe.
Par exemple, TimeMachine est livré avec la bibliothèque Groovy, vous pouvez donc simplement l'appeler comme ça
Groovy: $ timemachine_home / bin / run-java groovy.groovymain test.groovy, Sans télécharger à nouveau toute la branche.
Vous pouvez facilement l'utiliser dans n'importe quel répertoire, il confirme son répertoire, puis charger automatiquement n'importe quel package JAR dans le répertoire Lib. Maintenant, si vous souhaitez ajouter plus de sacs en pot pour exécuter Groovy, vous pouvez utiliser l'option -CP comme suit: Options CP:
$ TimeMachine_Home / bin / run-java -cp "$ home / apps / my-app / lib / *" groovy.groovymain test.groovyHabituellement, si vous configurez Java ClassPath, vous faites souvent des erreurs lorsque vous ne faites pas attention, mais vous pouvez l'exécuter à l'avance avec Run-Java:
Run_java_dry = 1 $ timemachine_home / bin / run-java -cp "$ home / apps / my-app / lib / *" groovy.groovymain test.groovy
Il vous suffit d'exécuter le code de ligne ci-dessus dans la ligne d'invite de commande. Il sortira les commandes Java de toutes les options et paramètres avec une sortie complète.
Run-Script contient également beaucoup d'autres options, et vous pouvez le comprendre en visualisant son annotation. Le script actuel peut s'exécuter dans n'importe quel Cygwin Linux Bash et Windows.
Utilisez Run-Java via Maven en développement
Selon l'exemple mentionné ci-dessus, en supposant que la structure de libération du projet est la suivante:
$ TIMEMACHINE_HOME + -BIN / Run-Java + -Lib / *.
Mais quel est le répertoire pendant le processus de développement? Un cas courant est: vous souhaitez exécuter le dernier code compilé sous Target / Classes au lieu d'emballer ou de publier l'intégralité du projet. Vous pouvez également utiliser Run-Java dans ce cas. Tout d'abord, ajoutez Bin / Run-Java à votre projet, puis exécutez
Dépendance de la compilation MVN: Dépendances de copie
Tous les fichiers JAR seront générés sous la cible / dépendance. Il vous suffit de le faire. Run-Java détectera automatiquement ces répertoires et créera le chemin de classe correct pour votre classe principale.
Si vous utilisez Eclipse pour développer, votre répertoire cible / classe sera toujours mis à jour et Run-Java peut devenir un trésor dans le développement de votre projet.
Get Run-Java Packaging Script
#! / Usr / bin / env bash ## Copyright 2012 Zemian Deng ## Licensed sous la licence Apache, version 2.0 (la "licence"); # Vous ne pouvez pas utiliser ce fichier conformément à la Livense. # Vous pouvez obtenir un Copie de la licence à ## http://www.apache.org/licenses/2.0## Sauf si requise par la loi applicable ou convenu par écrit, le logiciel # ed en vertu de la licence est distribué sur une base "tel quel", # # Sans garanties ou conditions d'aucune sorte, exprime ou implicite. Voir la licence pour la langue spécifique régissant les autorisations et # limite les ations sous la licence. # Un script de wrapper qui exécute toute application Java6 dans Unix / Cygwin Env. est supposé être situé dans le répertoire "bin" d'une application. Dans tout ce qui est dans le système de fichiers et il fait toujours référence à ce répertoire d'application #. Target / Test-Classes ", # Target / Classes" et "Target / Dependency" H De tous les chemins de chemin doivent être dans le chemin CyGWin / Unix, et ce script convertira automatiquement le chemin Windows où est nécessaire. -CP "Option, qui publiera le PostFix vers ClassPath existant. ## USAGE: # run-java [java_opts] <java_main_class> [-CP / More / ClassPath] [-dsysprop = value] ## Exemple: # run-java Exemple. Bonjour # Example.hello -dname = World # Run-Java org.Junit.Runner.Junitcore Exmple.Hellotest -CP "C: /Apps/lib/junit4.8.2/*" ## Créé par: Zemian Deng 03/09 / 2012 # Ce script d'exécution d d ir (Resolve to Absolute Path) script_dir = $ (cd $ (dirname $ 0) && pwd) # ce dir est où ce script live.app_dir = $ (cd $ script_dir / .. && pd) # assume Le Dir de l'application est à un niveau à partir du script Dir # Paramètres par défaut java_home = $ {java_home: = / apps / jdk} # Ceci est le répertoire domestique de Java Development = $ classpath} # un préfixe de classe avant -classpath, par défaut à $ classpathrun_java_opts C'est : =} # Si ce n'est pas vide, sautez les options d'analyse automatique des options -d et -cp à partir de scripts arguments.run_java_no_autocp = $ {run_java_autocp: =} # Si noty pas vide, ne vous engagez pas Java, mais le proprint # OS Support spécial. Est l'exécutable java isjava_cmd = javaif [-d "$ java_home"]; Si $ cygwin; alors #Provide Windows Directory Conversion java_home_win = $ (cygpath -aw "$ java_home") app_dir_win = $ (cygpath -aw " $ Run_java_cp; $ app_dir_win / config "; fi if [-d" $ app_dir_win / cible / test -classes "]; alors run_java_cp =" $ run_java_cp; $ App_dir_win / cible / class "]; alors run_java_cp =" $ run_java_cp; $ app_dir_win / cible "; cy"]; "$ app_dir_win / lib"]; alors run_java_cp = "$ run_java_cp; $ app_dir_win / lib / *"; "]; Test -class "]; -classes"; / dépendance / * "; fi if [-d" $ app_dir / lib "]; alors run_java_cp =" $ run_java_cp: $ app_dir / lib / * "; d" après la classe principale java à partir des arguments de script # Ceci est fait pour pratiquement pratique Sake afin que les utilisateurs de ne pas exporter run_java_cp et run_java_opts # ey peuvent passer à la fin de ce script de run-java. = Disclare -a new_args idx = 0 # analyse tous les arguments et recherchez "-cp" et "pour arg dans" $ @ "; faire si [[-n $ find_cp]]; alors si [" $ os "=" windows_nt "]; alors # ne peut pas utiliser CygPath ici, car Cygpath va automatiquement expanser" * ", ce que nous ne voulons pas. L'utilisateur devra simplement utiliser le chemin d'os Cygpath -w -a $ arg) run_java_cp = "$ run_java_cp; p =" $ run_java_cp: $ arg "fi find_cp = else case $ arg in '-cp') find_cp = 1; '-d' *) run_java_opts =" $ Run_java_opts $ arg "; *) new_args [$ idx] =" $ arg "lee t idx = $ idx +1 ;; esac fi fait # affiche la commande java full. "$ Run_java_dry"]; alors echo "$ java_cmd" $ run_java_opts -cp "" $ run_java_cp "" $ {new_args [@]} "fi # run java Classe principale" $ java_cmd "$ run_java_opts -cp" $ run_java_cp "" "" "" "" "" "" "" "" "" "" "" "$ {new_args [@]}" Fielse # affiche la commande java complète. If [- n "$ run_java_debug"] || [-n "$ run_java_dry"]; run_java_dry "]; puis" $ java_cmd "$ run_java_opts -cp" $ run_java_cp "" $ @ "fiFi