Comment exécuter un fichier JAR

207

J'ai créé un fichier JAR comme ceci:

jar cf Predit.jar *.*

J'ai exécuté ce fichier JAR en double-cliquant dessus (cela n'a pas fonctionné). Je l'ai donc exécuté à partir de l'invite DOS comme ceci:

java -jar Predit.jar

Il a déclenché des exceptions "Impossible de charger la classe principale". J'ai donc extrait ce fichier JAR:

jar -xf Predit.jar

et j'ai exécuté le fichier de classe:

java Predit

Cela a bien fonctionné. Je ne sais pas pourquoi le fichier JAR n'a pas fonctionné. Veuillez me dire les étapes pour exécuter le fichier JAR

Martin Prikryl
la source

Réponses:

207

Vous devez spécifier une classe principale dans le manifeste du fichier jar.

Le tutoriel d'Oracle contient une démonstration complète, mais en voici une autre à partir de zéro. Vous avez besoin de deux fichiers:

Test.java:

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("Hello world");
    }
}

manifest.mf:

Manifest-version: 1.0
Main-Class: Test

Notez que le fichier texte doit se terminer par une nouvelle ligne ou un retour chariot. La dernière ligne ne sera pas analysée correctement si elle ne se termine pas par une nouvelle ligne ou un retour chariot.

Exécutez ensuite:

javac Test.java
jar cfm test.jar manifest.mf Test.class
java -jar test.jar

Production:

Hello world
Jon Skeet
la source
1
si la classe Test fait référence à une autre classe via le fichier jar, dans ce cas quelles modifications effectuer?
Anand
@Anand, vous devez alors inclure une ligne de chemin de classe dans votre manifeste et référencer les autres pots. docs.oracle.com/javase/tutorial/deployment/jar/downman.html
vol
Aidez-moi sur cette question: stackoverflow.com/questions/24740803/…
Sajad
Je pense qu'avoir Manifest-version: 1.0 n'est pas nécessaire car le contenu du fichier manifeste donné est ajouté au fichier manifeste par défaut qui a déjà la version docs.oracle.com/javase/tutorial/deployment/jar/appman.html
Georgii Oleinikov
2
Ce n'est qu'un échantillon de bout en bout. Parfait simple et croustillant. Je cherchais quelque chose comme ça depuis des heures. Vous ne savez pas pourquoi tout Internet est plein de déchets sans un exemple aussi simple, lorsque vous recherchez comment créer un java "Hello world". Merci beaucoup.
Atul
58
java -classpath Predit.jar your.package.name.MainClass
Lyncher
la source
Si ce pot utilise d'autres pots, le chemin de classe ne devrait-il pas être comme "/ path / to / jars / *"?
Maxim Chetrusca
5
@Max Chetrusca Oui , mais le séparateur est :utilise *ne fonctionnera pas parce que votre shell va développer comme ceci: "/path/to/jars/a.jar" "/path/to/jars/b.jar"mais ce que vous voulez vraiment est: "/path/to/jars/a.jar:/path/to/jars/b.jar".
Lynch
29

Avant l'exécution, la vérification du bocal Main-Class: classnameest disponible ou non dans le fichier MANIFEST.MF . MANIFEST.MF est présent en pot.

java -jar filename.jar
KARTHIKEYAN.A
la source
16

Vous devez ajouter un manifeste au pot, qui indique au runtime java quelle est la classe principale. Créez un fichier 'Manifest.mf' avec le contenu suivant:

Manifest-Version: 1.0
Main-Class: your.programs.MainClass

Remplacez «your.programs.MainClass» par votre classe principale actuelle. Maintenant, placez le fichier dans le fichier Jar, dans un sous-dossier nommé 'META-INF'. Vous pouvez utiliser n'importe quel utilitaire ZIP pour cela.

Florian Fankhauser
la source
1
Par curiosité, le nom du sous-dossier «Meta-inf» est-il sensible à la casse? Je l'ai traditionnellement vu orthographié 'META-INF'
Adam Paynter
Vous avez raison. La spécification dit "META-INF" et ne dit rien sur l'insensibilité à la casse ( java.sun.com/j2se/1.4.2/docs/guide/jar/… )
Florian Fankhauser
12

Une approche très simple pour créer des fichiers .class, .jar.

Exécution du fichier jar. Pas besoin de trop s'inquiéter du fichier manifeste. Rendez-le simple et élégant.

Exemple de programme Hello World Java

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Compilation du fichier de classe

javac HelloWorld.java

Création du fichier jar

jar cvfe HelloWorld.jar HelloWorld HelloWorld.class

ou

jar cvfe HelloWorld.jar HelloWorld *.class

Exécution du fichier jar

 java -jar HelloWorld.jar

Ou

java -cp HelloWorld.jar HelloWorld
nagendra547
la source
Oui, l' jaroption ede vous permet de spécifier le Main-Class(point d' entrée ) et crée également un fichier manifeste correspondant pour vous. Voir la documentation officielle du pot .
Petr Bodnár
11

Si vous ne souhaitez pas créer un manifeste juste pour exécuter le fichier jar, vous pouvez référencer la classe principale directement à partir de la ligne de commande lorsque vous exécutez le fichier jar.

java -jar Predit.jar -classpath your.package.name.Test

Cela définit la classe principale à exécuter dans le fichier jar.

Egil
la source
2
-classpathvient juste après javaet se débarrasse de -jar(c'est-à-dire que cette réponse est incorrecte)
Pete
4

Java

class Hello{
   public static void main(String [] args){
    System.out.println("Hello Shahid");
   }
}

manifest.mf

Manifest-version: 1.0
Main-Class: Hello

Sur la ligne de commande:

$ jar cfm HelloMss.jar  manifest.mf Hello.class 
$ java -jar HelloMss.jar

Production:

Hello Shahid
Mohammad Shahid Siddiqui
la source
3

Si vous ne souhaitez pas traiter ces détails, vous pouvez également utiliser les assistants d'exportation de jar d'Eclipse ou de NetBeans.

fortran
la source
3

Fichier JAR exécutable Eclipse

Créer un projet Java - RunnableJAR

  • Si des fichiers jar sont utilisés, ajoutez-les au chemin de génération du projet.
  • Sélectionnez la classe ayant main () lors de la création du fichier Jar exécutable. entrez la description de l'image ici

Classe principale

public class RunnableMainClass {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("Name : "+args[0]);
        System.out.println(" ID  : "+args[1]);
    }
}

Exécutez le fichier Jar à l'aide du programme java ( cmd ) en fournissant des arguments et obtenez la sortie et l'affichage dans la console eclipse.

public class RunJar { 
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        String jarfile = "D:\\JarLocation\\myRunnable.jar";
        String name = "Yash";
        String id = "777";

        try { // jarname arguments has to be saperated by spaces
            Process process = Runtime.getRuntime().exec("cmd.exe start /C java -jar "+jarfile+" "+name+" "+id);
                    //.exec("cmd.exe /C start dir java -jar "+jarfile+" "+name+" "+id+" dir");
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream ()));
            String line = null;
            while ((line = br.readLine()) != null){
                sb.append(line).append("\n");
            }
            System.out.println("Console OUTPUT : \n"+sb.toString());
            process.destroy();
        }catch (Exception e){
            System.err.println(e.getMessage());
        }
   }
}

Dans Eclipse pour trouver des raccourcis :

Aide ► Contenu de l'aide ► Guide d'utilisation du développement Java ► Références ► Menus et actions

Yash
la source
3

J'ai cette structure de dossiers:

D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ Main.class D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ press \ OlivePress.class D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Kalamata .classe D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Ligurian.class D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Olive.class

Main.class est dans le paquet com.lynda.olivepress

Il existe deux autres packages:

com.lynda.olivepress.press

com.lynda.olivepress.olive

1) Créez un fichier nommé "Manifest.txt"avec deux lignes, d'abord avec la classe principale et une deuxième ligne vide.

Main-Class: com.lynda.olivepress.Main

D: \ JavaProjects \ OlivePressApp \ Manifest.txt

2) Créer un fichier JAR avec un manifeste et un point d'entrée de classe principale

D: \ JavaProjects \ OlivePressApp>jar cfm OlivePressApp.jar Manifest.txt com/lynda/olivepress/Main.class com/lynda/olivepress/*

3) Exécutez JAR

java -jar OlivePressApp.jar

Remarque: com/lynda/olivepress/*signifie inclure les deux autres packages mentionnés ci-dessus, avant le point 1)

Gabriel D
la source
-2

Pour exécuter le pot, vous devez d'abord créer

pot exécutable

puis

java -jar xyz.jar

la commande fonctionnera

Deepa
la source