1. Обзор
Обычно удобно объединять множество файлов классов Java в один архивный файл.
В этом руководстве мы рассмотрим все тонкости работы с файлами jar — или J
ava AR
chive — в Java.
В частности, мы возьмем простое приложение и рассмотрим различные способы его упаковки и запуска в виде jar-файла. Мы также ответим на некоторые любопытные вопросы, например , как легко прочитать файл манифеста jar .
2. Настройка Java-программы
Прежде чем мы сможем создать исполняемый jar-файл, наше приложение должно иметь класс с основным
методом . Этот класс обеспечивает нашу точку входа в приложение:
public static void main(String[] args) {
System.out.println("Hello ForEach Reader!");
}
3. Команда банки
Теперь, когда мы все настроили, давайте скомпилируем наш код и создадим файл jar.
Мы можем сделать это с помощью javac
из командной строки:
javac com/foreach/jar/*.java
Команда javac
создает JarExample.class
в каталоге com/foreach/jar
. Теперь мы можем упаковать это в файл jar.
3.1. Использование значений по умолчанию
Чтобы создать файл jar, мы будем использовать команду jar
.
Чтобы использовать команду jar
для создания файла jar, нам нужно использовать параметр c
, чтобы указать, что мы создаем файл, и параметр f
, чтобы указать файл:
jar cf JarExample.jar com/foreach/jar/*.class
3.2. Установка основного класса
В манифест файла jar полезно включить основной класс.
Манифест — это специальный файл в банке, расположенный в каталоге META-INF
и названный MANIFEST.MF
. Файл манифеста содержит специальную метаинформацию о файлах в файле jar.
Некоторые примеры того, для чего мы можем использовать файл манифеста, включают настройку точки входа, настройку информации о версии и настройку пути к классам.
Используя параметр e
, мы можем указать нашу точку входа, и команда jar
добавит ее в сгенерированный файл манифеста.
Запустим jar
с указанной точкой входа:
jar cfe JarExample.jar com.foreach.jar.JarExample com/foreach/jar/*.class
3.3. Обновление содержимого
Допустим, мы внесли изменения в один из наших классов и перекомпилировали его. Теперь нам нужно обновить наш jar-файл.
Давайте используем команду jar
с параметром u
для обновления его содержимого:
jar uf JarExample.jar com/foreach/jar/JarExample.class
3.4. Настройка файла манифеста
В некоторых случаях нам может потребоваться больше контроля над тем, что находится в нашем файле манифеста. Команда jar
предоставляет функциональные возможности для предоставления нашей собственной информации манифеста.
Давайте добавим в наше приложение частичный файл манифеста с именем example_manifest.txt
, чтобы задать точку входа:
Main-Class: com.foreach.jar.JarExample
Информация манифеста, которую мы предоставляем, будет добавлена к тому, что генерирует команда jar, поэтому это единственная строка, которая нам нужна в файле.
Важно, чтобы мы заканчивали наш файл манифеста символом новой строки . Без новой строки наш файл манифеста будет молча игнорироваться.
С этой настройкой давайте снова создадим нашу банку, используя информацию из манифеста и параметр m
:
jar cfm JarExample.jar com/foreach/jar/example_manifest.txt com/foreach/jar/*.class
3.5. Подробный вывод
Если нам нужна дополнительная информация из команды jar
, мы можем просто добавить параметр v
для подробного описания.
Давайте запустим нашу команду jar с параметром
v
:
jar cvfm JarExample.jar com/foreach/jar/example_manifest.txt com/foreach/jar/*.class
added manifest
adding: com/foreach/jar/JarExample.class(in = 453) (out= 312)(deflated 31%)
4. Использование Maven
4.1. Конфигурация по умолчанию
Мы также можем использовать Maven для создания нашей банки. Поскольку Maven отдает предпочтение соглашению, а не конфигурации, мы можем просто запустить пакет, чтобы создать наш файл jar.
mvn package
По умолчанию наш файл jar будет добавлен в целевую
папку нашего проекта.
4.2. Указание основного класса
Мы также можем настроить Maven для указания основного класса и создания исполняемого файла jar .
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
<archive>
<manifest>
<mainClass>com.foreach.jar.JarExample</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
5. Использование Spring Boot
5.1. Использование Maven и значений по умолчанию
Если мы используем Spring Boot с Maven, мы должны сначала подтвердить, что для нашего параметра упаковки установлено значение jar
, а не war
в нашем файле pom.xml
.
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-boot</artifactId>
<packaging>jar</packaging>
<name>spring-boot</name>
Как только мы узнаем, что это настроено, мы можем запустить цель пакета :
mvn package
5.2. Настройка точки входа
Настройка нашего основного класса — это то место, где мы находим различия между созданием jar с обычным приложением Java и толстым jar для приложения Spring Boot . В приложении Spring Boot основным классом на самом деле является org.springframework.boot.loader.JarLauncher
.
Хотя наш пример не является приложением Spring Boot, мы могли бы легко настроить его как консольное приложение Spring Boot .
Наш основной класс должен быть указан как начальный класс:
<properties>
<start-class>com.foreach.jar.JarExample</start-class>
<!-- Other properties -->
</properties>
Мы также можем использовать Gradle для создания толстой банки Spring Boot .
6. Запуск банки
Теперь, когда у нас есть файл jar, мы можем запустить его. Мы запускаем файлы jar с помощью команды java
.
6.1. Вывод основного класса
Поскольку мы пошли дальше и убедились, что наш основной класс указан в манифесте, мы можем использовать параметр -jar
команды java
для запуска нашего приложения без указания основного класса:
java -jar JarExample.jar
6.2. Указание основного класса
Мы также можем указать основной класс при запуске нашего приложения. Мы можем использовать параметр -cp
, чтобы убедиться, что наш файл jar находится в пути к классам, а затем предоставить наш основной класс в формате package.className :
java -cp JarExample.jar com.foreach.jar.JarExample
Использование разделителей пути вместо формата пакета также работает:
java -cp JarExample.jar com/foreach/jar/JarExample
6.3. Список содержимого банки
Мы можем использовать команду jar
для вывода списка содержимого нашего файла jar:
jar tf JarExample.jar
META-INF/
META-INF/MANIFEST.MF
com/foreach/jar/JarExample.class
6.4. Просмотр файла манифеста
Поскольку может быть важно знать, что находится в нашем файле MANIFEST.MF
, давайте рассмотрим быстрый и простой способ просмотра содержимого, не выходя из командной строки.
Давайте воспользуемся командой unzip
с параметром -p:
unzip -p JarExample.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_31 (Oracle Corporation)
Main-Class: com.foreach.jar.JarExample
7. Заключение
В этом руководстве мы создадим простое Java-приложение с основным
классом.
Затем мы рассмотрели три способа создания jar-файлов: с помощью команды jar
, с помощью Maven и с помощью приложения Maven Spring Boot.
После того, как мы создали наши jar-файлы, мы вернулись к командной строке и запустили их с предполагаемым и указанным основным классом.
Мы также узнали, как отображать содержимое файла и как отображать содержимое одного файла в банке.
И простой пример Java , и пример Spring Boot доступны на GitHub.