Добавление классов в путь к классам файла 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 шт):

Автор решения: Roman C

Вы можете добавлять недостающие классы в путь классов при использовании опции -classpath или -cp, но это делает запуск приложения сложным. И если зависимости не прописаны где-то в META-INF, то определить какие библиотеки добавлять на путь классов будет трудно.

Каким образом запускать приложение вы можете взять из документации. Опция -jar задумана так, чтобы можно было запускать выполняемые jar файлы, которые не требуют аргументов. Поэтому опции могут быть несовместимы.

Как запускать jar файлы вы можете также прочитав этот ответ.

А в этом ответе я вообще предлагал недостающие библиотеки помещать в META-INF/lib. Какой способ вам больше подходит, такой и используйте.

→ Ссылка
Автор решения: XelaNimed

Ниже представлен рабочий пример 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>
→ Ссылка