Как получить jar файл из jar
Обычно удобно объединять множество файлов классов Java в один архивный файл.
В этом уроке мы рассмотрим все тонкости работы с jar – или J ava AR chive – файлами на Java.
В частности, мы возьмем простое приложение и рассмотрим различные способы его упаковки и запуска в виде jar. Мы также ответим на некоторые любопытные вопросы, такие как как легко прочитать файл манифеста jar по пути.
2. Настройка программы Java
Прежде чем мы сможем создать запускаемый jar-файл, наше приложение должно иметь класс с основным методом . Этот класс обеспечивает нашу точку входа в приложение:
3. Команда Jar
Теперь, когда мы все настроили, давайте скомпилируем наш код и создадим наш jar-файл.
Мы можем сделать это с помощью javac из командной строки:
Команда javac создает JarExample.class в каталоге com/baeldung/jar . Теперь мы можем упаковать это в файл jar.
3.1. Использование параметров по умолчанию
Чтобы создать файл jar, мы будем использовать кувшин команда.
Чтобы использовать команду jar для создания файла jar, нам нужно использовать опцию c , чтобы указать, что мы создаем файл, и опцию f , чтобы указать файл:
3.2. Установка основного класса
Полезно, чтобы манифест файла jar включал основной класс.
Манифест-это специальный файл в банке, расположенный в каталоге META-INF и названный MANIFEST.MF . Файл манифеста содержит специальную метаинформацию о файлах в файле jar.
Некоторые примеры того, для чего мы можем использовать файл манифеста, включают установку точки входа, установку информации о версии и настройку пути к классу.
Используя опцию e , мы можем указать нашу точку входа, и команда jar добавит ее в сгенерированный файл манифеста.
Давайте запустим jar с указанной точкой входа:
3.3. Обновление содержания
Допустим, мы внесли изменения в один из наших классов и перекомпилировали его. Теперь нам нужно обновить наш jar-файл.
Давайте используем команду jar с параметром u для обновления ее содержимого:
3.4. Настройка файла манифеста
В некоторых случаях нам может потребоваться больше контроля над тем, что входит в наш файл манифеста. Команда jar предоставляет функциональные возможности для предоставления нашей собственной информации о манифесте.
Давайте добавим частичный файл манифеста с именем example_manifest.txt чтобы ваше приложение установило нашу точку входа:
Информация о манифесте, которую мы предоставляем, будет добавлена к тому, что генерирует команда jar, так что это единственная строка, которая нам нужна в файле.
Важно, чтобы мы заканчивали наш файл манифеста символом |/newline . Без новой строки наш файл манифеста будет молча проигнорирован.
С этой настройкой давайте снова создадим нашу банку, используя нашу информацию о манифесте и опцию m :
3.5. Подробный Вывод
Если нам нужна дополнительная информация из команды jar , мы можем просто добавить опцию v для verbose.
Давайте запустим нашу команду jar с параметром v :
4. Использование Maven
4.1. Конфигурация по Умолчанию
Мы также можем использовать Maven для создания нашей банки. Поскольку Maven предпочитает условность конфигурации, мы можем просто запустить пакет для создания нашего jar-файла.
По умолчанию наш jar-файл будет добавлен в папку target в нашем проекте.
4.2. Указание основного класса
Мы также можем настроить Maven для указания основного класса и создания исполняемого jar-файла .
5. Использование Пружинного Ботинка
5.1. Использование Maven и Defaults
Если мы используем Spring Boot с Maven, мы должны сначала подтвердить, что наш параметр упаковки установлен в jar , а не war в нашем pom.xml файл.
Как только мы узнаем, что это настроено, мы можем запустить пакет цель:
5.2. Установка точки входа
Установка нашего основного класса-это то, где мы находим различия между созданием jar с обычным Java-приложением и fat jar для приложения Spring Boot . В приложении Spring Boot основной класс на самом деле является org.springframework.boot.loader.Ярлаунчер .
Хотя наш пример не является приложением Spring Boot, мы могли бы легко настроить его как консольное приложение Spring Boot .
Наш основной класс должен быть указан как начальный класс:
Мы также можем использовать Gradle для создания Spring Boot fat jar .
6. Запуск банки
6.1. Вывод основного класса
Поскольку мы пошли дальше и убедились, что наш основной класс указан в манифесте, мы можем использовать опцию -jar команды java для запуска нашего приложения без указания основного класса:
6.2. Указание основного класса
Мы также можем указать основной класс, когда мы запускаем наше приложение. Мы можем использовать опцию -cp , чтобы убедиться, что наш jar-файл находится в пути к классу, а затем предоставить ваш основной класс в формате package.className :
Использование разделителей путей вместо формата пакета также работает:
6.3. Перечисление содержимого банки
Мы можем использовать команду jar для перечисления содержимого нашего файла jar:
6.4. Просмотр файла манифеста
Поскольку может быть важно знать, что находится в нашем файле MANIFEST.MF , давайте рассмотрим быстрый и простой способ заглянуть в содержимое, не выходя из командной строки.
Давайте воспользуемся командой unzip с параметром-p:
7. Заключение
В этом уроке мы настроим простое Java-приложение с классом main .
Затем мы рассмотрели три способа создания jar-файлов: с помощью команды jar , с помощью Maven и с помощью приложения Maven Spring Boot.
После того, как мы создали наши jar-файлы, мы вернулись в командную строку и запустили их с выведенным и заданным основным классом.
Мы также узнали, как отображать содержимое файла и как отображать содержимое одного файла в банке.
Необходимость включать в jar файл другие jar файлы возникает практически всегда, когда вы используете библиотечные классы.
В таких случаях, а это 99% от всех случаев, используем заголовок Class-Path:
здесь я указал путь к архиву SBPJavaAcc.jar и к архиву firebirdsql-full.jar, оба архива находятся в папке Lib. Разделитель между архивами – пробел. И что же делать с этим Class-Path? Его надо добавить в манифест.
Рассмотрим пример. В качестве библиотечного jar архива задействуем JarFile.jar – это jar файл из предыдущего раздела. И научимся делать jar файлы в среде Eclipse.
Ещё Jar пример
Создадим новый проект JarInJar, а в нём пакет myJar:
Создадим в пакете myJar класс MainJar (установите флаг public static void main(String[] args)) и изменим созданный мастером код так:
В папке Hilfe сделаем папку Lib, затем, внимание, в проводнике скопируйте файл JarFile.jar из предыдущего проекта и поместите эту копию в нашу папку Lib. Сделать это можно либо прямо в проводнике, либо правой кнопкой по папке Lib -> Paste. Получаем:
Делаем обработчик нажатия на кнопку “Jar пример” (предварительно введите новое поле JarClass jc и укажите импорт import myPack.JarClass). Окончательно получаем:
Итак, что мы имеем? Мы создали класс MainJar, который использует класс JarClass из архивного файла. Это то, что нам нужно. Мы будем делать архив проекта JarInJar, а этот проект использует другой архив: JarFile.jar. Здесь не обойтись без работы с манифестом.
Манифест для jar архива
Правой кнопкой по корневой папке проекта New -> File, назовите файл sbp-program.txt.
В файл sbp-program.txt вводим текст: Manifest-Version: 1.0
Created-By: SBP-Program
Main-Class: myJar.MainJar
Class-Path: Lib/JARFile.jar
X-COMMENT: Lib folder content was added manually
и переведите курсор на новую строку, это важно. Получаем:
Обратите внимание, на картинке курсор в начале новой строки.
Сохраните проект. Запустите проект на выполнение и убедитесь, что всё работает.
Я хочу прочитать XML файл, который находится внутри одного из jar , включенных в мой путь к классу. Как я могу прочитать любой файл, который включен в jar ?
Если вы хотите прочитать этот файл из вашего приложения, используйте:
Путь начинается с "/", но это не путь в вашей файловой системе, а в вашем пути к классам. Поэтому, если ваш файл находится в пути к классам "org.xml" и называется myxml.xml, ваш путь выглядит как "/org/xml/myxml.xml".
InputStream считывает содержимое вашего файла. Вы можете поместить его в Reader, если хотите.
Я надеюсь, что это поможет.
А, это один из моих любимых предметов. Существует два способа загрузки ресурса через путь к классам:
(есть другие способы, которые включают получение URL-адреса ресурса аналогичным образом, а затем открытие связи с ним, но это два прямых способа).
Первый метод на самом деле делегирует второй, после изменения имени ресурса. Существует, по существу, два типа имен ресурсов: абсолютный (например, "/path/to/resource/resource" ) и относительный (например, "ресурс" ). Абсолютные пути начинаются с "/".
Вот пример, который должен проиллюстрировать. Рассмотрим класс com.example.A. Рассмотрим два ресурса, один из которых находится в /com/example/nested, другой в /top, в пути к классам. Следующая программа показывает девять возможных способов доступа к двум ресурсам:
В основном все делает то, что вы ожидаете. Случай-3 терпит неудачу, поскольку относительное разрешение класса относится к классу, поэтому "top" означает "/com/example/top", но "/top" означает, что он говорит.
Случай-5 выходит из строя, потому что относительное разрешение класса loader относится к загрузчику классов. Но неожиданно Case-6 также терпит неудачу: можно было бы ожидать, что "/com/example/nested" будет корректно разрешаться. Чтобы получить доступ к вложенному ресурсу через загрузчик классов, вам необходимо использовать Case-7, то есть вложенный путь относится к корню загрузчика классов. Аналогично, случай-9 выходит из строя, но Case-8 проходит.
Помните: для java.lang.Class getResourceAsStream() делегирует загрузчик классов:
так важно поведение параметра resolveName().
Наконец, поскольку поведение загрузчика классов загружает класс, который по существу управляет getResourceAsStream(), а загрузчик классов часто является пользовательским загрузчиком, тогда правила загрузки ресурсов могут быть еще более сложными. например для веб-приложений, загрузки с WEB-INF/classes или WEB-INF/lib в контексте веб-приложения, но не из других изолированных веб-приложений. Кроме того, корректные классные загрузчики делегируют родителям, так что дублированные ресурсы в пути к классам могут быть недоступны с помощью этого механизма.
Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null .
Проблема в том, что у меня был этот проект в моем профиле Windows . у которого был «!» в нем . (DeNitE! -> было именем моего профиля Windows)
Как только я сменил его на DeNitE (без!), он отлично работал .
У меня такая же проблема .. Вы можете использовать это.
Здесь WE4 - это имя моего класса. Надеюсь, это поможет.
Два простых шага:
1 - добавьте папку в «Путь сборки»;
2 - Используйте это:
Другая работа вокруг - если вы поместите свой файл ресурсов, ваш .jar-файл в том же месте, он должен работать. Единственный недостаток - вы должны всегда иметь ресурсы с файлом jar.
Если это не проблема, вы можете сделать это таким образом.
Нет, это неверно. Просто протестировал это 5 минут назад. – Tastybrownies 12 November 2016 в 21:18Прекрасно работает для меня. Проверьте, что у вас может быть другое.
Пример 1: (ресурсы в src)
FYI, та же настройка работает в eclipse просто отлично и
Пример 2: (ресурсы not в src - но в проекте)
- Файл Структура (ресурсы уведомлений выглядят как обычная папка) [/g9]
- Что нам нужно сделать, это поместить ресурсы на путь сборки. То, что это делает, помещает все в папку (за исключением самой папки) на пути к классу. Щелкните правой кнопкой мыши по проекту и перейдите к [Путь сборки] & rarr; [Настройка пути сборки] [/g10] На вкладке [Источники] в диалоговом окне выберите [Добавить папку] и в новом диалоговом окне выберите папку [resources] [/g11]. Теперь содержимое папка ресурсов находится в пути сборки (обратите внимание на небольшой пакет в папке сейчас [/g12]
- Новый код больше не использует префикс ресурсов для пути
- То же, что и в шагах 3 и 4 сверху, и прибыль!
Настройка конфигурации запуска
Как правило, один раз вы запускаете класс (т. е. щелкните правой кнопкой мыши на классе и запустите в качестве приложения Java), будет настроена конфигурация запуска. Вам нужно будет установить ее как точку запуска в манифесте. Но вот как это сделать вручную.
- [Right Click Project] & rarr; [Свойства] & rarr; [Параметры запуска / отладки] [/g13] Вы можете видеть, что у меня уже есть прогон configruation (который неявно задан из простого запуска класса). Но чтобы создать новый, выберите [New] & rarr; [Java Applica ]
- Создайте имя для запуска конфигурации и просмотра или введите основной класс запуска. В моем случае его класс com.stackoverflow.test.Main [/g14]
- Теперь, когда вы экспортируете, как показано в приведенном выше примере, вы выбираете конфигурацию запуска [/g15]
- Запустите банку, как показано выше.
Результат проверки
[/g16]
Файл с расширением .JAR представляет собой файл Java Archive, используемый для хранения Java программ и игр в одном файле. Некоторые содержат файлы, которые заставляют их работать как отдельные приложения, а другие содержат библиотеки программ для использования другими программами.
JAR-файлы сжаты в ZIP и часто хранят такие вещи, как файлы CLASS, файлы манифеста и ресурсы приложения, такие как изображения, звуковые клипы и сертификаты безопасности. Так как они могут хранить сотни или даже тысячи файлов в сжатом формате, файлами JAR легко обмениваться и перемещать.
Мобильные устройства с поддержкой Java могут использовать файлы JAR в качестве файлов игры, а некоторые веб-браузеры содержат темы и надстройки в формате JAR.
Как открыть файлы JAR
Java Runtime Environment (JRE) должен быть установлен для того, чтобы открыть исполняемый JAR-файл, но обратите внимание, что не все JAR-файлы имеют формат исполняемого файла. После установки вы можете просто дважды щелкнуть файл JAR, чтобы открыть его.
Некоторые мобильные устройства имеют встроенную JRE. После установки приложения Java также можно открывать в веб-браузере, например Firefox, Safari, Edge или Internet Explorer (но не в Chrome).
Поскольку JAR-файлы сжимаются с помощью ZIP, любой распаковщик файлов может открыть его, чтобы отобразить содержимое, которое находится внутри. Это включает в себя такие программы, как 7-Zip, PeaZip и jZip.
Другой способ открыть файлы JAR – использовать следующую команду в командной строке, заменив yourfile.jar именем вашего собственного файла JAR:
java -jar yourfile.jar
Ошибки открытия файлов JAR
Из-за настроек безопасности в операционной системе Windows и в некоторых веб-браузерах весьма часто можно увидеть ошибки при попытке доступа к приложениям Java.
Если вы не можете открыть апплеты Java даже после установки JRE, сначала убедитесь, что Java включена в вашем браузере и что панель управления правильно настроена для использования Java. Затем полностью перезапустите браузер, закрыв все открытые окна, а затем снова откройте программу.
Также убедитесь, что вы используете последнюю версию Java. Если нет, вернитесь к ссылке JRE выше и установите последнюю версию.
Как конвертировать файл JAR
Преобразование приложения Java для использования на платформе Android потребует преобразования файла JAR в APK. Одним из вариантов может быть запуск файла JAR в эмуляторе Android, чтобы программа автоматически создала файл APK. Однако, самый простой способ получить Java-программу на Android – просто скомпилировать APK из исходного исходного кода.
Файлы WAR также являются файлами Java Web Archive, но вы не можете преобразовать файл JAR напрямую в файл WAR, поскольку формат WAR имеет особую структуру, которой нет в JAR. Вместо этого вы можете создать WAR-файл и затем добавить JAR-файл в каталог lib, чтобы классы в JAR-файле были доступны для использования. WizToWar может помочь вам сделать это.
Создать ZIP-файл из JAR-файла так же просто, как переименовать расширение файла из .JAR в .ZIP. Это, на самом деле, не выполняет преобразование файлов, но позволяет программам, использующим ZIP-файлы, таким как 7-Zip или PeaZip, легче открывать файл JAR.
Дополнительная информация о формате JAR
Если вам нужна помощь в упаковке программ в файлы JAR, перейдите по этой ссылке для получения инструкций на веб-сайте Oracle.
Только один файл манифеста может быть включен в архив JAR, и он должен находиться в расположении META-INF/MANIFEST.MF. Он должен следовать синтаксису имени и значения, разделенных двоеточием, как Manifest-Version:1.0. Этот файл MF может указывать классы, которые должно загружать приложение.
Разработчики Java могут подписывать свои приложения цифровой подписью, но это не подписывает сам файл JAR. Вместо этого файлы внутри архива перечислены с их подписанными контрольными суммами.
Читайте также: