Создание JAR-файла в IntelliJ IDEA — это ключевой навык для любого Java-разработчика, будь вы начинающий или опытный профессионал. Этот архив содержит все необходимое для запуска вашего приложения: скомпилированные классы, ресурсы и метаданные. В этом подробном руководстве мы разберем все способы сборки — от простого экспорта до настройки сложных манифестов и зависимостей через Maven и Gradle.
Что такое JAR и зачем он нужен?
JAR (Java ARchive) — это формат файлов на основе ZIP, используемый для агрегации множества файлов Java в один. Он является стандартным способом распространения Java-приложений и библиотек. Внутри него находятся:
- Скомпилированные .class файлы
- Ресурсы (изображения, конфигурационные файлы)
- Метаданные (MANIFEST.MF)
- Зависимости (опционально)
Важно: JAR-файл может быть исполняемым, если в манифесте указан главный класс (Main-Class). Запускается такой файл командой java -jar your_app.jar.
Способ 1: Быстрая сборка через меню Build
Базовые шаги
- Откройте ваш проект в IntelliJ IDEA.
- Убедитесь, что проект успешно компилируется (Build → Build Project).
- Перейдите в File → Project Structure (Ctrl+Alt+Shift+S).
- В разделе Project Settings выберите Artifacts.
- Нажмите «+» → JAR → From modules with dependencies.
- Выберите главный класс (Main Class) вашего приложения.
- Настройте выходную директорию для JAR-файла.
- Примените изменения и нажмите OK.
Теперь для сборки используйте Build → Build Artifacts → Build. Ваш JAR-файл появится в указанной папке.
Способ 2: Продвинутая настройка манифеста
Манифест-файл (META-INF/MANIFEST.MF) — это сердце вашего JAR. В нем можно указать:
- Main-Class: полное имя класса с методом main
- Class-Path: зависимости от других библиотек
- Версию и информацию о разработчике
Совет: Для сложных проектов создайте свой MANIFEST.MF файл вручную в папке src/main/resources/META-INF/. IDEA автоматически включит его в JAR.
Создание исполняемого JAR с зависимостями
Самый частый вопрос — как включить все библиотеки в один JAR. Есть два основных подхода:
- Fat JAR/Uber JAR: Все зависимости распаковываются и включаются в один архив. Настройте это в Artifacts, выбрав опцию «extract to the target JAR» для зависимостей.
- JAR с внешними библиотеками: Зависимости копируются в отдельную папку lib/, а в Class-Path манифеста прописываются относительные пути к ним.
Способ 3: Использование систем сборки Maven и Gradle
Для профессиональных проектов лучше использовать системы сборки.
Maven: плагин maven-jar-plugin
Добавьте в ваш pom.xml:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.yourcompany.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Запустите сборку: mvn clean package. JAR появится в target/.
Gradle: задача jar
В build.gradle настройте:
jar {
manifest {
attributes 'Main-Class': 'com.yourcompany.MainClass'
}
from {
configurations.runtimeClasspath.collect {
it.isDirectory() ? it : zipTree(it)
}
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
Соберите: gradle jar или gradle build.
Типичные проблемы и их решение
- "No main manifest attribute": Не указан Main-Class в манифесте. Проверьте настройки Artifacts или конфигурацию плагина.
- ClassNotFoundException: Зависимости не включены в Class-Path или не распакованы в Fat JAR.
- Ошибки версий Java: Убедитесь, что версия JRE для компиляции совместима с целевой средой выполнения.
Профилактика: Всегда тестируйте собранный JAR-файл на чистой машине или в Docker-контейнере, чтобы убедиться в переносимости.
FAQ: Часто задаваемые вопросы
Как создать JAR-файл из модуля без зависимостей?
В меню Artifacts выберите JAR → Empty, затем вручную добавьте скомпилированные выходные файлы (Output Root).
Можно ли собрать JAR для библиотеки (без Main-Class)?
Да, просто не указывайте главный класс. Такой JAR будет использоваться как зависимость в других проектах.
Почему мой JAR-файл такой большой?
Вероятно, вы создали Fat JAR со всеми зависимостями. Используйте инструменты вроде Maven Shade Plugin или Gradle Shadow Plugin для оптимизации, или выносите библиотеки отдельно.
Как добавить иконку или изменить метаданные JAR?
Метаданные задаются в манифесте. Для иконки приложения (в Windows, например) потребуется дополнительная утилита или сборка в EXE-формат через Launch4j или jpackage.
IntelliJ IDEA не видит главный класс при создании Artifact
Убедитесь, что класс содержит корректный метод public static void main(String[] args) и что проект успешно скомпилирован. Иногда помогает перезагрузка IDEA.