Вопрос-ответ

Classpath including JAR within a JAR

Путь к классу, включающий JAR внутри JAR

Возможно ли указать Java classpath, которая включает JAR-файл, содержащийся в другом JAR-файле?

Переведено автоматически
Ответ 1

Если вы пытаетесь создать единый jar, содержащий ваше приложение и необходимые для него библиотеки, есть два способа (о которых я знаю) сделать это. Первый - это One-Jar, который использует специальный загрузчик классов для обеспечения вложенности jar. Второй - это UberJar (или Shade), который расширяет включенные библиотеки и помещает все классы в jar верхнего уровня.

Я должен также упомянуть, что UberJar и Shade являются плагинами для Maven1 и Maven2 соответственно. Как упоминалось ниже, вы также можете использовать плагин assembly (который на самом деле намного мощнее, но его гораздо сложнее правильно настроить).

Ответ 2

Вы НЕ хотите использовать эти решения "разнесения содержимого JAR". Они определенно затрудняют просмотр содержимого (поскольку все разнесено на одном уровне). Кроме того, могут возникать конфликты именования (этого не должно происходить, если люди используют соответствующие пакеты, но вы не всегда можете это контролировать).

Функция, которая вам нужна, является одной из 25 лучших RFE Sun: RFE 4648386, которую Sun, в своей бесконечной мудрости, определила как имеющую низкий приоритет. Мы можем только надеяться, что Sun проснется...

Между тем, лучшее решение, с которым я столкнулся (которое я хотел бы, чтобы Sun скопировала в JDK), - это использовать пользовательский загрузчик классов JarClassLoader.

Ответ 3

После некоторых исследований я нашел метод, который не требует maven или какого-либо стороннего расширения / программы.

Вы можете использовать "Class-Path" в вашем файле манифеста.

Например:

Создайте файл манифеста MANIFEST.MF

Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass

Скомпилируйте все ваши классы и запустите jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar

c расшифровывается как создать архив f указывает, что вы хотите указать файл v предназначен для подробного ввода m означает, что мы передадим пользовательский файл манифеста

Убедитесь, что вы включили lib в пакет jar. Вы должны иметь возможность запускать jar обычным способом.

на основе: http://www.ibm.com/developerworks/library/j-5things6 /

всю другую необходимую информацию о пути к классу вы найдете здесь

Ответ 4

Используйте тег zipgroupfileset (использует те же атрибуты, что и тег fileset); он распакует все файлы в каталоге и добавит в ваш новый архивный файл. Дополнительная информация: http://ant.apache.org/manual/Tasks/zip.html

Это очень полезный способ обойти проблему jar-in-a-jar - я знаю, потому что я погуглил этот точный вопрос StackOverflow, пытаясь понять, что делать. Если вы хотите упаковать jar или папку с jar в свой собственный встроенный jar с помощью Ant, забудьте обо всех этих classpath или сторонних плагинах, все, что вам нужно сделать, это это (в Ant):

<jar destfile="your.jar" basedir="java/dir">
...
<zipgroupfileset dir="dir/of/jars" />
</jar>
java