как я могу вызвать класс java, который находится внутри jar, из скрипта оболочки, который находится внутри другого jar

#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