2009-06-01 13 views
11

J'ai un fichier .jar que j'aimerais pouvoir appeler sans avoir à utiliser un chemin de fichier complet jusqu'à son emplacement.Un fichier .jar exécutable peut-il être appelé sans avoir à utiliser son chemin d'accès complet?

Par exemple, si le fichier .jar est situé à: /some/path/to/thearchive.jar

Je voudrais être en mesure d'exécuter avec:

java -jar thearchive.jar 

place de:

java -jar /some/path/to/thearchive.jar 

lorsque je suis ailleurs dans l'arborescence. Dans mon cas spécifique, je cours un Mac avec OS X 10.5.7 installé. Version Java "1.5.0_16". J'ai essayé d'ajouter "/ some/path/to" à PATH, JAVA_HOME et CLASSPATH, mais cela n'a pas fonctionné. Donc, comment est-ce que je configure pour exécuter un .jar à partir de la ligne de commande sans avoir à utiliser son chemin complet?

MISE À JOUR: Un autre élément à traiter serait des arguments. Par exemple:

java -jar /some/path/to/thearchive.jar arg1 arg2 

Cela peut avoir un effet sur la façon dont la question est traitée comme mentionné dans les réponses ci-dessous.

+0

Remarque, la commande: java jar thearchive.jar fonctionne très bien si je suis dans le répertoire avec le fichier .jar (Dans l'exemple:. "/ Some/path/to") L'objectif est pour mon répertoire de travail actuel être:/some/autre/place/sur/le/arbre et toujours juste utiliser: java -jar thearchive.jar sans avoir à utiliser le chemin complet. (c'est-à-dire java -jar /some/path/to/thearchive.jar –

Répondre

3

Vous pouvez ajouter une variable pour tenir le répertoire:

export JARDIR=/some/path/to 
java -jar $JARDIR/thearchive.jar 

Je ne suis pas sûr que vous pouvez le faire à partir de variables d'environnement implicitement.

+2

@Brabster - bonne idée - vous pouvez également définir la variable d'environnement sur "/some/path/to/thearchive.jar" et "java -jar $ JAR" – jabbie

+0

Cela fonctionne un peu mieux que l'alias quand vous devez lui passer des arguments supplémentaires.J'utilise un chemin complet vers le .jar suivi par @jabbie et appelant avec "java -jar $ JAR" puis passant les arguments –

1

Je ne crois pas. Si vous avez le jar spécifié dans votre CLASSPATH, vous pouvez simplement appeler java avec la classe principale spécifiée. (I.e. java com.test.Main) Sinon, vous pouvez créer un alias en vous shell pour exécuter la commande

alias execJar="java -jar /some/path/to/thearchive.jar" 

Ou une autre alternative est de créer un script d'emballage pour l'exécuter.

+0

Cette réponse est utile, mais elle présente des problèmes avec l'envoi d'arguments supplémentaires Tant que vous n'avez pas besoin de passer des arguments supplémentaires (que je n'ai pas listés dans ma question initiale), cela devrait –

+0

@stimulatingpixels Vous pouvez passer des arguments supplémentaires à une commande aliasée, ou si vous avez besoin d'être inséré à un emplacement arbitraire, créez une fonction à la place.Un script wrapper peut également être écrit pour passer par les arguments supplémentaires – jabbie

5

Non, vous ne pouvez pas.

L'exécution d'un fichier jar avec -jar n'implique aucun type de mécanisme de chemin de classe puisque le fichier jar est le chemin de classe.

Vous pouvez également utiliser un alias de shell pour lancer le fichier jar ou un petit fichier de script.

3

Selon to Sun:

java -jar app.jar 

Pour exécuter l'application à partir du fichier jar qui se trouve dans un autre répertoire, nous avons besoin de spécifier le chemin de ce répertoire comme ci-dessous: java -jar path/app.jar

où chemin est le chemin du répertoire où réside ce fichier app.jar.

Donc, soit le chemin dans une variable d'environnement « standard » ou définir une enveloppe qui serait dans votre PATH

+0

comme décrit dans suivre de réponse @ Brabster et @ la Jabbie, je suis d'exporter le chemin complet vers le fichier .jar comme: export THEJAR =// chemin/vers/thearchive.jar et l'exécuter via: java jar THEJAR $ Cela me permet d'envoyer aussi des arguments au besoin, comme: java jar THEJAR $ arg1 arg2 Et tout fonctionne comme prévu. –

0

Le système Java lui-même ne vous donne pas un moyen de spécifier quelque chose comme JAR_PATH (une liste des endroits pour rechercher des fichiers jar). Les autres réponses utiliser les fonctionnalités shell MAC/Unix:

  1. Définition d'une variable d'environnement
  2. Définition d'un alias
  3. utilisant Peut-être un lien symbolique (le fichier ou le répertoire).

Ce qui pourrait être utile est de savoir pourquoi la spécification du chemin entier est un problème. Cela peut nous guider quant à la meilleure réponse ou éventuellement trouver une solution complètement différente à votre problème.

+0

C'est vraiment juste une question de commodité. L'un des exemples spécifiques est le validateur XML multi-schéma (MSV) de Sun que j'utilise pour valider les fichiers XML par rapport aux schémas via la ligne de commande. Lorsque je suis dans un terminal du répertoire où se trouvent les fichiers .xml et .xsd, il est plus agréable de faire quelque chose comme "java -jar $ MSV schema.xsd doc.xml" que "java -jar/path/vers/le/real/msv.jar schema.xsd doc.xml ". –

+1

Dans ce cas, l'utilisation d'une variable d'environnement ou d'un alias résoudra probablement votre problème. –

0

Pour exécuter un fichier .jar sans avoir à taper le chemin complet, vous pouvez le mettre dans votre classpath et l'exécuter en tapant:

java fullclassname arg1 arg2 

Mac OS X Developer Library recommends « fichiers jar supplémentaires qui doivent être placés sur le classpath du système doit être placé dans le dossier /Library/Java/Extensions. Vous pouvez également les placer dans votre propre dossier Library/Java/Extensions, mais vous devrez probablement créer les dossiers Java et Extensions.

Si vous ne connaissez pas le nom complet de la classe principale dans votre fichier .jar, vous pouvez le développer et consulter le fichier MANIFEST.MF dans le dossier META-INF. La ligne Main-Class: vous le dira.

Ainsi, par exemple, pour exécuter le saxon9he.jar mettre dans /Library/Java/Extensions et vous pouvez taper (à partir de quel que soit le dossier que vous voulez)

java net.sf.saxon.Transform arg1 arg2... 

Presque aussi court que taper java -jar jarfile.jar arg1 arg2, et vous n'avez pas besoin de changer toutes les variables d'environnement. En bref, si le fichier jar est dans votre classpath, utilisez le nom de classe et vous n'avez pas besoin du chemin d'accès.

0

Puisqu'il n'y a pas d'option de ligne de commande supplémentaire pour l'emplacement des jars ou qu'une variable d'environnement est prise en compte, je ne suis pas non plus au courant d'une solution facile mais je m'y intéresserais également.

Une autre approche pourrait être d'utiliser un script d'emballage zsh pour obtenir un tel comportement:

~/.scripts/java # .scripts à une position antérieure dans votre variable $ PATH que java se

#!/usr/bin/env zsh 
# get -jar option and remove from [email protected] (-D option) 
zparseopts -D jar:=jarname 
if [ -e $JAR_PATH/$jarname[2] ]; 
then 
    java -jar $JAR_PATH/$jarname[2] [email protected] 
elif [ -e $jarname[2] ]; 
then 
    java -jar $jarname[2] [email protected] 
else 
    java [email protected] 
fi 

Un avantage de zparseopts est qu'il peut supprimer l'option -jar, mais toutes les autres options sont conservées dans $ @.

Une amélioration supplémentaire consisterait à étendre bash-completion ou zsh-completion pour l'option de commande java -jar. Par exemple, bash-completion de java -jar restreint les listes de fichiers aux fichiers * .jar. Pour une utilisation pratique, quelqu'un pourrait étendre ceci en regardant non seulement le chemin actuel, mais en $ JAR_PATH. Comme point de départ, voir unix.sx question.

Mais cette solution ne semble pas trop bonne non plus.

Questions connexes