Как правильно построить банки из IntelliJ?


519

У меня есть проект, который содержит один модуль и некоторые зависимости. Я хотел бы создать JAR, в отдельном каталоге, который содержит скомпилированный модуль. Кроме того, я хотел бы, чтобы зависимости присутствовали рядом с моим модулем.

Независимо от того, как я закручиваю процесс IntelliJ «build jar», вывод моего модуля выглядит пустым (кроме файла META-INF).

Ответы:


603

Вот как можно создать банку с IntelliJ 10 http://blogs.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/

File-> Project Structure-> Project Settings-> Artifacts-> Нажмите green plus sign-> Jar->From modules with dependencies...

Выше приведен «скелет», в котором будет сохранена банка. Чтобы создать и сохранить его, сделайте следующее:

Извлечь в целевую банку

Хорошо

Построить | Построить артефакт | Сложение

Попробуйте извлечь файл .jar из

ProjectName | вне | артефакты | ProjectName_jar | ProjectName.jar


9
Сбой, когда некоторые классы в вашем включенном фляге подписаны с RSA.
Асиф Шахзад

1
@AsifShahzad см. Этот ответ для создания файлов JAR с подписанными зависимостями: stackoverflow.com/questions/41746177/… .

5
Этот метод все еще не работает,
JAR-

6
Кажется, кто-то действительно работал очень усердно, чтобы не заставить его работать. Это такой позор, это никогда не работает. Я перепробовал как минимум 50 разных ответов, и ни один из них не сработал. И это одна и та же история каждый раз. Теперь я резервирую неделю, чтобы просто вывести ее в виде баночки, поскольку все в нашей компании считают, что это подлинное усилие, которое необходимо предпринять для производства баночки для выработки.
Великолепно

2
Как многие писали до меня, это упрощение, которое иногда работает. Пожалуйста, смотрите ответ @zsolt tolvali ниже. Было бы хорошо с точки зрения IntelliJ сделать процесс создания JAR ДЕЯТЕЛЬНОСТЬЮ ПО УМОЛЧАНИЮ при создании нового проекта, потому что очень немногим это не нужно!
Этамар Ларон

256

Это все еще проблема в 2017 году, я надеюсь, что это поможет кому-то там! Я нашел 2 возможности для создания рабочих jar-ов под IntelliJ 2017.2

1. Создание артефакта из IntelliJ:

  • Перейти к структуре проекта:

Меню Файл

  • Создайте новый артефакт:

Создать новый артефакт

  • Выберите основной класс и обязательно измените папку манифеста:

введите описание изображения здесь

Вы должны изменить каталог манифеста:

<project folder>\src\main\java 

заменить "Java" на "ресурсы"

<project folder>\src\main\resources

Вот как это должно выглядеть:

правильный путь для нового манифеста

  • Затем вы выбираете зависимости, которые вы хотите упаковать в свой jar-файл или NEAR-файл jar-файла.

  • Чтобы построить свой артефакт, перейдите к созданию артефактов и выберите «перестроить». Он создаст папку «out» с вашим файлом jar и его зависимостями.

введите описание изображения здесь

2. Использование maven-assembly-plugin

Добавить раздел сборки в файл pom

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <finalName>ServiceCreate</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <archive>
                        <manifest>
                            <mainClass>com.svt.optimoo.App</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • Создайте новую конфигурацию запуска / отладки:

Создайте новую конфигурацию запуска / отладки:

  • Выберите приложение:

Выберите приложение

  • Заполнить форму
  • Добавьте цель maven "Assembly: single" после сборки, которая будет выполнена последней

введите описание изображения здесь

Окончательная настройка

  • Сохраните его, затем запустите

введите описание изображения здесь

Эта процедура создаст файл JAR в папке «target»

Расположение файла JAR


7
изменить каталог манифеста на src / resources является ключевым моментом !!! спасибо ~
fantouch

3
Этот путь МАНИФЕСТА
fruqi

2
Я no main manifest attributeпринимал вышеуказанные решения. Никто не упомянул об изменении path to manifest. Thnx !!
Прометей

1
это должен быть главный ответ. Спасибо!
Гиоргос Лампракис

как насчет исходного кода в Scala?
Ява

135

У меня недавно была эта проблема, и я думаю, что эти шаги легко выполнить, если в каком-либо предыдущем решении или ссылке отсутствуют детали.

Как создать с .jarпомощью IntelliJ IDEA 14.1.5:

  1. Файл> Сохранить все.
  2. Запустите драйвер или класс с методом main.
  3. Файл> Структура проекта.
  4. Выберите вкладку «Артефакты».
  5. Нажмите зеленую кнопку плюс в верхней части окна.
  6. Выберите JAR из выпадающего меню Add. Выберите «Из модулей с зависимостями»
  7. Выберите основной класс.
  8. Переключатель должен выбрать «извлечь в целевой JAR». Нажмите ОК
  9. Установите флажок «Построить по марке»
  10. Нажмите применить и ОК.
  11. В главном меню выберите выпадающий список.
  12. Выберите опцию сборки артефактов.

1
ты что-то пропустил? В модуле есть опция, которая должна быть такой. В моем случае это создает JAR, но JVM из-за ошибки из-за безопасности.
sonus21

Я думаю, что список это все. У вас может быть что-то с вашими настройками Java, чтобы остановить его из-за безопасности. У кого-нибудь еще есть мысли по этому поводу?
user5442490

Повторил то же самое, и у меня ошибка: не удалось найти или загрузить основной класс JavaFundamentals.jar при запуске этого файла JAR. Объясняется здесь: stackoverflow.com/questions/40636790/…
laggerok19

Нужно ли выполнять этот 12-шаговый процесс каждый раз, когда я хочу построить флягу, или IntelliJ запомнит эти действия, чтобы вы могли использовать для этого ярлык?
Энди

31

Для тех, кто получает выгоду от изображений, как я:

File -> Project Structure

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь


4
@ samuelowino Я не ценю, что ты так говоришь. Объясните, что "не работает вообще".
Crt

1
Привет @Crt Я не проверял правильный файл jar, по-видимому, Inteliji создал два файла jar в разных каталогах, извиняюсь, плохо, ваше решение работает, спасибо
samuel owino

15

Вот 2 примера с проектом Maven, шаг за шагом:

Способ 1: собрать банку с maven и pom.xml

  1. Файл, новый, проект, Maven
  2. создать пакет, создать программу Java внутри этого пакета введите описание изображения здесь
  3. в pom.xml добавьте maven-jar-plugin.

        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>somePackage.sample</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

Снимок экрана: введите описание изображения здесь 4. Откройте окно проекта Maven, нажав на значок поиска и введите Maven, введите описание изображения здесь

  1. нажмите на очистить, затем нажмите на установку введите описание изображения здесь

  2. Ваш файл JAR будет отображаться в целевой папке введите описание изображения здесь

  3. проверить свой jar с помощью java -jar

введите описание изображения здесь

Способ 2: построить банку с Maven без изменения pom.xml

  1. Файл, новый, проект, Maven
  2. создать пакет, создать Java-программу внутри этого пакета (так же, как выше)
  3. File-> Project Structure-> Project Settings-> Artifacts-> Нажмите green plus sign-> Jar->From modules with dependencies

Очень важно!

Файл MANIFEST.MF должен находиться в вашей папке ресурсов, а Main.Class должен ссылаться на {package} - {class-name-that-contains-main-class}

введите описание изображения здесь введите описание изображения здесь

  1. затем нажмите кнопку «Создать» в меню, создать артефакты, создать

введите описание изображения здесь

  1. найдите банку в папке out

введите описание изображения здесь

  1. запустить его :)

введите описание изображения здесь


это работает. Можете ли вы объяснить, почему MANIFEST.MF должен быть в этом каталоге?
Убеогеш

Это помогает мне
Девендра Синграу

5

Возможно, уже немного поздно, но мне удалось решить это следующим образом -> открыть с помощью winrar и удалить ECLIPSEF.RSA и ECLIPSEF.SF в папке META-INF, кроме того, поставить «Main-class: main_class_name» (без «.class» ) в МАНИФЕСТ.МФ. Убедитесь, что вы нажали «Enter» дважды после последней строки, иначе это не сработает.


Для подписанных зависимостей, пожалуйста, посмотрите на этот ответ: stackoverflow.com/questions/41746177/…

Что за безумная проблема. Есть идеи, почему это происходит или как это исправить? Это кажется счастливым
Андрей Нет

5

Когда я использую эти решения, эта ошибка приходит:

java -jar xxxxx.jar

нет основного атрибута манифеста, в xxxxx.jar

и решение :

Вы должны изменить каталог манифеста:

<project folder>\src\main\java 

изменить Java на ресурсы

<project folder>\src\main\resources

Вот, наконец, спасибо за совет!
rendon

@rendon Удачи вот так!
Саид

Отлично !. Это работает отлично
jafarmlp

2

Я пытался создать банку из многомодульного приложения Kotlin и получал пресловутую ошибку «нет атрибута главного манифеста». Создание каталога манифеста в src/main/resourcesтоже не работало.

Вместо этого, он работает при его создании в srcнепосредственно: src/META-INF/MANIFEST.MF.

введите описание изображения здесь


Привет спасибо работает нормально Но теперь у меня есть новая ошибка, что он не находит ресурсы "java.desktop / javax.swing.ImageIcon java.lang.NullPointerException"
Шивам Матур

2

введите описание изображения здесь

Как говорят люди выше, но я должен отметить один момент. Вы должны проверить флажок:

Включить в сборку проекта


1

Идея 8.1.3

Jar в порядке, так как есть скомпилированный вывод в директории 'output' (project / out / production //)

Я полагаю, вы должны запустить 'make', прежде чем строить банку

для зависимостей просто отметьте «Показать библиотеку» и выберите то, что вы хотите.


1

С Maven вы можете использовать этот плагин:

 <build>
    <plugins>

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>[path you class main]</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase> 
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

0

Возможно, вы захотите взглянуть на Maven ( http://maven.apache.org ). Вы можете использовать его как основной процесс сборки для вашего приложения, или просто для выполнения определенных задач через диалог Edit Configurations. Процесс создания JAR-модуля в Maven довольно тривиален, если вы хотите, чтобы он включал все зависимости в самозапускаемый JAR-файл, который также тривиален.

Если вы никогда раньше не пользовались Maven, тогда вам стоит прочитать Better Builds With Maven .


8
Maven, очевидно, накладные расходы для простых задач, таких как создание банки. Может быть, Ant, но не Maven точно.
Юрий

Ссылка не работает (октябрь 2014)
KathyA.

1
@KathyA. Спасибо - обновлено, чтобы использовать рекомендации команды Maven.
Гэри Роу

5
Если это так тривиально, почему бы не включить его в свой ответ?
нуццолило

1
Потому что я желаю читателю посетить сайт и начать учебный процесс.
Гари Роу

0

Если вы используете сторонние библиотеки со своим проектом или у вас есть проблемы с созданием файла MANIFEST.MF должным образом, могут возникнуть конфликты при запуске файлов JAR, созданных с использованием

File > Project Structure > Artifacts > '+' > JAR > From modules with dependencies > .....

метод, упомянутый выше.

Вместо этого я предлагаю вам создать пустой JAR и вручную добавить все остальные элементы в выходной корень. Замечательная статья в блоге для этого метода может быть найдена здесь: http://karthicraghupathi.com/2016/07/10/creating-an-executable-jar-in-intellij-idea/ Я попробовал шаги, упомянутые там, и все работало нормально для меня!


Спасибо, это помогло мне! В Intellij возникает ошибка, когда манифест проекта перезаписывается в JAR манифестом по умолчанию, если вы выбрали «JAR» в качестве типа артефакта вместо «Other».
красный

0

Некоторые другие ответы бесполезны, потому что как только вы повторно импортируете проект IntelliJ IDEA из проекта maven, все изменения будут потеряны.

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

Jetbrains имеет хорошее описание того, как вы можете сделать это здесь:

https://www.jetbrains.com/help/idea/maven.html

Прокрутите вниз до раздела «Настройка триггеров для целей Maven».

(Единственным недостатком их описания является то, что их скриншоты имеют стандартную черно-белую цветовую схему вместо супер-классной темы про Даркулу. Тьфу!)

Итак, в основном вы открываете панель «Maven Projects», вы находите интересующий вас проект (в вашем случае проект, который создает ваш jar), под ним вы находите цель maven, которую хотите выполнить. (обычно цель «package» создает jar-файлы), вы открываете в нем контекстное меню (щелкните правой кнопкой мыши на машине с Windows) и появится опция «Выполнить перед запуском / Отладка ...», которую вы можете выберите, и он возьмет вас за руку оттуда. Действительно легко.


0

В случае, если вы пытаетесь собрать jar с kotlin, вам нужно создать src/main/javaпапку и использовать эту папку в качестве места для папки META-INF.


0

Вот официальный ответ Справки IntelliJ IDEA 2018.3 . Я пытался, и это сработало.

Построить файл JAR из модуля;

  1. В главном меню выберите Build | Построить артефакт.

  2. В раскрывающемся списке выберите нужный артефакт типа JAR. В списке отображаются все артефакты, настроенные для текущего проекта. Чтобы собрать все настроенные артефакты, выберите параметр «Построить все артефакты».


0

Моя проблема была в следующем: я использовал Intellij IDEA (пробовал разные версии) + Gradle. Когда я скомпилировал проект и собрал artifacf jar, как указано в приведенных выше ответах, я получил ошибку - «нет основного манифеста attrubute ...»

Это решение сработало для меня (особая благодарность Thilina Ashen Gamage (см. Выше) за подсказку):

Выдержка - если вы используете внешние библиотеки и строите проект через Настройки проекта - Артефакты - Добавить (+) - Jar - Из модулей с зависимостями , то, вероятно, из-за ошибки программы в папке META-INF с файлом «MANIFEST_MF», не включающем jar. Чтобы избежать этого, создайте ПУСТОЙ jar-файл.

Настройки проекта - Артефакты - Добавить (+) - Jar - ПУСТОЙ JAR . Папка META-INF будет добавлена ​​в папку ресурсов . Затем выберите свой основной класс. Вы увидите следующую структуру jar: обратите внимание на наличие папки META-INF обратите внимание на наличие папки META-INF. Затем вы можете собрать свой проект и собрать артефакты. Это решение работало и для приложений javaFX.


-1

Если вы работаете над проектом spring / mvn, вы можете использовать эту команду:

mvn package -DskipTests

Файл jar будет сохранен на целевой директой.


-3

Муравей и мавен широко используются. Я предпочитаю Ant, я чувствую, что он более легкий, а вы, разработчик, лучше контролируете ситуацию. Некоторые предполагают, что это его недостаток :-)


3
Это ничего не объясняет, почему происходит ошибка.
baordog
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.