Jak uruchomić plik JAR

207

Utworzyłem plik JAR taki jak ten:

jar cf Predit.jar *.*

Uruchomiłem ten plik JAR, klikając go dwukrotnie (nie działał). Uruchomiłem to z wiersza poleceń DOS w następujący sposób:

java -jar Predit.jar

Podniósł wyjątki „Nie udało się załadować klasy głównej”. Więc wyodrębniłem ten plik JAR:

jar -xf Predit.jar

i uruchomiłem plik klasy:

java Predit

Działa dobrze. Nie wiem, dlaczego plik JAR nie działał. Proszę, powiedz mi, jak uruchomić plik JAR

Martin Prikryl
źródło

Odpowiedzi:

207

Musisz podać klasę główną w manifeście pliku jar.

Samouczek Oracle zawiera pełną demonstrację, ale oto kolejny od zera. Potrzebujesz dwóch plików:

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

Pamiętaj, że plik tekstowy musi kończyć się nową linią lub znakiem powrotu karetki. Ostatnia linia nie zostanie poprawnie przeanalizowana, jeśli nie zakończy się nową linią lub znakiem powrotu karetki.

Następnie uruchomić:

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

Wynik:

Hello world
Jon Skeet
źródło
1
jeśli klasa testowa odwołuje się do innej klasy za pomocą pliku jar, w takim przypadku jakie modyfikacje należy wykonać?
Anand
@A następnie musisz dołączyć linię manifestu do swojego manifestu i odwoływać się do innych jarów. docs.oracle.com/javase/tutorial/deployment/jar/downman.html
rob
Proszę,
pomóżcie
Myślę, że posiadanie wersji manifestu: 1.0 nie jest konieczne, ponieważ zawartość podanego pliku manifestu jest dołączana do domyślnego pliku manifestu, który ma już wersję docs.oracle.com/javase/tutorial/deployment/jar/appman.html
Georgii Oleinikov
2
To jest tylko kompletna próbka. Idealny prosty chips. Szukałem czegoś takiego przez wiele godzin. Nie jestem pewien, dlaczego cały Internet jest pełen śmieci, bez tak prostego przykładu, gdy szukano Jak utworzyć słoik java „Hello world”. Wielkie dzięki.
Atul
58
java -classpath Predit.jar your.package.name.MainClass
Zlinczować
źródło
Jeśli ten słoik używa innych słoików, czy ścieżka klasy nie powinna być taka jak „/ path / to / jars / *”?
Maxim Chetrusca
5
@Max Chetrusca Tak ale separator :użyciu *nie będzie działać, ponieważ shell rozwinie to tak: "/path/to/jars/a.jar" "/path/to/jars/b.jar"ale co naprawdę chcesz to: "/path/to/jars/a.jar:/path/to/jars/b.jar".
Lynch,
29

Przed uruchomieniem sprawdzanie jar Main-Class: classnamejest dostępne lub nie w pliku MANIFEST.MF . MANIFEST.MF jest obecny w słoiku.

java -jar filename.jar
KARTHIKEYAN.A
źródło
16

Musisz dodać manifest do słoika, który informuje środowisko wykonawcze Java, jaka jest główna klasa. Utwórz plik „Manifest.mf” o następującej treści:

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

Zmień „your.programs.MainClass” na rzeczywistą klasę główną. Teraz umieść plik w pliku Jar w podfolderze o nazwie „META-INF”. Możesz do tego użyć dowolnego narzędzia ZIP.

Florian Fankhauser
źródło
1
Ciekawe, czy w nazwie podfolderu „Meta-inf” rozróżniana jest wielkość liter? Tradycyjnie widziałem, że napisano „META-INF”
Adam Paynter,
Masz rację. Specyfikacja mówi „META-INF” i nie mówi nic o rozróżnianiu wielkości liter ( java.sun.com/j2se/1.4.2/docs/guide/jar/… )
Florian Fankhauser,
12

Bardzo proste podejście do tworzenia pliku .class, .jar.

Wykonywanie pliku jar. Nie musisz się zbytnio przejmować plikiem manifestu. Uczyń to prostym i eleganckim.

Przykładowy program Hello World programu Java

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

Kompilowanie pliku klasy

javac HelloWorld.java

Tworzenie pliku jar

jar cvfe HelloWorld.jar HelloWorld HelloWorld.class

lub

jar cvfe HelloWorld.jar HelloWorld *.class

Uruchamianie pliku jar

 java -jar HelloWorld.jar

Lub

java -cp HelloWorld.jar HelloWorld
nagendra547
źródło
Tak, jaropcja epozwala ci określić Main-Class( punkt wejścia ), a także tworzy dla ciebie odpowiedni plik manifestu. Zobacz oficjalną dokumentację słoika .
Petr Bodnár,
11

Jeśli nie chcesz tworzyć manifestu tylko w celu uruchomienia pliku jar, możesz odwoływać się do klasy głównej bezpośrednio z wiersza poleceń podczas uruchamiania pliku jar.

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

Ustawia to, która klasa główna ma działać w pliku jar.

Egil
źródło
2
-classpathprzychodzi zaraz javai się go pozbywa -jar(tj. ta odpowiedź jest niepoprawna)
Pete,
4

Jawa

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

manifest.mf

Manifest-version: 1.0
Main-Class: Hello

W wierszu poleceń:

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

Wynik:

Hello Shahid
Mohammad Shahid Siddiqui
źródło
3

Jeśli nie chcesz zajmować się tymi szczegółami, możesz także skorzystać z asystentów eksportu jar z Eclipse lub NetBeans.

fortran
źródło
3

Plik JAR środowiska Eclipse

Utwórz projekt Java - RunnableJAR

  • Jeśli używane są pliki jar, dodaj je do ścieżki kompilacji projektu.
  • Wybierz klasę posiadającą main () podczas tworzenia pliku Runnable Jar. wprowadź opis zdjęcia tutaj

Główna klasa

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

Uruchom plik Jar za pomocą programu Java ( cmd ), podając argumenty, a następnie uzyskaj dane wyjściowe i wyświetlanie w konsoli 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());
        }
   }
}

W Eclipse, aby znaleźć skróty :

Pomoc ► Treść pomocy ► Podręcznik użytkownika programowania Java ► Odnośniki ► Menu i działania

Yash
źródło
3

Mam tę strukturę folderów:

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 .class D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Ligurian.class D: \ JavaProjects \ OlivePressApp \ com \ lynda \ olivepress \ olives \ Olive.class

Main.class jest w paczce com.lynda.olivepress

Istnieją dwa inne pakiety:

com.lynda.olivepress.press

com.lynda.olivepress.olive

1) Utwórz plik o nazwie "Manifest.txt"Dwie linie, Pierwsza z klasą główną i Druga pusta linia.

Main-Class: com.lynda.olivepress.Main

D: \ JavaProjects \ OlivePressApp \ Manifest.txt

2) Utwórz JAR z manifestem i punktem wejścia do klasy głównej

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

3) Uruchom JAR

java -jar OlivePressApp.jar

Uwaga: com/lynda/olivepress/*oznacza uwzględnienie dwóch pozostałych pakietów wymienionych powyżej, przed punktem 1)

Gabriel D.
źródło
-2

Aby uruchomić słoik, najpierw musisz utworzyć

słoik wykonywalny

następnie

java -jar xyz.jar

polecenie zadziała

Deepa
źródło