включить внешнюю банку при запуске java -jar

Из моих чтений, когда вы выполняете следующую команду:

java -jar foo.jar

Тогда основной путь к классам игнорируется, а путь к классам берется из файла манифеста.

Кроме того, путь к классам, объявленный в командной строке, также игнорируется. Так в:

java -classpath /usr/local/jar/foobar.jar -jar foo.jar

/usr/local/jar/foobar.jar игнорируется.

Наконец, я прочитал, что файл манифеста может содержать только относительные пути внутри файла jar.

Итак, как включить абсолютные пути к внешним jar-файлам, которые присутствуют в системе, но не находятся в исполняемом jar-файле?


person rouble    schedule 26.05.2010    source источник
comment
Примечание. Заголовок Class-Path указывает на классы или файлы JAR в локальной сети, не файлы JAR в файле JAR или классы, доступные через Интернет-протоколы. Чтобы загрузить классы в файлах JAR внутри файла JAR в путь к классам, вы должны написать собственный код для загрузки этих классов. Например, если MyJar.jar содержит другой файл JAR с именем MyUtils.jar, вы не можете использовать заголовок Class-Path в манифесте MyJar.jar для загрузки классов из MyUtils.jar в путь к классам. Источник: docs.oracle.com/javase/tutorial/deployment/jar/ downman.html   -  person AlikElzin-kilaka    schedule 07.05.2015


Ответы (2)


Есть ли причина, по которой вы избегаете вызова основного класса, например

java -cp /usr/local/jar/foobar.jar:/some/other/path.jar com.your.main.classname

?

Этот тип вызова позволяет смешивать абсолютные пути с относительными путями. Поместите это в сценарий оболочки или пакетный файл, чтобы не вводить или запоминать полный путь к классам для упрощения.

person matt b    schedule 26.05.2010
comment
+1 за этот практический совет! Oracle / SUN действительно следует отказаться от опции -jar ... это повторяющийся кошмар ... - person Andreas Dolk; 26.05.2010
comment
Использование -jar может быть значительно проще в некоторых сценариях, но если вы обнаружите, что упрощенный вариант вызывает у вас проблемы, всегда имеет смысл вернуться к варианту, который дает вам полный контроль. - person matt b; 26.05.2010
comment
Я думаю, что в Windows должна быть точка с запятой вместо двоеточия между путями jar. Пожалуйста, проверьте эти ответы stackoverflow.com/a/219801/761755 stackoverflow.com/a/13018244/761755 - person GKalnytskyi; 22.02.2019

Вы можете создать папку, скажем lib, в папке, в которой находится файл jar.

Содержимое Manifest.MF может быть:

Main-Class: com.mastergaurav.test.app.MainClass
Class-Path: lib/one.jar lib/two.jar

Содержимое папки:

mainFolder/
   * lib/one.jar
   * lib/two.jar
   * my-main.jar

Выполнить:

java -jar my-main.jar
person Gaurav Vaish    schedule 26.05.2010
comment
Кстати, если вы выполните java -cp / addtional / class / path -jar abcd.jar, дополнительный путь к классам не будет проигнорирован. - person Gaurav Vaish; 26.05.2010
comment
Вы совершенно не представляете, как долго я это искал. Спасибо. - person Bogdan; 03.07.2011
comment
Как мне установить Class-Path в банку внутри банки, которую я хочу скомпилировать? - person Aaron Esau; 16.12.2016
comment
@Arin, насколько мне известно, это невозможно без написания собственного загрузчика классов. Даже в этом случае это кажется невозможным на основе полуторадневного всплеска. См. Комментарий AlikElzin-kilaka выше и bugs.java.com/bugdatabase/view_bug.do ? bug_id = 4648386. Конечно, вы можете изучить One-Jar. - person Shea; 18.07.2018