Come eseguire un file JAR


207

Ho creato un file JAR come questo:

jar cf Predit.jar *.*

Ho eseguito questo file JAR facendo doppio clic su di esso (non ha funzionato). Quindi l'ho eseguito dal prompt del DOS in questo modo:

java -jar Predit.jar

Ha sollevato eccezioni "Impossibile caricare la classe principale". Quindi ho estratto questo file JAR:

jar -xf Predit.jar

e ho eseguito il file di classe:

java Predit

Ha funzionato bene Non so perché il file JAR non ha funzionato. Per favore dimmi i passaggi per eseguire il file JAR

Risposte:


207

È necessario specificare una classe principale nel manifest del file jar.

Il tutorial di Oracle contiene una dimostrazione completa, ma eccone un'altra da zero. Hai bisogno di due file:

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

Si noti che il file di testo deve terminare con una nuova riga o ritorno a capo. L'ultima riga non verrà analizzata correttamente se non termina con una nuova riga o ritorno a capo.

Quindi eseguire:

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

Produzione:

Hello world

1
se la classe Test fa riferimento ad un'altra classe tramite il file jar, in tal caso quali modifiche devono essere fatte?
Anand,

@Anand quindi è necessario includere una riga del percorso di classe nel manifest e fare riferimento agli altri jar. docs.oracle.com/javase/tutorial/deployment/jar/downman.html
rob

Please help me su questa questione: stackoverflow.com/questions/24740803/...
Sajad

Penso che avere Manifest-version: 1.0 non sia necessario perché il contenuto del file manifest dato viene aggiunto al file manifest predefinito che ha già la versione docs.oracle.com/javase/tutorial/deployment/jar/appman.html
Georgii Oleinikov,

2
Questo è solo un esempio end-to-end. Perfetto semplice croccante. Stavo cercando qualcosa del genere da ore. Non sono sicuro del motivo per cui l'intera Internet è piena di tutte le cianfrusaglie senza un esempio così semplice, quando viene cercato come creare il vaso java "Hello world". Molte molte grazie.
Atul,

58
java -classpath Predit.jar your.package.name.MainClass

Se questo vaso usa altri vasetti, il classpath non dovrebbe essere come "/ path / to / jars / *"?
Maxim Chetrusca,

5
@Max Chetrusca Sì, ma il separatore viene :utilizzato *non funzionerà perché la shell si espanderà in questo modo: "/path/to/jars/a.jar" "/path/to/jars/b.jar"ma che cosa si vuole veramente è: "/path/to/jars/a.jar:/path/to/jars/b.jar".
Lynch,

29

Prima di eseguire il controllo jar Main-Class: classnameè disponibile o meno nel file MANIFEST.MF . MANIFEST.MF è presente in vaso.

java -jar filename.jar

16

Devi aggiungere un manifest al jar, che dice al runtime java quale sia la classe principale. Creare un file "Manifest.mf" con il seguente contenuto:

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

Cambia 'your.programs.MainClass' nella tua attuale classe principale. Ora metti il ​​file nel file Jar, in una sottocartella chiamata 'META-INF'. È possibile utilizzare qualsiasi utilità ZIP per questo.


1
Per curiosità, la sottocartella "Meta-inf" è sensibile al maiuscolo / minuscolo? Tradizionalmente l'ho visto scritto "META-INF"
Adam Paynter il

Hai ragione. La specifica dice "META-INF" e non dice nulla sull'insensibilità ai casi ( java.sun.com/j2se/1.4.2/docs/guide/jar/… )
Florian Fankhauser

12

Un approccio molto semplice per creare file .class, .jar.

Esecuzione del file jar. Non c'è bisogno di preoccuparsi troppo del file manifest. Rendilo semplice ed elegante.

Programma Java Hello World di esempio

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

Compilare il file di classe

javac HelloWorld.java

Creazione del file jar

jar cvfe HelloWorld.jar HelloWorld HelloWorld.class

o

jar cvfe HelloWorld.jar HelloWorld *.class

Esecuzione del file jar

 java -jar HelloWorld.jar

O

java -cp HelloWorld.jar HelloWorld

Sì, il jar 'opzione eti consente di specificare Main-Class( entrypoint ) e crea anche un file manifest corrispondente per te. Vedi la documentazione ufficiale per jar .
Petr Bodnár,

11

Se non si desidera creare un manifest solo per eseguire il file jar, è possibile fare riferimento alla classe principale direttamente dalla riga di comando quando si esegue il file jar.

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

Questo imposta la classe principale da eseguire nel file jar.


2
-classpathviene subito dopo javae sbarazzarsi di -jar(cioè questa risposta non è corretta)
Pete

4

Giava

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

manifest.mf

Manifest-version: 1.0
Main-Class: Hello

Sulla riga di comando:

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

Produzione:

Hello Shahid

3

Se non si desidera gestire tali dettagli, è anche possibile utilizzare gli assistenti jar di esportazione da Eclipse o NetBeans.


3

File JAR eseguibile Eclipse

Crea un progetto Java - RunnableJAR

  • Se ci sono file jar vengono utilizzati aggiungerli al percorso di creazione del progetto.
  • Seleziona la classe con main () durante la creazione del file Jar eseguibile. inserisci qui la descrizione dell'immagine

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]);
    }
}

Esegui il file Jar usando il programma Java ( cmd ) fornendo argomenti e ottieni l'output e la visualizzazione nella console di 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());
        }
   }
}

In Eclipse per trovare scorciatoie :

Guida ► Sommario della guida ► Manuale dell'utente per lo sviluppo Java ► Riferimenti ► Menu e azioni


3

Ho questa struttura di cartelle:

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

Main.class è nel pacchetto com.lynda.olivepress

Esistono altri due pacchetti:

com.lynda.olivepress.press

com.lynda.olivepress.olive

1) Creare un file denominato "Manifest.txt"con due righe, prima con la classe principale e una seconda riga vuota.

Main-Class: com.lynda.olivepress.Main

D: \ \ JavaProjects OlivePressApp \ Manifest.txt

2) Creare un JAR con Manifest e punto di ingresso della classe principale

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

3) Eseguire JAR

java -jar OlivePressApp.jar

Nota: com/lynda/olivepress/*significa includere gli altri due pacchetti sopra menzionati, prima del punto 1)


-2

Per eseguire jar, devi prima creare

vaso eseguibile

poi

java -jar xyz.jar

il comando funzionerà

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.