Добавление классов в путь к классам файла JAR
Есть два jar файла один app.jar был создан как основной, в нём лежит класс, который ссылается на класс из другой библиотеки lib.jar. С помощью этой команды все исполняется. Но при условии, что Class-Path: path/lib.jar указан
java -jar app.jar
Вопрос есть ли возможность запустить это всё по типу
java -cp path/lib.jar:app.jar
Без указания Class-Path:
Ответы (2 шт):
Вы можете добавлять недостающие классы в путь классов при использовании опции -classpath
или -cp
, но это делает запуск приложения сложным. И если зависимости не прописаны где-то в META-INF
, то определить какие библиотеки добавлять на путь классов будет трудно.
Каким образом запускать приложение вы можете взять из документации. Опция -jar
задумана так, чтобы можно было запускать выполняемые jar файлы, которые не требуют аргументов. Поэтому опции могут быть несовместимы.
Как запускать jar файлы вы можете также прочитав этот ответ.
А в этом ответе я вообще предлагал недостающие библиотеки помещать в META-INF/lib
. Какой способ вам больше подходит, такой и используйте.
Ниже представлен рабочий пример bat-файла для запуска метода main
класса com.acme.jna.App
в jar-файле jna-wrapper-0.0.1-SNAPSHOT.jar
, где дополнительно указываются зависимости: jna-5.14.0.jar
и commons-cli-1.6.0.jar
, API которых использует приложение в com.acme.jna.App
классе. Здесь также подразумевается, что рядом с bat-файлом находится поддиректория jdk-11.0.21+9 и JNA библиотеки в папке dll.
:: Full path to the bin directory of the 32-bit version of Java
:: set javabin="C:\Program Files (x86)\Eclipse Adoptium\jdk-11.0.22.7-hotspot\bin"
:: or if java-hotspot is in the script directory
:: set javabin=%~dp0\jdk-11.0.21+9\bin
set javabin=%~dp0\jdk-11.0.21+9\bin
:: Full path to the directory containing native libraries for JNA
:: set jnalibpath="C:/path/to/jna/libraries/"
:: or if you have dll subdirectory
:: set jnalibpath=%~dp0\dll\
set jnalibpath=%~dp0\dll\
cd %javabin%
java ^
-Djna.debug_load=true ^
-Djna.debug_load.jna=true ^
-Djna.library.path=%jnalibpath% ^
-Dfile.encoding=UTF-8 ^
-Dstdout.encoding=UTF-8 ^
-Dstderr.encoding=UTF-8 ^
-classpath ^
%~dp0commons-cli-1.6.0.jar;^
%~dp0jna-5.14.0.jar;^
%~dp0jna-wrapper-0.0.1-SNAPSHOT.jar ^
com.acme.jna.App ^
-host 192.168.178.4
Здесь мы вызываем java и устанавливаем classpath
. Помимо этого передётся аргумент host
, который будет доступен в массиве args
метода main
класса com.acme.jna.App
.
Не знаю, имеет ли в этом случае значение то, что в pom.xml Maven-проекта jna-wrapper
указывается главный класс, но на всякий случай...
<build>
<pluginManagement>
<plugins>
<!-- https://central.sonatype.com/artifact/org.apache.maven.plugins/maven-jar-plugin -->
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifestEntries>
<Specification-Title>${project.name}</Specification-Title>
<Specification-Version>${project.version}</Specification-Version>
<Specification-Vendor>${project.organization.name}</Specification-Vendor>
</manifestEntries>
<manifest>
<mainClass>com.acme.jna.App</mainClass>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>