Comment construire correctement des pots à partir d'IntelliJ?

519

J'ai un projet qui contient un seul module et quelques dépendances. Je voudrais créer un pot, dans un répertoire séparé, qui contient le module compilé. De plus, j'aimerais avoir les dépendances à côté de mon module.

Peu importe comment je tord le processus "build jar" d'IntelliJ, la sortie de mon module semble vide (en plus d'un fichier META-INF).

ripper234
la source

Réponses:

603

Voici comment créer un bocal avec IntelliJ 10 http://blogs.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/

File-> Project Structure-> Project Settings-> Artifacts-> Cliquez sur green plus sign-> Jar->From modules with dependencies...

Ce qui précède définit le "squelette" à l'endroit où le pot sera enregistré. Pour le construire et l'enregistrer, procédez comme suit:

Extraire dans le pot cible

D'accord

Construire | Construire un artefact | Construire

Essayez d'extraire le fichier .jar de

ProjectName | out | artefacts | ProjectName_jar | ProjectName.jar

EpicPandaForce
la source
9
Il échoue lorsque certaines classes de votre pot inclus sont signées avec RSA.
Asif Shahzad
1
@AsifShahzad voir cette réponse pour créer des fichiers jar avec des dépendances signées: stackoverflow.com/questions/41746177/… .
5
Cette méthode échoue toujours, le fichier jar ne s'exécute pas
samuel owino
6
Il semble que quelqu'un ait vraiment travaillé très dur pour ne pas le faire fonctionner. C'est tellement dommage que ça ne marche jamais. J'ai essayé au moins 50 réponses différentes et rien n'a fonctionné. Et c'est la même histoire à chaque fois. Maintenant, je réserve une semaine pour le produire comme un pot, car tout le monde dans notre entreprise pense que c'est un véritable effort qui doit être fait pour produire un pot de sortie.
Génial
2
Comme beaucoup l'ont écrit avant moi, c'est une simplification qui fonctionne parfois. Veuillez voir la réponse de @zsolt tolvali ci-dessous. Du point de vue d'IntelliJ, il serait bon de faire du processus de création de JAR une ACTIVITÉ PAR DÉFAUT lors de la création d'un nouveau projet, car très peu de gens n'en ont pas besoin!
Etamar Laron
256

C'est toujours un problème en 2017, j'espère que cela aidera quelqu'un là-bas! J'ai trouvé 2 possibilités pour créer des pots de travail sous IntelliJ 2017.2

1. Création d'artefact à partir d'IntelliJ:

  • Accédez à la structure du projet:

Menu Fichier

  • Créez un nouvel artefact:

Créer un nouvel artefact

  • Sélectionnez la classe principale et assurez-vous de modifier le dossier manifeste:

entrez la description de l'image ici

Vous devez changer le répertoire du manifeste:

<project folder>\src\main\java 

remplacer "java" par "resources"

<project folder>\src\main\resources

Voici à quoi cela devrait ressembler:

manière correcte pour le nouveau manifeste

  • Ensuite, vous choisissez les dépendances ce que vous voulez emballer dans votre pot, ou près de votre fichier pot

  • Pour construire votre artefact, allez à construire des artefacts et choisissez "reconstruire". Il créera un dossier "out" avec votre fichier jar et ses dépendances.

entrez la description de l'image ici

2. Utilisation du plugin maven-assembly-plugin

Ajouter une section de construction au fichier 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>
  • Créez une nouvelle configuration d'exécution / débogage:

Créez une nouvelle configuration d'exécution / débogage:

  • Choisissez l'application:

Choisissez l'application

  • Remplissez le formulaire
  • Ajouter l'objectif maven "assembly: single" après la dernière génération à exécuter

entrez la description de l'image ici

Configuration finale

  • Enregistrez-le, puis exécutez

entrez la description de l'image ici

Cette procédure créera le fichier jar sous le dossier "target"

Emplacement du fichier JAR

Zsolt Tolvaly
la source
7
changer le répertoire du manifeste en src / resources est le point clé !!! merci ~
fantouch
3
Ce chemin MANIFEST est le plus critique, merci @Zsolt Tolvaly
fruqi
2
J'étais en train d' no main manifest attributeadopter les solutions ci-dessus. Personne n'a mentionné avoir changé le path to manifest. Thnx !!
Prometheus
1
ce devrait être la meilleure réponse. Merci!
Giorgos Lamprakis
que diriez-vous du code source dans scala? java n'est pas ce que j'utilise
Kiwy
135

J'ai récemment rencontré ce problème et je pense que ces étapes sont faciles à suivre si une solution ou un lien antérieur manque de détails.

Comment créer un .jarutilisant IntelliJ IDEA 14.1.5:

  1. Fichier> Enregistrer tout.
  2. Exécutez le pilote ou la classe avec la méthode principale.
  3. Fichier> Structure du projet.
  4. Sélectionnez l'onglet "Artefacts".
  5. Cliquez sur le bouton vert plus en haut de la fenêtre.
  6. Sélectionnez JAR dans le menu déroulant Ajouter. Sélectionnez "A partir de modules avec dépendances"
  7. Sélectionnez la classe principale.
  8. Le bouton radio doit sélectionner "extraire vers le fichier JAR cible". Appuyer sur OK.
  9. Cochez la case "Construire sur marque"
  10. Appuyez sur Appliquer et OK.
  11. Dans le menu principal, sélectionnez la liste déroulante de génération.
  12. Sélectionnez l'option construire des artefacts.
5442490
la source
1
avez-vous manqué quelque chose? Il y a une option sur le module ce qui devrait être cela. Dans mon cas, il crée JAR mais JVM par erreur en raison de la sécurité.
sonus21
je pense que cette liste est tout. Vous pourriez avoir quelque chose avec vos paramètres java l'arrêter en raison de la sécurité. Quelqu'un d'autre a-t-il des réflexions à ce sujet?
user5442490
J'ai suivi la même chose et j'ai une erreur: impossible de trouver ou de charger la classe principale JavaFundamentals.jar lors de l'exécution de ce fichier jar. Expliqué ici: stackoverflow.com/questions/40636790/…
laggerok19
Est-ce que ce processus en 12 étapes doit être suivi à chaque fois que je veux construire un bocal, ou IntelliJ se souviendra-t-il de ces actions pour que vous puissiez en utiliser un raccourci?
Andy
31

Pour ceux qui bénéficient des images comme moi:

File -> Project Structure

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

Crt
la source
4
@samuelowino je n'apprécie pas que vous disiez cela. Expliquez ce qui "ne fonctionne pas du tout".
Crt
1
Hey @Crt Je ne vérifiais pas le bon fichier jar, apparemment, Inteliji a produit deux fichiers jar sur différents répertoires, excuses, ma mauvaise, votre solution fonctionne, merci
samuel owino
15

Voici 2 exemples avec le projet maven, étape par étape:

Méthode 1: construire un pot avec maven et pom.xml

  1. Fichier, nouveau, projet, maven
  2. créer un package, créer un programme java à l'intérieur de ce package entrez la description de l'image ici
  3. sur pom.xml, ajoutez 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>
    

capture d'écran: entrez la description de l'image ici 4. ouvrez la boîte de projet maven en cliquant sur l'icône de recherche et tapez maven, entrez la description de l'image ici

  1. cliquez sur nettoyer, puis cliquez sur installer entrez la description de l'image ici

  2. votre fichier jar apparaîtra dans le dossier cible entrez la description de l'image ici

  3. testez votre pot en utilisant java -jar

entrez la description de l'image ici

Méthode 2: créer un pot avec maven sans modification de pom.xml

  1. Fichier, nouveau, projet, maven
  2. créer un package, créer un programme java à l'intérieur de ce package (comme ci-dessus)
  3. File-> Project Structure-> Project Settings-> Artifacts-> Cliquez sur green plus sign-> Jar->From modules with dependencies

Très important!

Le MANIFEST.MF doit se trouver dans votre dossier de ressources et le Main.Class doit faire référence à {package} - {class-name-that-contains-main-class}

entrez la description de l'image ici entrez la description de l'image ici

  1. puis cliquez sur construire dans le menu, construire des artefacts, construire

entrez la description de l'image ici

  1. trouver le pot dans le dossier out

entrez la description de l'image ici

  1. exécuter :)

entrez la description de l'image ici

rrr
la source
cela marche. Pouvez-vous expliquer pourquoi MANIFEST.MF doit être dans ce répertoire?
Ubeogesh
Cela m'aide
Devendra Singraul
5

Il est probablement un peu tard, mais j'ai réussi à le résoudre de cette façon -> ouvrir avec winrar et supprimer ECLIPSEF.RSA et ECLIPSEF.SF dans le dossier META-INF, en plus mettre "Main-class: main_class_name" (sans ".class" ) dans MANIFEST.MF. Assurez-vous d'avoir appuyé deux fois sur "Entrée" après la dernière ligne, sinon cela ne fonctionnera pas.

Baka
la source
Pour les dépendances signées, veuillez consulter cette réponse: stackoverflow.com/questions/41746177/…
Quel problème fou. Une idée pourquoi cela se produit ou comment y remédier? Cela semble hacky
Andrew No
5

Lorsque j'utilise ces solutions, cette erreur arrive:

java -jar xxxxx.jar

aucun attribut manifeste principal, dans xxxxx.jar

et la solution est :

Vous devez changer le répertoire du manifeste:

<project folder>\src\main\java 

changer java en ressources

<project folder>\src\main\resources
Saeed
la source
Ouf, enfin, merci pour l'astuce!
rendon
@rendon Bonne chance ouf!
Saeed
Parfait!. Cela fonctionne très bien
jafarmlp
2

J'essayais de construire un pot à partir d'une application Kotlin multi-module et j'obtenais l'erreur notoire `` aucun attribut manifeste principal ''. La création du répertoire manifeste dans src/main/resourcesn'a pas fonctionné non plus.

Au lieu de cela, il fonctionne lors de la création en srcdirect: src/META-INF/MANIFEST.MF.

entrez la description de l'image ici

Tobias Uhmann
la source
Salut, merci ça marche bien. Mais maintenant j'ai une nouvelle erreur qui ne trouve pas les ressources "java.desktop / javax.swing.ImageIcon java.lang.NullPointerException"
Shivam Mathur
2

entrez la description de l'image ici

Comme le disent les gens ci-dessus, mais je dois noter un point. Vous devez cocher la case:

Inclure dans la construction du projet

Benchur Wong
la source
1

Idée 8.1.3

Jar est ok, car il y a une sortie compilée dans le répertoire 'output' (project / out / production //)

Je suppose que vous devez exécuter «make» avant de construire le pot

pour les dépendances il suffit de cocher "afficher la bibliothèque" et de choisir ce que vous voulez.

Vugluskr
la source
1

Avec Maven, vous pouvez utiliser ce plugin:

 <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>
fede beron
la source
0

Vous voudrez peut-être jeter un œil à Maven ( http://maven.apache.org ). Vous pouvez l'utiliser soit comme processus de construction principal de votre application, soit simplement pour effectuer certaines tâches via la boîte de dialogue Modifier les configurations. Le processus de création d'un JAR d'un module dans Maven est assez trivial, si vous voulez qu'il inclue toutes les dépendances dans un JAR auto-exécutable qui est également trivial.

Si vous n'avez jamais utilisé Maven auparavant, vous voulez lire Better Builds With Maven .

Gary Rowe
la source
8
Maven est évidemment au-dessus de vos têtes pour des tâches simples comme la création d'un pot. Peut-être Ant mais pas maven à coup sûr.
Juriy
Link is dead (octobre 2014)
KathyA.
1
@KathyA. Merci - mis à jour pour utiliser les recommandations de l'équipe Maven.
Gary Rowe
5
Si c'est si trivial, pourquoi ne pas l'inclure dans votre réponse?
nuzzolilo
1
Parce que je souhaite au lecteur de visiter le site et de commencer le processus d'apprentissage.
Gary Rowe
0

Si vous utilisez des bibliothèques tierces avec votre projet ou si vous rencontrez des problèmes pour créer correctement le fichier MANIFEST.MF, il peut y avoir des conflits lors de l'exécution de fichiers JAR générés à l'aide de

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

méthode mentionnée ci-dessus.

Au lieu de cela, je vous suggère de créer un JAR vide et d'ajouter manuellement tous les autres éléments à la racine de sortie. Un merveilleux article de blog pour cette méthode peut être trouvé ici: http://karthicraghupathi.com/2016/07/10/creating-an-executable-jar-in-intellij-idea/ J'ai essayé les étapes mentionnées ici et tout a bien fonctionné pour moi!

Thilina Ashen Gamage
la source
Merci, cela m'a aidé! Il semble y avoir un bogue dans Intellij où le manifeste du projet est remplacé dans le JAR par un manifeste par défaut si vous sélectionnez "JAR" comme type d'artefact au lieu de "Autre".
rouge
0

Certaines des autres réponses sont inutiles car dès que vous réimportez le projet IntelliJ IDEA à partir du projet maven, toutes les modifications seront perdues.

La construction du bocal doit être déclenchée par une configuration d'exécution / débogage, et non par les paramètres du projet.

Jetbrains a une belle description de la façon dont vous pouvez accomplir cela ici:

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

Faites défiler jusqu'à la section intitulée «Configuration des déclencheurs pour les objectifs Maven».

(Le seul inconvénient de leur description est que leurs captures d'écran sont dans le jeu de couleurs noir sur blanc par défaut au lieu du thème super génial de Darcula. Ugh!)

Donc, en gros, ce que vous faites, c'est que vous ouvrez le panneau "Projets Maven", vous trouvez le projet qui vous intéresse, (dans votre cas, le projet qui construit votre pot), en dessous, vous trouvez l'objectif maven que vous voulez exécuter , (généralement l'objectif "package" crée des fichiers jars), vous ouvrez le menu contextuel sur celui-ci, (cliquez avec le bouton droit sur une machine Windows) et il y aura une option "Exécuter avant d'exécuter / déboguer ..." que vous pouvez sélectionnez et il vous prendra par la main à partir de là. Vraiment facile.

Mike Nakis
la source
0

Dans le cas où vous essayez de construire un pot avec kotlin, vous devez créer un src/main/javadossier et utiliser ce dossier comme emplacement pour le dossier META-INF.

Chris
la source
0

Voici la réponse officielle de l' aide IntelliJ IDEA 2018.3 . J'ai essayé et ça a marché.

Pour construire un fichier JAR à partir d'un module;

  1. Dans le menu principal, choisissez Build | Construisez un artefact.

  2. Dans la liste déroulante, sélectionnez l'artefact souhaité du type JAR. La liste affiche tous les artefacts configurés pour le projet en cours. Pour que tous les artefacts configurés soient créés, choisissez l'option Générer tous les artefacts.

Sabri Meviş
la source
0

Mon problème était le suivant: j'ai utilisé Intellij IDEA (essayé différentes versions) + Gradle. Quand j'ai compilé le projet et construit le pot artifacf, comme indiqué dans les réponses ci-dessus, j'ai reçu une erreur - "aucun manifeste principal attrubute ..."

Cette solution a fonctionné pour moi (merci à Thilina Ashen Gamage (voir ci-dessus) pour un conseil):

Extrait - si vous utilisez des bibliothèques externes et créez un projet via Paramètres du projet - Artefacts - Ajouter (+) - Pot - À partir de modules avec des dépendances , alors probablement en raison d'un bogue de programme, le dossier META-INF avec le fichier MANIFEST_MF ne comprend pas dans le bocal. Pour éviter cela, créez un fichier jar VIDE .

Paramètres du projet - Artefacts - Ajouter (+) - Jar - JAR VIDE . Le dossier META-INF sera ajouté au dossier des ressources . Sélectionnez ensuite votre classe principale. Vous verrez la structure du pot suivante: noter la présence d'un dossier META-INF Notez la présence d'un dossier META-INF Ensuite, vous pouvez construire votre projet et construire des artefacts. Cette solution a également fonctionné pour les applications javaFX.

Orkhan Hasanli
la source
-1

Si vous travaillez sur un projet spring / mvn, vous pouvez utiliser cette commande:

mvn package -DskipTests

Le fichier jar sera enregistré dans le répertoire cible.

Hans Pour
la source
-3

Ant et Maven sont largement utilisés. Je préfère Ant, je pense que c'est plus léger et vous le développeur êtes plus en contrôle. Certains suggèrent que c'est son inconvénient :-)

Brian
la source
3
Cela ne fait rien pour expliquer pourquoi l'erreur se produit.
baordog