Можно ли вызывать исполняемый файл .jar без использования его полного пути?

У меня есть .jar файл, который я хотел бы иметь возможность звонить без использования полного пути к его местоположению.

Например, если файл .jar находится по адресу:/some/path/to/thearchive.jar

Я хотел бы иметь возможность запускать его с помощью:

java -jar thearchive.jar

вместо:

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

когда я где-нибудь еще в дереве каталогов. В моем конкретном случае я запускаю Mac с установленной ОС X 10.5.7. Версия Java "1.5.0_16". Я попытался добавить "/some/path/to" в PATH, JAVA_HOME и CLASSPATH, но это не сработало.

Итак, как мне настроить запуск .jar из командной строки, не используя полный путь?

ОБНОВЛЕНИЕ: Еще один элемент, с которым нужно иметь дело, - это аргументы. Например:

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

Это может повлиять на то, как вопрос рассматривается, как указано в ответах ниже.

Ответ 1

Вы можете добавить переменную для хранения каталога:

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

Я не уверен, что вы можете сделать это из переменных среды неявно.

Ответ 2

Нет, вы не можете.

Запуск jar с -jar не связан с каким-либо механизмом classpath, поскольку файл jar - это путь к классам.

В качестве альтернативы используйте псевдоним оболочки, чтобы запустить банку или небольшой файл script.

Ответ 3

В соответствии с для Sun:

java -jar app.jar

Чтобы запустить приложение из jar файла, находящегося в другом каталоге, нам нужно указать путь к этому каталогу, как показано ниже: java -jar path/app.jar

где path - путь к каталогу, в котором находится этот файл app.jar.

Итак, либо выйдите из пути в "стандартную" переменную среды, либо определите оболочку, которая будет в вашем PATH

Ответ 4

Я так не верю. Если у вас есть банка, указанная в вашем CLASSPATH, вы можете просто вызвать java с указанным основным классом. (например, java com.test.Main) В качестве альтернативы вы можете создать псевдоним в своей оболочке для выполнения команды

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

Или другая альтернатива - создать оболочку script для ее выполнения.

Ответ 5

Сама система Java не дает вам способ указать что-то вроде JAR_PATH (список мест для поиска файлов jar). В других полученных ответах используются возможности оболочки MAC/Unix:

  • Настройка переменной среды
  • Установка псевдонима
  • Возможно использование символической ссылки (в файл или в каталог).

Что может быть полезно, чтобы выяснить, почему задание всего пути является проблемой. Это может привести нас к тому, какой ответ лучше всего или, возможно, найти совершенно другое решение вашей проблемы.

Ответ 6

Чтобы запустить файл .jar без ввода полного пути, вы можете поместить его в свой путь к классам и запустить его, набрав:

java fullclassname arg1 arg2

Библиотека разработчиков Mac OSX рекомендует 'дополнительные файлы jar, которые должны быть помещены в путь к системе, помещены в папку /Library/Java/Extensions. Вы также можете поместить их в свою собственную папку Library/Java/Extensions, но вам, вероятно, придется создавать папки Java и Extensions.

Если вы не знаете полного имени основного класса в вашем .jar файле, вы можете его развернуть и посмотреть в файле MANIFEST.MF в папке META-INF. Строка Main-Class: сообщит вам.

Так, например, чтобы запустить saxon9he.jar, поместите его в /Library/Java/Extensions и вы можете ввести (из любой папки, которую вы хотите)

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

Скорее всего, как набрав java -jar jarfile.jar arg1 arg2, и вам не нужно изменять какие-либо переменные среды.

Короче говоря, если jar находится в вашем пути к классам, используйте имя класса и вам не нужен путь.

Ответ 7

Так как нет дополнительной опции командной строки для определения местоположения банок или переменной среды, я также не знаю о простом решении, но также очень заинтересован в этом.

Другим подходом может быть использование обертки zsh script для получения такого поведения:

~/.scripts/java #.scripts в предыдущей позиции в переменной $PATH, чем сама java

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

Преимущество zparseopts заключается в том, что он может отключить параметр -jar, но все остальные параметры сохраняются в пределах [email protected]

Дальнейшим усовершенствованием будет расширение bash-completion или zsh-completion для опции java-команды. Например, bash -completion java -jar ограничивает списки файлов файлами *.jar. Для удобства использования кто-то может расширить это, не только глядя на текущий путь, но и на $JAR_PATH. В качестве отправной точки см. Следующий вопрос unix.sx.

Но это решение тоже выглядит не очень хорошо.