2009-06-01 20 views
11

Tengo un archivo .jar que me gustaría poder llamar sin tener que usar una ruta de archivo completa a su ubicación.¿Se puede llamar a un archivo .jar ejecutable sin tener que usar su ruta completa?

Por ejemplo, si el archivo .jar se encuentra en: /some/path/to/thearchive.jar

Me gustaría ser capaz de ejecutarlo con:

java -jar thearchive.jar 

vez de:

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

cuando estoy en otro lugar en el árbol del directorio. En mi caso específico, estoy ejecutando una Mac con OS X 10.5.7 instalado. Versión de Java "1.5.0_16". Intenté agregar "/ some/path/to" a PATH, JAVA_HOME y CLASSPATH, pero eso no funcionó.

Entonces, ¿cómo configuro para ejecutar un .jar desde la línea de comando sin tener que usar su ruta completa?

ACTUALIZACIÓN: Otro elemento a tratar serían los argumentos. Por ejemplo:

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

Esto puede tener un efecto en la forma en que se trata la pregunta como se menciona en las respuestas a continuación.

+0

Nota, el comando: java-jar thearchive.jar funciona bien si estoy en el directorio con el archivo .jar (En el ejemplo: "/ some/ruta/a") El objetivo es para que mi directorio de trabajo actual sea:/some/other/place/on/the/tree y siga usando: java -jar thearchive.jar sin tener que usar la ruta completa. (es decir, java -jar /some/path/to/thearchive.jar –

Respuesta

3

Usted puede agregar una variable para contener el directorio:

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

No estoy seguro de que puedes hacerlo desde las variables de entorno de manera implícita.

+2

@Brabster - buena idea - también podría establecer la variable de entorno en "/some/path/to/thearchive.jar" y "java -jar $ JAR" – jabbie

+0

Esto funciona un poco mejor que el alias cuando necesitas pasarle argumentos adicionales. Estoy usando una ruta completa al .jar seguido de @jabbie y llamando con "java -jar $ JAR" y pasando los argumentos Esto funciona como se esperaba. –

1

No lo creo. Si tiene el contenedor especificado en CLASSPATH, puede llamar a Java con la clase principal especificada. (Es decir java com.test.Main) Alternativamente, usted podría crear un alias en que shell para ejecutar el comando

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

O Otra alternativa es crear un guión envoltorio para ejecutarlo.

+0

Esta respuesta es útil, pero se encuentra con problemas para pasar argumentos adicionales. Siempre y cuando no necesite pasar argumentos adicionales (que no mencioné en mi pregunta inicial), esto debería –

+0

@stimulatingpixels Puede pasar argumentos adicionales a un comando con alias, o si necesita que se inserten en una ubicación arbitraria cree una función en su lugar. También se puede escribir un script de contenedor para pasar los argumentos adicionales. – jabbie

5

No, no puedes.

Ejecutar un jar con -jar no implica ningún tipo de mecanismo classpath ya que el archivo jar es classpath.

Como alternativa, use un alias de shell para iniciar el archivo jar o un archivo de script pequeño.

3

Según to Sun:

java -jar app.jar 

para ejecutar la aplicación desde el archivo JAR que se encuentra en otro directorio, tenemos que especificar la ruta de ese directorio de la siguiente manera: java -jar path/app.jar

donde ruta es la ruta de directorio en la que reside app.jar.

Así que ya sea por la vía de una variable de entorno "estándar" o definir una envoltura que sería en su PATH

+0

tal como se describe en la respuesta y @ @ de Brabster de Jabbie seguimiento, estoy exportando la ruta completa al archivo .jar como: THEJAR exportación =/some/ruta/a/thearchive.jar y ejecutarlo a través de: java-jar $ THEJAR Esto me permite enviar también argumentos como sea necesario, como: java-jar $ arg1 arg2 THEJAR Y todo está funcionando como se esperaba. –

0

El sistema de Java en sí no le da una forma de especificar algo como JAR_PATH (una lista de lugares para buscar archivos jar). Las otras respuestas dadas uso de las capacidades de concha MAC/Unix:

  1. Configuración de una variable de entorno
  2. Configuración de un alias
  3. Posiblemente utilizar un enlace simbólico (al archivo o al directorio).

Lo que puede ser útil es averiguar por qué es un problema especificar la ruta completa. Eso puede guiarnos en cuanto a cuál respuesta es mejor o posiblemente encontrar una solución completamente diferente a su problema.

+0

Es realmente solo una cuestión de conveniencia. Uno de los ejemplos específicos es el Validador XML Multi-Schema (MSV) de Sun que utilizo para validar archivos XML contra esquemas a través de la línea de comandos. Cuando estoy en una terminal en el directorio donde se encuentran los archivos .xml y .xsd, es mejor poder hacer algo como "java -jar $ MSV schema.xsd doc.xml" que "java -jar/path/a/the/real/msv.jar schema.xsd doc.xml ". –

+1

En ese caso, usar una variable de entorno o alias probablemente resolverá su problema. –

0

para ejecutar un archivo .jar sin escribir la ruta completa se puede poner en su ruta de clase y ejecutar el comando:

java fullclassname arg1 arg2 

Mac OS X Developer Library 'recommends archivos jar adicionales que deben ser colocados en el classpath del sistema se colocará en la carpeta /Library/Java/Extensions. También puede ponerlos en su propia carpeta Library/Java/Extensions, pero probablemente tendrá que crear las carpetas Java y Extensions.

Si no conoce el nombre completo de la clase principal en su archivo .jar, puede expandirlo y buscar en el archivo MANIFEST.MF en la carpeta META-INF. La línea Main-Class: le dirá.

Así, por ejemplo, para ejecutar el saxon9he.jar puso en /Library/Java/Extensions y que puede escribir (desde cualquier carpeta que desea)

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

Casi tan corto como escribir java -jar jarfile.jar arg1 arg2, y que no es necesario cambiar cualquier variable de entorno

En resumen, si el jar está en su classpath, use el nombre de clase y no necesita el nombre de ruta.

0

Dado que no existe una opción de línea de comando adicional para la ubicación de los archivos jar o se tiene en cuenta una variable de entorno, tampoco estoy al tanto de una solución fácil, pero estaría muy interesada en ella también.

Un enfoque diferente podría ser el uso de un guión envoltorio zsh para conseguir tal comportamiento:

~/.scripts/java # .scripts en una posición anterior en la variable PATH $ java que sí

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

Una ventaja de zparseopts es que puede quitar la opción -jar pero todas las otras opciones se conservan dentro de $ @.

Una mejora adicional sería ampliar bash-completion o zsh-completion para la opción de comando java -jar. Por ejemplo, bash-completion de java -jar restringe las listas de archivos a archivos * .jar. Para un uso conveniente, alguien podría extender esto no solo mirando en la ruta actual sino en $ JAR_PATH. Como punto de partida, ver siguiente unix.sx question.

Pero esta solución tampoco se ve muy bien.

Cuestiones relacionadas