Как запустить файл jar на виндовс 10. Работа с Java в командной строке

Жаропонижающие средства для детей назначаются педиатром. Но бывают ситуации неотложной помощи при лихорадке, когда ребенку нужно дать лекарство немедленно. Тогда родители берут на себя ответственность и применяют жаропонижающие препараты. Что разрешено давать детям грудного возраста? Чем можно сбить температуру у детей постарше? Какие лекарства самые безопасные?

Многие начинающие программисты сталкиваются с таким вопросом: "Я создал свое приложение в среде IDE, как теперь заставить его работать из командной строки вне среды IDE?". Может возникнуть и такой вопрос: "Как мне распространить это приложение среди других пользователей, не передавая им заодно всю среду IDE?".

Ответы на эти вопросы относительно просты, но не всегда очевидны. В данном документе даны ответы на них путем демонстрации основ использования среды IDE для подготовки приложений к распространению и развертыванию. Кроме того, в данном документе предоставлены сведения, которые могут быть необходимы для настройки системы программиста (или которые нужно будет передать пользователям приложения). Мы покажем несколько различных подходов к развертыванию приложения, позволяющих пользователям получать доступ к нему посредством:

  • Двойного щелчка файла архива Java (JAR) приложения.
  • Вызова приложения из командной строки.
  • Вызова приложения из файла сценария.
  • Использования Java Web Start.

Для работы с этим учебным курсом требуются программное обеспечение и материалы, перечисленные в таблице ниже.

Создание исполняемого файла JAR

В данной части учебного курса показано, как можно создать предназначенное для распространения приложение в среде IDE и затем запустить это приложение вне среды IDE. Мы пакетируем это приложение в исполняемый файл JAR .

Файл JAR - это файл архива, в который могут быть вложены файлы и папки. Файлы JAR подобны файлам ZIP, но файлы JAR могут иметь дополнительные атрибуты, полезные при распространении приложений Java. В число этих атрибутов входят цифровая подпись файлов JAR, дополнительное сжатие, совместимость с различными платформами и т. д.

В этом упражнении мы создаем проект среды IDE и затем помещаем в этот проект два заранее написанных файла исходного кода Java. Затем мы скомпилируем классы и создадим исполняемый файл JAR. После этого мы посмотрим, как запускать файлы JAR вне среды IDE.

Классы, используемые в данном руководстве, реализуют функции служебной программы GNU grep , которую можно использовать для поиска текста или шаблонов регулярных выражений в текстовых файлах. Данный проект содержит как версию приложения для командной строки, так и версию, использующую графический интерфейс, что позволит взглянуть на различные способы запуска приложения.

Создание проекта с помощью существующих файлов исходного кода

  1. Распространение приложения другим пользователям

    Теперь, когда подтверждено, что приложение работает вне среды IDE, можно перейти к его распространению.

    Примечание. Если работа приложения зависит от дополнительных библиотек, помимо включенных в JDK, необходимо включить их в распространение (не относится к этому примеру). Относительные пути к этим библиотекам добавляются в запись classpath файла манифеста JAR при разработке приложения в среде IDE. Если эти дополнительные библиотеки не будут найдены по указанному пути класса (т.е. относительному пути) при запуске, приложение не запустится.
    Создайте архив ZIP, содержащий файл JAR и библиотеку, после чего отправьте этот файл ZIP пользователям. Проинструктируйте пользователей распаковать этот архив ZIP так, чтобы файл JAR и файлы JAR библиотек были в одной папке. Запустите файл JAR приложения.

    Запуск приложения Java

    Цель этого упражнения состоит в демонстрации некоторых из способов запуска приложения из командной строки.

    В данном упражнении показано, как можно запустить приложение Java следующими двумя способами:

    • Выполнение команды java из командной строки.
    • Использование сценария для вызова класса в файле JAR.

    Запуск приложений из командной строки

    Приложение можно запустить из командной строки, используя команду java . Если нужно выполнить исполняемый файл JAR, используйте параметр -jar команды.

    Например, для запуска приложения AnotherGrep надо выполнить следующие действия:

    1. Открыть окно терминала. На системах Microsoft Windows это делается путем нажатия кнопки "Пуск" и выбора "Выполнить...", ввода cmd в поле "Открыть:" и нажатия кнопки "OК".
    2. Перейдите в каталог PROJECT_HOME /dist (используя команду cd).
    3. Введите следующую строку для запуска главного класса приложения: java -jar AnotherGrep.jar

    Если эти инструкции выполнены, а приложение не запускается, вероятно, следует выполнить одно из следующих действий:

    Запуск приложений из сценария

    Если приложение, которое необходимо распространить, является консольным приложением, может оказаться, что его удобнее запускать из сценария, особенно если для запуска приложения требуются длинные и сложные аргументы. В этом разделе мы используем консольную версию Grep, в которой необходимо передать аргументы (шаблон поиска и список файлов) файлу JAR, вызываемому в нашем сценарии. Для сокращения объема, вводимого в командную строку, мы используем простой сценарий, подходящий для запуска тестового приложения.

    В первую очередь необходимо изменить главный класс в приложении на консольную версию класса и построить файл JAR заново:

    1. В окне "Проекты" в IDE щелкните правой кнопкой мыши узел проекта (AnotherGrep) и выберите "Свойства".
    2. Выберите узел Run ("Запуск") и измените свойство Main Class ("Главный класс") на anothergrep.Grep (с anothergrep.xGrep). Нажмите кнопку "ОК", чтобы закрыть окно Project Properties ("Свойства проекта").
    3. Снова щелкните правой кнопкой мыши узел проекта и выберите Clean and Build Project ("Очистка и сборка проекта").

    По завершении этих действий файл JAR будет собран заново, а атрибут Main-Class в манифесте файла JAR будет указывать на anothergrep.Grep .

    Сценарий bash - для компьютеров под управлением UNIX и Linux

    В папке, куда было извлечено содержимое файла , можно найти сценарий bash с именем grep.sh . Давайте посмотрим на него:

    #!/bin/bash java -jar dist/AnotherGrep.jar [email protected]

    Первая строка указывает, какой интерпретатор команд следует использовать для интерпретации этого сценария. Вторая исполняет файл JAR, созданный средой IDE в папке PROJECT_HOME /dist . [email protected] просто копирует все переданные сценарию аргументы, заключая каждый в кавычки.

    Данный сценарий подразумевает, что двоичные файлы Java являются частью переменной среды PATH. Если данный сценарий не работает на вашем компьютере, см. .

    Дополнительные сведения о написании сценариев для интерпретатора bash можно найти .

    Сценарий.bat для компьютеров Windows

    На компьютерах Microsoft Windows пакетным файлам можно одновременно передавать не более девяти аргументов. При наличии более девяти аргументов файл JAR будет необходимо исполнить несколько раз.

    Сценарий для этого может выглядеть следующим образом:

    @echo off set jarpath="dist/AnotherGrep.jar" set pattern="%1" shift:loop if "%1" == "" goto:allprocessed set files=%1 %2 %3 %4 %5 %6 %7 %8 %9 java -jar %jarpath% %pattern% %files% for %%i in (0 1 2 3 4 5 6 7 8) do shift goto:loop:allprocessed

    Данный сценарий можно найти под названием grep.bat в папке, куда было извлечено содержимое архива , если необходимо увидеть его в действии.

    Девять аргументов представлены внутри пакетного файла как % , где должен иметь значение в пределах <0-9> . %0 зарезервировано для имени сценария.

    Можно увидеть, что за раз (в одном цикле) программе передаются только девять аргументов. Оператор for просто смещает аргументы на девять, чтобы подготовить их к следующему циклу. Цикл завершается по обнаружении пустого аргумента файла оператором if (это указывает на отсутствие новых файлов для обработки).

    Дополнительные сведения о пакетных сценариях можно найти на .

    Пакетирование приложения для Java Web Start

    Java Web Start представляет собой технологию, используемую для запуска приложений Java из веб-браузера одним щелчком мыши. Подробные сведения об упаковке приложений для развертывания с помощью Java Web Start см. в разделе Включение Java Web Start в IDE NetBeans . Здесь мы приводим только краткое описание действий, необходимых, чтобы сделать приложение развертываемым с помощью Java Web Start.

    1. Щелкните правой кнопкой мыши узел проекта в окне Projects ("Проекты") и выберите Properties ("Свойства").
    2. На вкладке Web Start окна Project Properties ("Свойства проекта") установите флажок Enable Web Start ("Активировать Web Start").
    3. Выберите Local Execution ("Локальное исполнение") из раскрывающегося списка Codebase ("Кодовая база"), поскольку мы будем тестировать только локальное исполнение.
      Сохраните все прочие параметры по умолчанию и нажмите кнопку "OК".
    4. Щелкните правой кнопкой мыши узел проекта и выберите Clean and Build Project ("Очистка и сборка проекта").
      Данная команда среды IDE удалит все ранее скомпилированные файлы и результаты сборок, скомпилирует приложение заново и соберет проект с новыми параметрами.
    5. Вне среды IDE откройте папку PROJECT_HOME /dist , после чего откройте файл launch.html в своем браузере.
      Появится тестовая страница HTML с кнопкой Launch ("Запуск").
    6. Нажмите кнопку Launch, чтобы открыть приложение.
      Можно будет увидеть, что Java загружена и приложение запускается.

      Примечание. Некоторые браузеры сначала перенаправляют пользователей на страницу загрузок Java.

    Указание сопоставлений файлов JAR

    На большинстве компьютеров исполняемый файл JAR можно исполнить, просто дважды щелкнув его. Если при двойном щелчке файла JAR ничего не происходит, это может быть вызвано одной из двух следующих причин:

    • Тип файлов JAR не сопоставлен со средой выполнения Java (JRE) на этом компьютере.

      Если тип файлов JAR сопоставлен с JRE, значок, представляющий этот файл, должен включать логотип Java.

    • Тип файлов JAR сопоставлен JRE, но параметр -jar не входит в команду, передаваемую JRE при двойном щелчке значка.

    Примечание. Иногда связи файлов JAR переключаются установленным ПО, например, программным обеспечением для обработки файлов в формате zip.

    Способ, которым тип файлов JAR можно привязать к средству запуска java , зависит от операционной системы.

    Убедитесь, что на вашем компьютере установлена одна из версий JRE. Следует использовать версию 1.4.2 или более поздние. Приложения Java нельзя запускать на компьютерах, где не установлена платформа Java. (В случае установки комплекта для разработчика на языке Java (JDK) с ним устанавливается и JRE. Однако если программа распространяется не только среди программистов, у пользователей может не быть JRE или JDK.)

    • На Windows XP установленную версию Java можно проверить выбрав "Пуск" > "Панель управления" > ("Установка и удаление программ") (там должна быть указана, например, Java(TM) 6 Update 33).
    • На Windows Vista или 7 установленную версию Java можно проверить выбрав "Пуск" > "Панель управления" > ("Программы и компоненты") (там должна быть указана, например, Java(TM) 6 Update 33).

    Если на компьютере отсутствует платформа Java, JRE можно загрузить с сайта загрузок Java SE .

    Если же она уже имеется на компьютере, но сопоставление файлов не работает, выполните действия для добавления связи файла JAR в Microsoft Windows:

    1. Выберите "Пуск" > "Панель управления".
    2. (Применимо только к Windows Vista). Щелкните "Панель управления" > "Программы".

    3. Для Windows Vista или 7 щелкните "Программы по умолчанию" и выберите "Связать тип файла или протокол с программой".
    4. (В Windows XP в разделе "Сведения" диалогового окна щелкните "Изменить программу").
    5. В диалоговом окне "Выбор программы" выберите Java Platform SE Binary.
    6. Нажмите кнопку "OК" для выхода из диалогового окна "Выбор программы".
    7. Нажмите кнопку "Закрыть", чтобы закрыть диалоговое окно "Свойства папки" (в Windows XP) или диалогового окна связывания типа файла или протокола с конкретными программами (в Windows 7).

    Примечание. Если файлы JAR files связаны с Java Platform SE Binary в системе, но двойной щелчок все равно не запускает файл JAR, может потребовать указание параметра -jar в связи файлов.

    Чтобы указать параметр -jar в сопоставлении файла на Microsoft Windows XP, выполните следующие действия.

    1. Выберите "Пуск" > "Панель управления".
    2. В Windows XP дважды щелкните "Свойства папки" и выберите вкладку "Типы файлов".
    3. В списке "Зарегистрированные типы файлов" выберите файл JAR.
    4. В разделе "Сведения" диалогового окна щелкните "Дополнительно".
    5. В диалоговом окне "Изменение свойств типа файлов" щелкните "Изменить...".
    6. В текстовом поле "Приложение, исполняющее действие" добавьте следующую строку в конце пути к JRE: -jar "%1" %* После этого поле должно содержать текст, подобный следующему: "C:\Program Files\Java\jre1.6.0_33\bin\javaw.exe" -jar "%1" %*
    7. Нажмите кнопку "OК" для выхода из диалогового окна "Изменение действия для типа".
    8. Нажмите кнопку "OК" для выхода из диалогового окна "Изменение свойств типа файлов".
    9. Нажмите кнопку "Закрыть" для выхода из диалогового окна "Свойства папки".

    Примечание. Начиная с Windows Vista расширенные связи файлов можно настроить с помощью RegEdit. Дополнительные сведения см. в статье Что произошло с диалоговым окном типов файлов? .

    Для систем UNIX и Linux процедура изменения сопоставлений файлов зависит от того, какая рабочая среда (вроде GNOME или KDE) используется. Загляните в параметры своей рабочей среды или ознакомьтесь с документацией по рабочей среде.

    Установка переменной среды PATH

    Если на компьютере невозможно запустить класс Java или файл JAR без указания на местоположение JDK или JRE, возможно, следует изменить значение переменной среды PATH системы.

    При работе в системе Microsoft Windows процедура установки переменной PATH зависит от используемой версии Windows.

    Ниже приведены этапы установки переменной PATH на системе Windows XP:

    1. Выберите "Пуск" > "Панель управления" и дважды щелкните "Система".
    2. В диалоговом окне "Свойства системы" выберите вкладку "Дополнительно".
    3. Щелкните вкладку "Переменные среды".
    4. В списке переменных среды пользователя выберите PATH и нажмите кнопку "Изменить".
    5. Добавьте местоположение JRE к концу списка путей. Местоположения в списке разделены точками с запятой (;).
      Например, если JRE распложен в C:\Program Files\Java\jdk1.6.0_23 необходимо добавить следующее к концу переменной PATH: C:\Program Files\Java\jdk1.6.0_23\bin
    6. Нажмите кнопку "OК" для выхода из диалогового окна "Переменные среды", затем нажмите кнопку "ОК" для выхода из диалогового окна "Свойства системы".

    При работе в операционной системе UNIX или Linux способ изменения переменной среды PATH зависит от используемой программы интерпретатора команд. Ознакомьтесь с документацией по интерпретатору команд для получения дополнительных сведений.

    Что дальше?

    Дополнительные сведения о работе с IDE NetBeans см. на на веб-сайте NetBeans.

    Дополнительные сведения о разработке приложений Java в среде IDE, включая управление путем к классам, доступны в документе

Сейчас уже никто не создает программы в консоли. Используя любимую IDE, разработчик чувствует себя неуютно за чужим компьютером, где её нет.
Решив разобраться в работе Ant и Maven, я поймал себя на том, что не смогу собрать приложение без них в консоли.
В данной статье я постарался уместить все этапы проектирования демонстрационного приложения, чтобы не искать справку по каждой команде на просторах Интернета.

От простого к...

Каждая программа обычно содержится в отдельном каталоге. Я придерживаюсь правила создавать в этом каталоге по крайней мере две папки: src и bin. В первой содержатся исходные коды, во второй — результат компиляции. В данных папках будет структура каталогов, зависящая от пакетов.

Один файл

Можно сделать и без лишних папок.
Берем сам файл.
01 02 03 04 05 06 07 08 09 public class HelloWorld { public static void main(String args) { System.out.println("Hello World!"); Calculator calc=new Calculator(); System.out.println("2+2="+calc.sum(2,2)); } }
Переходим в каталог, где лежит данный файл, и выполняем команды.
javac HelloWorld.java В данной папке появится файл HelloWorld.class. Значит программа скомпилирована. Чтобы запустить
java -classpath . HelloWorld

Отделяем бинарные файлы от исходников

Теперь сделаем тоже самое, но с каталогами. Создадим каталог HelloWorld и в нем две папки src и bin.
Компилируем
javac -d bin src/HelloWorld.java Здесь мы указали, что бинарные файлы будут сохраняться в отдельную папку bin и не путаться с исходниками.

Запускаем
java -classpath ./bin HelloWorld

Используем пакеты

А то, вдруг, программа перестанет быть просто HelloWorld-ом. Пакетам лучше давать понятное и уникальное имя. Это позволит добавить данную программу в другой проект без конфликта имен. Прочитав некоторые статьи, можно подумать, что для имени пакета обязательно нужен домен. Это не так. Домены — это удобный способ добиться уникальности. Если своего домена нет, воспользуйтесь аккаунтом на сайте (например, ru.habrahabr.mylogin). Он будет уникальным. Учтите, что имена пакетов должны быть в нижнем регистре. И избегайте использования спецсимволов. Проблемы возникают из-за разных платформ и файловых систем.

Поместим наш класс в пакет с именем com.qwertovsky.helloworld. Для этого добавим в начало файла строчку
package com.qwertovsky.helloworld; В каталоге src создадим дополнительные каталоги, чтобы путь к файлу выглядел так: src/com/qwertovsky/helloworld/HelloWorld.java.
Компилируем
javac -d bin src/com/qwertovsky/helloworld/HelloWorld.java В каталоге bin автоматически создастся структура каталогов как и в src.
HelloWorld "---bin " "---com " "---qwertovsky " "---helloworld " "---HelloWorld.class "---src "---com "---qwertovsky "---helloworld "---HelloWorld.java Запускаем
java -classpath ./bin com.qwertovsky.helloworld.HelloWorld

Если в программе несколько файлов

Изменим программу. Не обращайте внимание на логику. Её нет.
HelloWorld.java
01 02 03 04 05 06 07 08 09 10 11 12 13 package com.qwertovsky.helloworld; public class HelloWorld { public static void main(String args) { int a=2; int b=3; Calculator calc=new Calculator(); System.out.println("Hello World!"); System.out.println(a+"+"+b+"="+calc.sum(a,b)); } }
Calculator.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 package com.qwertovsky.helloworld; import com.qwertovsky.helloworld.operation.Adder; public class Calculator { public int sum(int... a) { Adder adder=new Adder(); for(int i:a) { adder.add(i); } return adder.getSum(); } }
Adder.java
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package com.qwertovsky.helloworld.operation; public class Adder { private int sum; public Adder() { sum=0; } public Adder(int a) { this.sum=a; } public void add(int b) { sum+=b; } public int getSum() { return sum; } }
Компилируем
javac -d bin src/com/qwertovsky/helloworld/HelloWorld.java src\com\qwertovsky\helloworld\HelloWorld.java:9: cannot find symbol symbol: class Calculator location: class com.qwertovsky.helloworld.HelloWorld Calculator calc=new Calculator(); ^ src\com\qwertovsky\helloworld\HelloWorld.java:9: cannot find symbol symbol: class Calculator location: class com.qwertovsky.helloworld.HelloWorld Calculator calc=new Calculator(); ^ 2 errors Ошибка возникла из-за того, что для компиляции нужны файлы с исходными кодами классов, которые используются (класс Calculator). Надо указать компилятору каталог с файлами с помощью ключа -sourcepath.
Компилируем
javac -sourcepath ./src -d bin src/com/qwertovsky/helloworld/HelloWorld.java Запускаем
java -classpath ./bin com.qwertovsky.helloworld.HelloWorld Hello Word 2+3=5

Если удивляет результат

Есть возможность запустить отладчик. Для этого существует jdb.
Сначала компилируем с ключом -g, чтобы у отладчика была информация.
javac -g -sourcepath ./src -d bin src/com/qwertovsky/helloworld/HelloWorld.java Запускаем отладчик
jdb -classpath bin -sourcepath src com.qwertovsky.helloworld.HelloWorld Initializing jdb ... > Отладчик запускает свой внутренний терминал для ввода команд. Справку по последним можно вывести с помощью команды help.
Указываем точку прерывания на 9 строке в классе Calculator
> stop at com.qwertovsky.helloworld.Calculator:9 Deferring breakpoint com.qwertovsky.helloworld.Calculator:9. It will be set after the class is loaded. Запускаем на выполнение.
> run run com.qwertovsky.helloworld.HelloWorld Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable > VM Started: Set deferred breakpoint com.qwertovsky.helloworld.Calculator:9 Hello World! Breakpoint hit: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=9 bci=0 9 Adder adder=new Adder(); Чтобы соориентироваться можно вывести кусок исходного кода, где в данный момент находится курссор.
main list 5 public class Calculator 6 { 7 public int sum(int... a) 8 { 9 => Adder adder=new Adder(); 10 for(int i:a) 11 { 12 adder.add(i); 13 } 14 return adder.getSum(); Узнаем, что из себя представляет переменная а.
main print a a = instance of int (id=340) main dump a a = { 2, 3 } main stop at com.qwertovsky.helloworld.operation.Adder:19 Deferring breakpoint com.qwertovsky.helloworld.operation.Adder:19. It will be set after the class is loaded. Продолжим исполнение.
main cont > Set deferred breakpoint com.qwertovsky.helloworld.operation.Adder:19 Breakpoint hit: "thread=main", com.qwertovsky.helloworld.operation.Adder.add(), line=19 bci=0 19 sum+=b; main list 15 } 16 17 public void add(int b) 18 { 19 => sum+=b; 20 } 21 22 public int getSum() 23 { 24 return sum; main print sum sum = 0 main print b b = 2 Выполним код в текущей строке и увидим, что sum стала равняться 2.
main step > Step completed: "thread=main", com.qwertovsky.helloworld.operation.Adder.add(), line=20 bci=10 20 } main print sum sum = 2 Поднимемся из класса Adder в вызвавший его класс Calculator.
main step up > Step completed: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=10 bci=36 10 for(int i:a) Удаляем точку прерывания
main clear com.qwertovsky.helloworld.operation.Adder:19 Removed: breakpoint com.qwertovsky.helloworld.operation.Adder:19 main step > Step completed: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=12 bci=30 12 adder.add(i); Можно избежать захода в методы, используя команду next.
main next > Step completed: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=10 bci=36 10 for(int i:a) main next > Step completed: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=14 bci=42 14 return adder.getSum(); Проверяем значение выражения и завершаем выполнение.
main eval adder.getSum() adder.getSum() = 5 main cont > 2+3=5 The application exited

Хорошо бы протестировать

Используем JUnit.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 package com.qwertovsky.helloworld; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Collection; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized.Parameters; @RunWith(value=org.junit.runners.Parameterized.class) public class TestCalculator { int expected; int arg; @Parameters public static Collection parameters() { return Arrays.asList(new int{ {{4}, {2, 2}} ,{{-1},{4, -5}} ,{{0},{0,0,0}} ,{{0},{}} }); } public TestCalculator(int expected, int arg) { this.expected=expected; this.arg=arg; } @Test public void testSum() { Calculator c=new Calculator(); assertEquals(expected,c.sum(arg)); } }
Компилируем
mkdir test_bin javac -classpath lib/path/junit-4.8.2.jar -sourcepath ./src -d test_bin test/com/qwertovsky/helloworld/TestCalculator.java Запускаем. В качестве разделителя нескольких путей в classpath в Windows используется ";", в Linux — ":". В консоли Cygwin не работают оба разделителя. Возможно, должен работать ";", но он воспринимается как разделитель команд.
java -classpath lib/path/junit-4.8.2.jar:./test_bin org.junit.runner.JUnitCore com.qwertovsky.helloworld.TestCalculator JUnit version 4.8.2 .... Time: 0,031 OK (4 tests)

Создадим библиотеку

Класс Calculator оказался полезным и может быть использован во многих проектах. Перенесем всё, что касается класса Calculator в отдельный проект.
HelloWorld "---bin "---src "---com "---qwertovsky "---helloworld "---HelloWorld.java Сalculator "---bin "---src " "---com " "---qwertovsky " "---calculator " "---Calculator.java " "---operation " "---Adder.java "---test "---com "---qwertovsky "---calculator "---TestCalculator.java Измените также назавания пакетов в исходных текстах. В HelloWorld.java нужно будет добавить строку
import com.qwertovsky.calculator.Calculator; Компилируем.
cd Calculator javac -sourcepath src -d bin src/com/qwertovsky/calculator/Calculator.java Делаем архив jar
jar cvf calculator.jar -C bin . added manifest adding: com/(in = 0) (out= 0)(stored 0%) adding: com/qwertovsky/(in = 0) (out= 0)(stored 0%) adding: com/qwertovsky/calculator/(in = 0) (out= 0)(stored 0%) adding: com/qwertovsky/calculator/Calculator.class(in = 497) (out= 373)(deflated 24%) adding: com/qwertovsky/calculator/operation/(in = 0) (out= 0)(stored 0%) adding: com/qwertovsky/calculator/operation/Adder.class(in = 441) (out= 299)(deflated 32%) С помощью ключа -C мы запустили программу в каталоге bin.

Надо узнать, что у библиотеки внутри

Можно распаковать архив zip-распаковщиком и посмотреть, какие классы есть в библиотеке.
Информацию о любом классе можно получить с помощью дизассемблера javap.
javap -c -classpath calculator.jar com.qwertovsky.calculator.Calculator Compiled from "Calculator.java" public class com.qwertovsky.calculator.Calculator extends java.lang.Object{ public com.qwertovsky.calculator.Calculator(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public int sum(int); Code: 0: new #2; //class com/qwertovsky/calculator/operation/Adder 3: dup 4: invokespecial #3; //Method com/qwertovsky/calculator/operation/Adder."":()V 7: astore_2 8: aload_1 9: astore_3 10: aload_3 11: arraylength 12: istore 4 14: iconst_0 15: istore 5 17: iload 5 19: iload 4 21: if_icmpge 42 24: aload_3 25: iload 5 27: iaload 28: istore 6 30: aload_2 31: iload 6 33: invokevirtual #4; //Method com/qwertovsky/calculator/operation/Adder.add:(I)V 36: iinc 5, 1 39: goto 17 42: aload_2 43: invokevirtual #5; //Method com/qwertovsky/calculator/operation/Adder.getSum:()I 46: ireturn } Из результата видно, что класс содержит кроме пустого конструктора, ещё один метод sum, внутри которого в цикле вызывается метод add класса Adder. По завершении метода sum, вызывается Adder.getSum().
Без ключа -c программа выдаст только список переменных и методов (если использовать -private, то всех).
javap -private -classpath calculator.jar com.qwertovsky.calculator.operation.Adder Compiled from "Adder.java" public class com.qwertovsky.calculator.operation.Adder extends java.lang.Object{ private int sum; public com.qwertovsky.calculator.operation.Adder(); public com.qwertovsky.calculator.operation.Adder(int); public void add(int); public int getSum(); }

Лучше снабдить библиотеку документацией

Изменим для этого класс калькулятора.
Документацию можно создать следующей командой. При ошибке программа выдаст список возможных опций.
mkdir doc javadoc -d doc -charset utf-8 -sourcepath src -author -subpackages com.qwertovsky.calculator В результате получиться следующее

Можно подписать jar-архив

Если требуется подписать свою библиотеку цифровой подписью, на помощь придут keytool и jarsigner.
Генерируем подпись.
keytool -genkey -keyalg rsa -keysize 2048 -alias qwertokey -keystore path/to/qwerto.keystore Enter keystore password: Re-enter new password: What is your first and last name? : Valery Qwertovsky What is the name of your organizational unit? : Qwertovsky What is the name of your organization? : Qwertovsky What is the name of your City or Locality? : Tver What is the name of your State or Province? : Tverskaya obl. What is the two-letter country code for this unit? : RU Is CN=Valery Qwertovsky, OU=Qwertovsky, O=Qwertovsky, L=Tver, ST=Tverskaya obl., C=RU correct? : y Enter key password for (RETURN if same as keystore password): Re-enter new password:
Генерируем Certificate Signing Request (CSR)
keytool -certreq -file path/to/qwertokey.crt -alias qwertokey -keystore path/to/qwerto.keystore Содержимое полученного файла отправляем в центр сертификации. От центра сертификации получаем сертификат. Сохраняем его в файле (например, qwertokey.cer) и импортируем в хранилище
keytool -import -trustcacerts -keystore path/to/qwert.keystore -alias qwertokey -file path/to/qwertokey.cer Подписываем jar-архив
jarsigner -keystore path/to/qwerto.keystore calculator.jar qwertokey Файл qwertokey.cer отправляем всем, кто хочет проверить архив. Проверяется он так
jarsigner -verify -verbose -certs -keystore path/to/qwerto.keystore calculator.jar

Использование библиотеки

Есть программа HelloWorld, которая использует библиотечный класс Calculator. Чтобы скомпилировать и запустить программу, нужно присоединить библиотеку.
Компилируем
cd HelloWorld javac -sourcepath src -d bin -classpath path/to/calculator.jar src/com/qwertovsky/helloworld/HelloWorld.java Запускаем
java -classpath bin:path/to/calculator.jar com.qwertovsky.helloworld.HelloWorld

Собираем программу

Это можно сделать по-разному.

Первый способ

cd HelloWorld echo main-class: com.qwertovsky.helloworld.HelloWorld>manifest.mf echo class-path: lib/calculator.jar >>manifest.mf mkdir lib cp path/to/calculator.jar lib/calculator.jar jar -cmf manifest.mf helloworld.jar -C bin . Здесь есть тонкости.
В строке
main-class: com.qwertovsky.helloworld.HelloWorld не должно быть пробелов в конце.
Вторая тонкость описана в : в этой же строке должен стоять перенос на следующую строку. Это если манифест помещается в архив сторонним архиватором.
Программа jar не включит в манифест последнюю строку из манифеста, если в конце не стоит перенос строки.
Ещё момент: в манифесте не должно быть пустых строк между строками. Будет выдана ошибка «java.io.IOException: invalid manifest format».

При использовании команды echo надо следить только за пробелом в конце строки с main-class.

Второй способ

cd HelloWorld echo class-path: lib/calculator.jar >manifest.mf mkdir lib cp path/to/calculator.jar lib/calculator.jar jar -cmef manifest.mf com.qwertovsky.helloworld.HelloWorld helloworld.jar -C bin . В данном способе избегаем ошибки с пробелом в main-class.

Третий способ

cd HelloWorld mkdir lib cd lib jar -xvf path/to/calculator.jar com/ created: com/ created: com/qwertovsky/ created: com/qwertovsky/calculator/ inflated: com/qwertovsky/calculator/Calculator.class created: com/qwertovsky/calculator/operation/ inflated: com/qwertovsky/calculator/operation/Adder.class cd .. cp -r bin/* lib/ jar -cef com.qwertovsky.helloworld.HelloWorld helloworld.jar -C lib . rm -r lib Включили код нужной библиотеки в исполняемый файл.

Запуск исполняемого jar-файла

Файл calculator.jar исполняемым не является. А вот helloworld.jar можно запустить.
Если архив был создан первыми двумя способами, то рядом с ним в одном каталоге должна находится папка lib с файлом calculator.jar. Такие ограничения из-за того, что в манифесте в class-path указан путь относительно исполняемого файла.
cd Calculator ls ../HelloWorld/lib calculator.jar java -jar ../HelloWorld/helloworld.jar При использовании третьего способа нужные библиотеки включаются в исполняемый файл. Держать рядом нужные библиотеки не требуется. Запускается аналогично.
java -jar ../HelloWorld/helloworld.jar

Как быть с приложениями JavaEE

Аналогично. Только библиотеки для компиляции нужно брать у сервера приложений, который используется. Если я использую JBoss, то для компиляции сервлета мне нужно будет выполнить примерно следующее
javac -classpath path/to/jboss/common/lib/jboss-servlet*.jar -d ./classes src/com/qwertovsky/app/servlets/MenuSt.java
Структура архива JavaEE-приложения должна соответствовать определенному формату. Например
my.ear `---META-INF | `---manifest.mf `---lib | `---mylib.jar `---my.war | `---META-INF | | `---manifest.mf | `---WEB-INF | | `---lib | | | `---myweblib.jar | | `---classes | | | `---com | | | `---... | | `---web.xml | `---index.html | `---<остальное веб-содержимое (страницы, изображения)> `---myejb.jar
Способы запуска приложения на самом сервере с помощью командной строки для каждого сервера различны.

Надеюсь, данная статья станет для кого-нибудь шпаргалкой для работы с Java в командной строке. Данные навыки помогут понять содержание и смысл Ant-скриптов и ответить на собеседовании на более каверзные вопросы, чем «Какая IDE Вам больше нравится?».

Сейчас я покажу, как можно запустить простенькую программу на java безо всякой среды вроде сервера приложений. Достаточно одного класса, в котором будет определён метод main.

package com.blogspot;
public class DeveloperRemarks {
public static void main(String args) {
if (args.length == 0) {
System.out
.println("Передайте в качестве параметра командной строки текст, который хотите увидеть.");
} else {
System.out.println("Вы ввели: " + args);
}
System.out.println("Исходники доступны на developer-remarks.blogspot.com");
}
}
В командной строке при запуске программы необходимо передать текст, который будет отображён на экране. В противном случае будет выведено соответствующее сообщение. Все параметры, переданные программе, будут содержаться в массиве строк args, который принимает метод main. Если не передано ни одного параметра, длина массива будет равна нулю.

Теперь настроим в Eclipse возможность запуска jar-файла из терминала. Для этого сначала необходимо создать конфигурацию запуска. Выберите в верхнем меню Run - Run Configurations. Откроется следующее окно:

В списке слева выберите тип приложения: Java Application. Там создайте новую конфигурацию как показано на скриншоте. Для этого выберите целевой проект и класс, в котором есть метод main.

Теперь мы готовы к тому, чтобы экспортировать наш проект в запускаемый jar-файл. Для этого кликните на проекте правой кнопкой мыши, выберите "Export...", откроется следующее окно:


В древовидном списке выберите Runnable Jar file. Поиск можно значительно упростить, если отфильтровать тип проекта по названию. Нажмите Finish. После этого откроется окно для настроек экспорта:


В нём выберите созданную ранее конфигурацию запуска. Затем укажите полное имя jar-файла. В разделе "Library handling" выберите "Extract required libraries into generated JAR" (распаковать необходимые библиотеки внутрь создаваемого архива). Нажмите Finish и исполняемый архив будет создан.

Поскольку в данном примере нет зависимостей от других библиотек, то мы выбираем первый пункт. Но если бы у нас было несколько десятков, а то и сотен зависимостей, правильнее было бы выбрать третий пункт "Copy required libraries into a sub-folder next to the generated JAR" (копировать необходимые библиотека в поддиректорию, часть имени которой совпадает с создаваемым архивом) во избежание "раздувания" исполняемого файла. Если бы мы выбрали третий пункт, необходимые библиотеки были бы скопированы в отдельную папку.

Теперь откройте терминал и перейдите в ту директорию, где был создан исполняемый jar-файл. Введите следующую команду:

java -jar developer-remarks.jar привет,\ мир\!

Таким образом вы указываете интерпретатору java запустить наш архив. Обратите внимание, что пробел и восклицательный знак в командной строке необходимо экранировать обратным слэшем.

Продемонстрированный подход может быть полезен в образовательных и тестовых целях. Например, для создания клиента, который вызовет EJB и выведет результат его работы в консоль. Достоинством данного подхода является запуск jar-архива без какого бы то ни было окружения. Достаточно иметь JDK/JRE. Исходники доступны .

Задача: Запуск приложения java из командной строки.

Для примера я наваял небольшую програмку, которая должна вычислять площадь круга по заданному радиусу. Программа содержит два класса: GeometryWF (главный) и Circle. Предполагается создать консольное приложение. Запуск приложения java должен производиться из командной строки .

package geometrywf;
public class GeometryWF {
public static void main(String args) {
try {
if (args.equals("circle")) {
Circle c = new Circle(Double.parseDouble(args));
System.out.println("Circle perimetre: "+c.perimeter());
System.out.println("Circle aria: "+c.area());
}
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Ошибочные входные параметры!");
}
}
}

package geometrywf;
public class Circle {
public double r = 0;
public Circle(double r) {
this.r = r;
}
public double area() {
return(Math.PI*r*r);
}
public double perimeter() {
return(2*Math.PI*r);
}
}

Далее нужно собрать проект. Для разработки я использую NetBeans IDE. Соответственно сборку осуществляю нажатем сочетания "Shift+F11" ("Очистить и собрать проект"). На выходе получаю готовый jar-файл
(C:\Users\Иван\Documents\NetBeansProjects\GeometryWF\dist\GeometryWF.jar).

Запуск из командной строки.

Прежде, чем запускать командную строку, кликаем правой кнопкой мыши по значку "Мой компьютер" и открываем "Свойства". Переходим в "Дополнительные параметы системы"->"Переменные среды". В разделе "Системные переменные" необходимо создать новую переменную "JAVA_HOME" со значением "" (у меня это "C:\glassfish3\jdk\bin"). Этот же путь нужно прописать в уе существующую переменную Path после точки с запятой. Все сохраняем и запускаем командную строку.

Меняем директорию на папку с jar-файлом при помощи команды CHDIR:

C:\Users\Иван> CHDIR C:\Users\Иван\Documents\NetBeansProjects\GeometryWF\dist\

Выполняем запуск приложения java из командной строки при помощи команды "java -jar .

C:\Users\Иван\Documents\NetBeansProjects\GeometryWF\dist> java -jar GeometryWF.jar circle 9

На выходе получаем:

Circle perimetre: 56.548667764616276
Circle square: 254.46900494077323



Поддержите проект — поделитесь ссылкой, спасибо!
Читайте также
Игра петушиные бои правила Игра петушиные бои правила Мод для майнкрафт 1.7 10 смотреть рецепты. Рецепты крафтинга предметов в Minecraft. Оружие в Minecraft Мод для майнкрафт 1.7 10 смотреть рецепты. Рецепты крафтинга предметов в Minecraft. Оружие в Minecraft Шиллинг и стерлинг - происхождение слов Шиллинг и стерлинг - происхождение слов