«1. Обзор

Каждый исполняемый класс Java должен содержать основной метод. Проще говоря, этот метод является отправной точкой приложения.

Чтобы запустить наш основной метод из самозапускающегося файла JAR, мы должны создать правильный файл манифеста и упаковать его вместе с нашим кодом. Этот файл манифеста должен иметь основной атрибут манифеста, определяющий путь к классу, содержащему наш основной метод.

В этом руководстве мы покажем, как упаковать простой класс Java в самозапускающийся JAR-файл, и продемонстрируем важность основного атрибута манифеста для успешного выполнения.

2. Выполнение JAR без основного атрибута манифеста

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

Давайте напишем простой класс Java с основным методом:

public class AppExample {
    public static void main(String[] args){
        System.out.println("AppExample executed!");
    }
}

Чтобы упаковать наш класс-пример в архив JAR, мы должны перейти в оболочку нашей операционной системы и скомпилировать его:

javac -d . AppExample.java

~~ ~ Затем мы можем упаковать его в JAR:

jar cvf example.jar com/baeldung/manifest/AppExample.class

Наш example.jar будет содержать файл манифеста по умолчанию. Теперь мы можем попытаться выполнить JAR:

java -jar example.jar

Выполнение завершится с ошибкой:

no main manifest attribute, in example.jar

3. Выполнение JAR с атрибутом Main Manifest

Как мы видели, JVM не может найдите наш основной атрибут манифеста. Из-за этого он не смог найти наш основной класс, содержащий наш основной метод.

Давайте включим соответствующий атрибут манифеста в JAR вместе с нашим кодом. Нам нужно создать файл MANIFEST.MF, содержащий одну строку:

Main-Class: com.baeldung.manifest.AppExample

Наш манифест теперь содержит путь к нашему скомпилированному AppExample.class. Поскольку мы уже скомпилировали наш примерный класс, нет необходимости делать это снова.

Мы просто упакуем его вместе с нашим файлом манифеста:

jar cvmf MANIFEST.MF example.jar com/baeldung/manifest/AppExample.class

На этот раз JAR выполняется, как и ожидалось, и выводит:

AppExample executed!

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

В этой быстрой статье мы показали, как чтобы упаковать простой класс Java в самовыполняющийся JAR-файл, и мы продемонстрировали важность основного атрибута манифеста на двух простых примерах.

Полный исходный код примера доступен на GitHub. Это проект на основе Maven, поэтому его можно импортировать и использовать как есть.