#java #class #shell #jar
#java #класс #оболочка #jar
Вопрос:
У меня есть веб-приложение, а внутри jar у меня есть сценарий оболочки. Из этого сценария оболочки я хочу выполнить класс java, который находится внутри другого файла jar. На самом деле я могу выполнить в командной строке класс, подобный этому
/usr/bin/java -jar -файл bar.foo.a.jar bar.foo.my.class
но проблема заключается в том, когда задача выполняет скрипт изнутри jar. Затем в bar.foo.a.jar не расположен, потому что находится не на том же уровне
я пытался с
/usr/bin/java -jar ../../bar.foo.a.jar bar.foo.my.class
но у меня не работает, есть какие-либо предложения о том, как я мог бы этого добиться? есть ли лучший способ сделать что-то подобное?
Комментарии:
1. Jar — это просто zip-файл. Распакуйте или извлеките скрипт оболочки, а затем запустите команду java.
2. Не уверен, почему ваше решение с относительными путями не работает (вы не сказали, что происходит, когда вы это делаете). Попробуйте добавить cd (chdir) к вашему скрипту.
Ответ №1:
Из вашего вопроса неясно, что вы на самом деле пробовали, но вот пара указателей.
-
Вы не можете выполнить скрипт оболочки, который находится внутри файла JAR. Вы должны извлечь его в отдельный файл в файловой системе, прежде чем сможете его выполнить.
-
Вы не можете использовать файл JAR, который вложен внутри другого файла JAR. (Или, по крайней мере, вы не можете без создания пользовательского ClassLoader.) Вложенный файл JAR необходимо извлечь как отдельный файл.
-
Если ваша проблема связана с относительными путями, вам нужно обратить пристальное внимание на то, что такое «текущий каталог» в момент разрешения пути. В качестве эксперимента попробуйте заменить относительный путь на абсолютный путь к файлу JAR.
-
-jar
Опция не предназначена для работы таким образом. Предполагая, что файл JAR действительно существует в том относительном расположении, которое вы используете, вам, вероятно, нужно сделать это:/usr/bin/java -cp ../../bar.foo.a.jar bar.foo.MyClass
-jar
Опция сообщает JVM выполнить файл JAR в виде команды, используя Main-Class, объявленный в манифесте файла JAR, в качестве точки входа. Если вы сделаете это:/usr/bin/java -jar ../../bar.foo.a.jar bar.foo.MyClass
вы обнаружите, что
bar.foo.MyClass
передается объявленной основной программе в качестве ее первого аргумента командной строки.
Я бы посоветовал потратить несколько минут на то, чтобы внимательно прочитать страницы руководства по java
команде, the jar
command и связанные страницы, которые описывают, как работает путь к классу и т.д.
Ответ №2:
-jar
опция — это удобный способ выполнить класс внутри файла jar, то есть имеющий исполняемый файл jar. Но использование файла -jar будет игнорировать пути к пользовательским классам.
Возможно, вам было бы проще определить правильную переменную classpath и выполнить вашу команду с
/usr/bin/java -cp $CLASSPATH bar.foo.my.class