Перейти к основному содержимому

Руководство по созданию и запуску файла JAR в Java

· 6 мин. чтения

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.