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


519

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

Незалежно від того, як я скручую процес "build jar" IntelliJ, вихід мого модуля видається порожнім (окрім файлу META-INF).

Відповіді:


602

Ось як скласти банку з 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 не виконується
samuel Owino

6
Здається, хтось справді дуже багато працював, щоб не змусити його працювати. Це така ганьба, що вона ніколи не працює. Я спробував принаймні 50 різних відповідей, і жодна з них не спрацювала. І це одна і та ж історія кожного разу. Тепер я зарезервував тиждень, щоб просто випустити його як баночку, оскільки всі в нашій компанії вважають, що це справжнє зусилля, яке потрібно докласти для виготовлення вихідної банки.
Дивовижний

2
Як багато хто писав до мене, це спрощення, яке колись працює. Дивіться відповідь @zsolt tolvali нижче. Було б добре з точки зору IntelliJ зробити процес створення JAR РЕЗУЛЬТАТНОЮ ДІЯЛЬНІСТЮ при створенні нового проекту, тому що дуже мало людей цього не потребує!
Етамар Ларон

255

Це все ще проблема у 2017 році, я сподіваюся, що хтось там допоможе! Я знайшов 2 можливості створити робочі jar-s під IntelliJ 2017.2

1. Створення артефакту від IntelliJ:

  • Перейдіть до структури проекту:

Меню файлів

  • Створіть новий артефакт:

Створіть новий артефакт

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

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

Ви повинні змінити каталог маніфестів:

<project folder>\src\main\java 

замінити "java" на "ресурси"

<project folder>\src\main\resources

Ось як це має виглядати:

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

  • Тоді ви вибираєте залежності, які ви хочете запакувати у вашій банку, або БЛІЗУ ваших файлів jar

  • Щоб створити свій артефакт, перейдіть до створення артефактів та оберіть "відновити". Це створить папку "out" з вашим файлом jar та її залежностями.

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

2. Використання maven-Assembly-плагіна

Додати розділ збирання у файл 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>
  • Створіть нову конфігурацію запуску / налагодження:

Створіть нову конфігурацію запуску / налагодження:

  • Виберіть додаток:

Виберіть додаток

  • Заповнити форму
  • Додайте головну мету "збірка: одинарний" після складання, щоб вона була виконана останньою

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

Остаточна установка

  • Збережіть його, а потім запустіть

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

Ця процедура створить файл jar в папці "target"

Розташування файлу JAR


6
змінити каталог маніфестів на src / ресурси - ключовий момент !!! дякую ~
fantouch

3
Цей найрізноманітніший шлях є найкритичнішим, дякую @Zsolt Tolvaly
fruqi

2
Я no main manifest attributeприймав рішення вище. Ніхто не згадав про зміну path to manifest. Thnx !!
Прометей

1
це має бути головна відповідь. Дякую!
Джоргос Лампракіс

як щодо вихідного коду в scala? java - це не те, що я використовую
Kiwy

135

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

Як створити за .jarдопомогою IntelliJ IDEA 14.1.5:

  1. Файл> Зберегти все.
  2. Запуск драйвера або класу з основним методом.
  3. Файл> Структура проекту
  4. Виберіть вкладку "Артефакти".
  5. Клацніть зелену кнопку плюс у верхній частині вікна.
  6. Виберіть JAR у спадному меню Додати. Виберіть "З модулів із залежностями"
  7. Виберіть основний клас.
  8. Перемикач повинен вибирати "витягнути до цільової JAR". Натисніть OK.
  9. Поставте прапорець "Побудувати на марці"
  10. Натисніть застосувати та OK.
  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. протестуйте свою банку, використовуючи 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 повинен бути у цьому каталозі?
Ubeogesh

Це допомагає мені
Девендра Сінграул

5

Напевно, трохи пізно, але мені вдалося вирішити це таким чином -> відкрити за допомогою winrar та видалити ECLIPSEF.RSA та ECLIPSEF.SF у папці META-INF, до того ж поставити "Main-class: main_class_name" (без ".class" ) у MANIFEST.MF. Переконайтесь, що після останнього рядка ви двічі натискали "Enter", інакше це не працюватиме.


Для підписаних залежностей, будь ласка , подивіться на цей відповідь: stackoverflow.com/questions/41746177 / ...

Яке божевільне питання. Будь-яка ідея, чому це відбувається або як виправити? Це відчуває себе хакі
Ендрю,

5

Коли я використовую ці рішення, ця помилка приходить:

java -jar xxxxx.jar

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

і рішення :

Ви повинні змінити каталог маніфестів:

<project folder>\src\main\java 

змінити Java на ресурси

<project folder>\src\main\resources

Уо, нарешті, дякую за пораду!
відмовитись

@rendon Удачі!
Саїд

Ідеально !. Це прекрасно працює
jafarmlp

2

Я намагався створити банку з мультимодульного додатка Kotlin і отримував горезвісну помилку "немає головного атрибута маніфесту". Створення каталогу маніфестів src/main/resourcesтакож не працювало.

Замість цього, він працює при його створенні в srcбезпосередньо: src/META-INF/MANIFEST.MF.

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


Привіт, спасибі, це працює чудово. Але тепер у мене є нова помилка, що вона не знаходить ресурсів "java.desktop / javax.swing.ImageIcon java.lang.NullPointerException"
Shivam Mathur

2

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

Як кажуть люди вище, але я мушу зазначити один момент. Ви повинні встановити прапорець:

Включити у складання проекту


1

Ідея 8.1.3

Jar в порядку, оскільки є зібраний вихід у каталозі 'output' (проект / вихід / виробництво //)

Я здогадуюсь, вам доведеться запустити '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 ). Ви можете використовувати його або як основний процес збирання програми, або просто для виконання певних завдань через діалогове вікно Редагування конфігурацій. Процес створення JAR модуля в Maven є досить тривіальним, якщо ви хочете, щоб він включав усі залежності в самовиконаний JAR, який також є тривіальним.

Якщо ви ніколи не використовували Maven раніше, ви хочете прочитати Better Builds з Maven .


8
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" як тип артефакту замість "Інше".
червоний

0

Деякі з інших відповідей марні, оскільки щойно ви повторно імпортуєте проект IntelliJ IDEA з проекту Maven, всі зміни будуть втрачені.

Побудова баночки повинна бути спровокована конфігурацією запуску / налагодження, а не налаштуваннями проекту.

Jetbrains має хороший опис того, як ви можете це досягти тут:

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

Прокрутіть униз до розділу під назвою "Налаштування тригерів для цілей Мевена".

(Єдиним недоліком їх опису є те, що їх скріншоти знаходяться у стандартній кольоровій гамі чорно-білих кольорів за замовчуванням замість супер-приголомшливої ​​теми даркули. Тьфу!)

Отже, в основному те, що ти робиш, це те, що ти відкриваєш панель "Maven Projects", ти виявляєш цікавий проект (у твоєму випадку проект, який будує твою банку), під ним ти знаходиш головну мету, яку ти хочеш виконати. , (зазвичай мета "пакунок" створює банки,) ви відкриєте контекстне меню на ньому (клацніть правою кнопкою миші на машині Windows), і з'явиться опція "Виконати перед запуском / налагодженням ...", яку ви можете виберіть, і це візьме вас за руку. Дійсно легко.


0

У випадку, якщо ви намагаєтеся створити банку з kotlin, вам потрібно створити src/main/javaпапку і використовувати цю папку як місце для папки META-INF.


0

Ось офіційна відповідь довідки IntelliJ IDEA 2018.3 . Я спробував, і це спрацювало.

Створити файл JAR з модуля;

  1. У головному меню виберіть «Створити» Побудувати артефакт.

  2. З випадаючого списку виберіть потрібний артефакт типу JAR. У списку показані всі артефакти, налаштовані для поточного проекту. Щоб створити всі налаштовані артефакти, виберіть параметр Збір усіх артефактів.


0

Моєю проблемою було таке: я використав Intellij IDEA (пробував різні версії) + Gradle. Коли я складав проект і будував банку з артефакфом, як зазначено у вищезазначених відповідях, я отримав помилку - "жоден головний маніфест не порушується ..."

Це рішення спрацювало для мене (особлива подяка Thilina Ashen Gamage (див. Вище) за пораду):

Витяг - якщо ви використовуєте зовнішні бібліотеки і будуєте проект через Налаштування проекту - Артефакти - Додати (+) - Jar - З модулів із залежностями , то, ймовірно, через програмну помилку папка META-INF з файлом MANIFEST_MF, не включаючи в jar. Щоб уникнути цього , створити EMPTY .jar файл.

Налаштування проекту - Артефакти - Додати (+) - Jar - EMPTY JAR . Папка META-INF буде додана до папки ресурсів . Потім виберіть свій основний клас. Ви побачите таку структуру баночки: відзначте наявність папки META-INF Зверніть увагу на наявність папки META-INF. Потім ви можете створити проект та створити артефакти. Це рішення працювало і для програм javaFX.


-1

Якщо ви працюєте над проектом spring / mvn, ви можете скористатися цією командою:

mvn package -DskipTests

Файл jar буде збережений у цільовій дирекції.


-3

Мураш і Мейвен широко використовуються. Я вважаю за краще Мурашник, я вважаю, що це легше, і ти, розробник, більше контролюєш. Дехто припустив, що це його мінус :-)


3
Це нічого не дає пояснення, чому відбувається помилка.
baordog
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.