Avatar ·

Не запускается JAR-файл: "no main manifest attribute"

Всем привет! Я новичок в Java и пытаюсь собрать свой первый проект в исполняемый JAR-файл. Проект простой: есть один класс `Main` с методом `main`, который выводит "Hello, World!". Я компилирую классы через командную строку, а затем создаю JAR с помощью команды: ``` jar cf myapp.jar Main.class ``` После этого пытаюсь запустить: ``` java -jar myapp.jar ``` И получаю ошибку: ``` no main manifest attribute, in myapp.jar ``` Я проверил, что метод `main` объявлен правильно — `public static void main(String[] args)`. В чём может быть проблема? Нужно ли что-то дополнительно указать при создании JAR? Я читал про манифест, но не совсем понимаю, как его правильно создать. Подскажите, пожалуйста, пошагово, что я делаю не так. Заранее спасибо! Пример моего кода: ```java public class Main { public static void main(String[] args) { System.out.println("Hello, World!"); } } ``` Я компилирую так: `javac Main.java`, затем создаю JAR: `jar cf myapp.jar Main.class`. Всё в одной папке. Использую Java 17. <<>>

Причина ошибки и полное решение

Ошибка no main manifest attribute возникает, потому что в JAR-файле отсутствует или неправильно заполнен файл META-INF/MANIFEST.MF. Этот файл содержит метаданные, в том числе указание на класс с точкой входа — Main-Class. Без него JVM не знает, какой класс запускать.

Команда jar cf myapp.jar Main.class создаёт JAR с автоматически сгенерированным манифестом, но в нём нет строки Main-Class. Нужно либо указать её вручную, либо использовать опцию -e (начиная с Java 8) или -m для указания собственного файла манифеста.

Способ 1: Использовать опцию -e (рекомендуется для простых проектов)

Это самый простой способ, если у вас один главный класс:

jar cfe myapp.jar Main Main.class

Здесь флаг e означает "entry point". После имени JAR-файла указывается полное имя класса (без .class). Команда автоматически создаст манифест с правильной Main-Class.

Способ 2: Создать файл манифеста вручную

Подходит для сложных проектов или когда нужно добавить другие атрибуты (например, Class-Path).

  1. Создайте текстовый файл, например MANIFEST.MF, с содержимым:
Manifest-Version: 1.0
Main-Class: Main

Важно: После Main-Class: Main обязательно должна быть пустая строка (перевод строки). Без неё манифест может быть прочитан некорректно.

  1. Затем создайте JAR, указав этот файл манифеста:
jar cfm myapp.jar MANIFEST.MF Main.class

Флаг m указывает, что нужно использовать внешний файл манифеста.

Способ 3: Использовать Maven или Gradle (для реальных проектов)

В больших проектах сборку автоматизируют с помощью систем сборки. Пример для Maven — в pom.xml нужно добавить плагин:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>Main</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

После этого команда mvn package создаст правильный JAR.

Проверка манифеста

Чтобы убедиться, что манифест корректен, можно просмотреть его содержимое:

jar tf myapp.jar META-INF/MANIFEST.MF
jar xf myapp.jar META-INF/MANIFEST.MF
cat META-INF/MANIFEST.MF

Вы должны увидеть строку Main-Class: Main.

Распространённые ошибки

  • Забыли указать класс с методом main — убедитесь, что метод объявлен как public static void main(String[] args).
  • Класс находится в пакете — тогда нужно указывать полное имя: Main-Class: com.example.Main.
  • Лишние пробелы или отсутствие пустой строки в конце манифеста.

После исправления ваш JAR будет запускаться командой java -jar myapp.jar.

<<>>

Альтернативный подход: использование IntelliJ IDEA или Eclipse

Если вы используете среду разработки (IDE), создание исполняемого JAR-файла можно сделать через графический интерфейс, что исключает ручные ошибки с манифестом.

IntelliJ IDEA:

  1. Перейдите в File → Project Structure → Artifacts.
  2. Нажмите + → JAR → From modules with dependencies.
  3. Выберите главный класс (Main) и настройте путь к JAR.
  4. Нажмите OK, затем Build → Build Artifacts → Build.

Eclipse:

  1. Правый клик на проекте → Export → Java → Runnable JAR file.
  2. Выберите конфигурацию запуска (Launch configuration) и укажите, куда сохранить JAR.
  3. Выберите опцию "Extract required libraries into generated JAR" (если есть зависимости).
  4. Нажмите Finish.

IDE автоматически создаёт правильный манифест и включает все необходимые классы. Это особенно удобно для новичков, так как не требует ручной работы с командной строкой.

Если вы всё же предпочитаете командную строку, рекомендую использовать jar cfe — это самый быстрый способ без лишних файлов.