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


207

Я создал файл JAR, как это:

jar cf Predit.jar *.*

Я запустил этот JAR-файл, дважды щелкнув по нему (он не работал). Поэтому я запустил его из командной строки DOS следующим образом:

java -jar Predit.jar

Возникли исключения «Не удалось загрузить основной класс». Итак, я извлек этот файл JAR:

jar -xf Predit.jar

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

java Predit

Это сработало хорошо. Я не знаю, почему файл JAR не работал. Подскажите пожалуйста шаги для запуска файла JAR

Ответы:


207

Вам нужно указать Main-Class в манифесте jar-файла.

Оракул учебник содержит полную демонстрацию, но вот еще один с нуля. Вам нужны два файла:

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

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

Затем запустите:

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

Вывод:

Hello world

1
если класс Test ссылается на другой класс через jar-файл, в таком случае, какие изменения нужно сделать?
Ананд

@ И тогда вам нужно включить строку Class-Path в манифест и сослаться на другие банки. 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
Georgii Олейников

2
Это просто сквозной образец. Совершенно простой хрустящий. Я искал что-то подобное часами. Не уверен, почему весь Интернет полон всякой ерунды без такого простого примера, когда искал Как создать java jar "Hello world". Огромное спасибо.
Атул

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

Если этот jar-файл использует другие jar-файлы, не должен ли путь к классу быть похожим на "/ 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

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

java -jar filename.jar

16

Вы должны добавить манифест в jar, который сообщает среде выполнения 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

Ява

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

manifest.mf

Manifest-version: 1.0
Main-Class: Hello

В командной строке:

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

Вывод:

Hello Shahid

3

Если вы не хотите иметь дело с этими деталями, вы также можете использовать помощников по экспорту jar из Eclipse или NetBeans.


3

Eclipse Runnable JAR-файл

Создать проект Java - RunnableJAR

  • Если используются какие-либо jar-файлы , добавьте их в путь сборки проекта.
  • Выберите класс, имеющий main () при создании файла Runnable Jar. введите описание изображения здесь

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

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, чтобы найти Short Cuts :

Справка ► Содержание справки ► Руководство пользователя по разработке 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 \ Каламата .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

Чтобы запустить jar, сначала нужно создать

исполняемая банка

затем

java -jar xyz.jar

команда будет работать

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.