Як запустити файл JAR


207

Я створив такий файл JAR:

jar cf Predit.jar *.*

Я запустив цей файл JAR, двічі клацнувши по ньому (він не працював). Тому я запустив це з підказки DOS так:

java -jar Predit.jar

У ньому виникли винятки "Не вдалося завантажити основний клас". Тому я витяг цей файл JAR:

jar -xf Predit.jar

і я запустив файл класу:

java Predit

Це добре спрацювало. Я не знаю, чому файл JAR не працював. Скажіть, будь ласка, кроки для запуску файлу JAR

Відповіді:


207

Вам потрібно вказати основний клас у маніфесті файлів jar.

Підручник Oracle містить повну демонстрацію, але ось ще одна з нуля. Вам потрібні два файли:

Test.java:

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

маніфест.mf:

Manifest-version: 1.0
Main-Class: Test

Зауважте, що текстовий файл повинен закінчуватися новим рядком або поверненням каретки. Останній рядок не буде проаналізований належним чином, якщо він не закінчується новим рядком або поверненням каретки.

Потім запустіть:

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

Вихід:

Hello world

1
якщо тестовий клас посилається на інший клас через jar-файл, в якому випадку, які модифікації потрібно зробити?
Ананд

@Anand тоді вам потрібно включити рядок Class-Path до свого маніфесту та посилатися на інші jar (и). docs.oracle.com/javase/tutorial/deployment/jar/downman.html
грабувати

Будь ласка , допоможіть мені з цього питання: stackoverflow.com/questions/24740803 / ...
Саяд

Я думаю, що версія Manifest: 1.0 не потрібна, оскільки вміст даного файлу маніфесту додається до файлу маніфесту за замовчуванням, який вже має версію docs.oracle.com/javase/tutorial/deployment/jar/appman.html
Георгій Олійников

2
Це просто зразки до кінця. Ідеальний простий хрусткий хруст. Я шукав щось подібне годинами. Не впевнений, чому весь Інтернет наповнений усіма сміттями без такого простого прикладу, коли шукали як створити java jar "Hello world". Велике спасибі
Атул

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

Якщо ця баночка використовує інші банки, чи не повинен цей шлях бути схожим на "/ path / to / jars / *"?
Максим Четруска

5
@Max Chetrusca Так , але сепаратор з :використанням *не працюватиме , тому що ваша оболонка буде розширюватися це наступним чином : "/path/to/jars/a.jar" "/path/to/jars/b.jar"але то , що ви дійсно хочете: "/path/to/jars/a.jar:/path/to/jars/b.jar".
Лінч

29

Перед запуском банку перевірка Main-Class: classnameдоступна чи ні у файлі MANIFEST.MF . MANIFEST.MF присутній в банку.

java -jar filename.jar

16

Ви повинні додати маніфест до баночки, який вказує на час виконання Java, що таке основний клас. Створіть файл "Manifest.mf" із таким вмістом:

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

Змініть "your.programs.MainClass" на власний основний клас. Тепер помістіть файл у файл Jar, у підпапку з назвою "META-INF". Для цього можна використовувати будь-яку ZIP-програму.


1
З цікавості, чи чутливим є регістр назви підпапки "Meta-inf"? Я традиційно бачив, як це написано "META-INF"
Адам Пейнтер

Ти маєш рацію. Специфікація говорить "META-INF" і нічого не говорить про нечутливість до випадків ( java.sun.com/j2se/1.4.2/docs/guide/jar/… )
Флоріан Фанкхаузер

12

Дуже простий підхід для створення .class, .jar файлу.

Виконання файлу jar. Не потрібно занадто турбуватися про файл маніфесту. Зробити це просто і елегантно.

Зразок програми Java Hello World

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

Складання файлу класу

javac HelloWorld.java

Створення файлу jar

jar cvfe HelloWorld.jar HelloWorld HelloWorld.class

або

jar cvfe HelloWorld.jar HelloWorld *.class

Запуск файлу jar

 java -jar HelloWorld.jar

Або

java -cp HelloWorld.jar HelloWorld

Так, параметр jar's eдозволяє вам вказати Main-Class( вхідну точку ), а також створить відповідний файл маніфесту для вас. Дивіться офіційну документацію для банку .
Петро Боднар

11

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

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

Це встановлює, який основний клас працювати у файлі jar.


2
-classpathприходить одразу після цього javaі позбавляється -jar(тобто ця відповідь невірна)
Піт

4

Java

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

маніфест.mf

Manifest-version: 1.0
Main-Class: Hello

У командному рядку:

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

Вихід:

Hello Shahid

3

Якщо ви не хочете мати справу з цими деталями, ви також можете скористатись помічниками для експорту банку з Eclipse або NetBeans.


3

Файл JAR, який запускається за затемненням

Створення Java-проекту - RunnableJAR

  • Якщо використовуються будь-які файли jar , то додайте їх до шляху збирання проекту.
  • Під час створення файлу Runnable Jar виберіть клас із main (). введіть тут опис зображення

Основний клас

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

Запустіть файл Jar за допомогою програми java ( cmd ), надавши аргументи та отримайте вихід та відображення в консолі 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());
        }
   }
}

У Eclipse, щоб знайти короткі скорочення :

Довідка ► Довідка Зміст ► Посібник користувача для розробки Java ► Довідки ► Меню та дії


3

У мене така структура папок:

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 є в упаковці com.lynda.olivepress

Є ще два пакети:

com.lynda.olivepress.press

com.lynda.olivepress.olive

1) Створіть файл "Manifest.txt"з двома рядками, перший з основного класу та другий порожній рядок.

Main-Class: com.lynda.olivepress.Main

D: \ JavaProjects \ OlivePressApp \ Manifest.txt

2) Створіть JAR за допомогою маніфесту та точки вступу до основного класу

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

3) Запустити JAR

java -jar OlivePressApp.jar

Примітка: com/lynda/olivepress/*означає, що включає два інших упаковки, згадані вище, перед пунктом 1)


-2

Щоб запустити банку, спочатку потрібно створити

виконувана банка

тоді

java -jar xyz.jar

команда спрацює

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