«1. Обзор

Обычно удобно объединять множество файлов классов Java в один архивный файл.

В этом уроке мы рассмотрим все тонкости работы с файлами jar — или Java ARchive — в Java.

В частности, мы возьмем простое приложение и рассмотрим различные способы его упаковки и запуска в виде jar-файла. Мы также ответим на некоторые любопытные вопросы, например, как легко прочитать файл манифеста jar.

2. Настройка Java-программы

Прежде чем мы сможем создать исполняемый jar-файл, наше приложение должно иметь класс с основным методом. Этот класс обеспечивает нашу точку входа в приложение:

public static void main(String[] args) {
    System.out.println("Hello Baeldung Reader!");
}

3. Команда Jar

Теперь, когда мы все настроили, давайте скомпилируем наш код и создадим файл jar.

Мы можем сделать это с помощью javac из командной строки:

javac com/baeldung/jar/*.java

Команда javac создает JarExample.class в каталоге com/baeldung/jar. Теперь мы можем упаковать это в файл jar.

3.1. Использование настроек по умолчанию

Чтобы создать файл jar, мы воспользуемся командой jar.

Чтобы использовать команду jar для создания файла jar, нам нужно использовать параметр c, чтобы указать, что мы создаем файл, и параметр f, чтобы указать файл:

jar cf JarExample.jar com/baeldung/jar/*.class

3.2. Установка основного класса

Для манифеста файла jar полезно включить основной класс.

Манифест — это специальный файл в банке, расположенный в каталоге META-INF и названный MANIFEST.MF. Файл манифеста содержит специальную метаинформацию о файлах в файле jar.

Некоторые примеры того, для чего мы можем использовать файл манифеста, включают установку точки входа, установку информации о версии и настройку пути к классам.

Используя параметр e, мы можем указать нашу точку входа, и команда jar добавит ее в сгенерированный файл манифеста.

Запустим jar с указанной точкой входа:

jar cfe JarExample.jar com.baeldung.jar.JarExample com/baeldung/jar/*.class

3.3. Обновление содержимого

Допустим, мы внесли изменения в один из наших классов и перекомпилировали его. Теперь нам нужно обновить наш jar-файл.

Воспользуемся командой jar с параметром u для обновления его содержимого:

jar uf JarExample.jar com/baeldung/jar/JarExample.class

3.4. Настройка файла манифеста

В некоторых случаях нам может потребоваться больший контроль над тем, что находится в нашем файле манифеста. Команда jar предоставляет функциональные возможности для предоставления нашей собственной информации манифеста.

Давайте добавим в наше приложение неполный файл манифеста с именем example_manifest.txt, чтобы задать точку входа:

Main-Class: com.baeldung.jar.JarExample

Информация о манифесте, которую мы предоставляем, будет добавлена ​​к тому, что генерирует команда jar, поэтому это единственная строка нам нужно в файле .

Важно, чтобы мы заканчивали наш файл манифеста новой строкой. Без новой строки наш файл манифеста будет молча игнорироваться.

С этой настройкой давайте снова создадим нашу банку, используя информацию из манифеста и параметр m:

jar cfm JarExample.jar com/baeldung/jar/example_manifest.txt com/baeldung/jar/*.class

3.5. Подробный вывод

Если нам нужна дополнительная информация из команды jar, мы можем просто добавить параметр v для подробного описания.

Давайте запустим нашу команду jar с параметром v:

jar cvfm JarExample.jar com/baeldung/jar/example_manifest.txt com/baeldung/jar/*.class
added manifest
adding: com/baeldung/jar/JarExample.class(in = 453) (out= 312)(deflated 31%)

4. Использование Maven

4.1. Конфигурация по умолчанию

Мы также можем использовать Maven для создания нашего jar. Поскольку 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.baeldung.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.baeldung.jar.JarExample</start-class>
    <!-- Other properties -->
</properties>

Мы также можем использовать Gradle для создания толстой банки Spring Boot.

6. Запуск jar

Теперь, когда у нас есть файл jar, мы можем его запустить. Мы запускаем файлы jar с помощью команды java.

6.1. Вывод основного класса

Поскольку мы продвинулись вперед и убедились, что наш основной класс указан в манифесте, мы можем использовать параметр -jar команды java для запуска нашего приложения без указания основного класса:

java -jar JarExample.jar

~ ~~ 6.2. Указание основного класса

Мы также можем указать основной класс при запуске нашего приложения. Мы можем использовать параметр -cp, чтобы убедиться, что наш файл jar находится в пути к классам, а затем предоставить наш основной класс в формате package.className:

java -cp JarExample.jar com.baeldung.jar.JarExample

Использование разделителей пути вместо формата пакета также работает:

java -cp JarExample.jar com/baeldung/jar/JarExample

~ ~~ 6.3. Вывод содержимого Jar

Мы можем использовать команду jar для просмотра содержимого нашего JAR-файла:

jar tf JarExample.jar
META-INF/
META-INF/MANIFEST.MF
com/baeldung/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.baeldung.jar.JarExample

7. Заключение

В этом руководстве мы создали простое Java-приложение с основным классом.

Затем мы рассмотрели три способа создания jar-файлов: с помощью команды jar, с помощью Maven и с помощью приложения Maven Spring Boot.

После того, как мы создали наши jar-файлы, мы вернулись к командной строке и запустили их с предполагаемым и указанным основным классом.

Мы также узнали, как отображать содержимое файла и как отображать содержимое отдельного файла в банке.

И простой пример Java, и пример Spring Boot доступны на GitHub.