Запуск java-программы из командной строки.
Представим такую ситуацию…
В результате вашей работы в качестве java программиста у вас получился один JAR-файл (для простоты назовем его mytools-1.0-SNAPSHOT.jar). Кроме него вы планируете использовать более десятка других jar-файлов.
Ваша программа должна запускаться из командной строки, а не из супер-пупер IDE которую вы обычно используете в работе. Например Вашу программу нужно отправить другому человеку, у которого нет такой же как у вас среды разработки (Eclipse, NetBeans, IDEA и т.д.) или запустить на удаленном сервере доступ к которому осуществляется только через SSH. Таким образом, для запуска вашей программы вам нужно собрать все требуемые для работы jar-файлы, прописать их в CLASSPATH и для удобства написать простой runme.bat файл или (runme.sh для линукса).
Рецепт 1.
Требуется: maven, maven-assymbly-plugin
Если вы используете maven, то возможно Вам будет удобно воспользоваться maven-assymbly-plugin. Найти информацию по нему можно здесь: http://maven.apache.org/plugins/maven-assembly-plugin/
В результате вы можете собрать в один JAR-файл, который содержит всё необходимое для работы.
Для этого:
1. добавляем в pom.xml настройки для maven-assymbly-plugin.
<project> [...] <build> [...] <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> [...] </project>
2. Запускаем сборку
mvn assembly:assembly
3. Получаем jar файл со всеми зависимостями:
target/mytools-1.0-SNAPSHOT-jar-with-dependencies.jar
Подробную информацию как работать со сборками можно получить открыв ссылку приведенную выше.
Дальше, я предпочитаю копировать jar-файл в отдельную папку lib. После этого остается только создать простой BAT-файл в котором будет содержаться строка:
java -cp mytools-1.0-SNAPSHOT-jar-with-dependencies.jar com.programmisty.Main %*
%* – означает что все аргументы командной строки будут переданы в main-класс.
Минусы: Если необходимо заменить только одну зависимость, приходится распаковывать и перепаковывать весь этот монолитный jar-файл.
Рецепт 2
Собираем все необходимые jar-файлы в одну директорию. Например с помощью maven это можно сделать командой
mvn dependency:copy-dependencies
Если вы не используете maven, можно просто скопировать руками все необходимые вам файлы.
Затем копируем наш mytools-1.0-SNAPSHOT-jar и все дополнительные jar-файлы в папку lib.
Если у нас windows, создаем BAT-файл runme.bat. В итоге у нас получается что-то вроде этого:
. |_lib | |_mytools-1.0-SNAPSHOT-jar | |_commons-lang-2.4.jar | |_commons-logging-1.1.1.jar | |_commons-httpclient-3.1.jar | |-... |_runme.bat
Теперь, возможно старым java программистам будет интересно узнать, что в Java 6 наконец-то в classpath можно использовать звездочку (*).
Раньше многие делали так:
set CP=lib/mytools-1.0-SNAPSHOT-jar
set CP=%CP%;lib/commons-lang-2.4.jar
rem "и так до самого конца"
java -cp %CP% com.programmisty.Main %*
Те кто похитрее делал так:
setlocal ENABLEDELAYEDEXPANSION
set CP=
for %%i in (lib/*.jar) do set CP=!CP!lib/%%i;
java -cp %CP% com.programmisty.tools.Main %*
Если вы работаете в Linux, то для настоящего линуксоида получить список jar-файлов в директории и присвоить значение переменной — задачка “школьного” уровня. По этой ссылке можно найти несколько способ ее решения http://www.sql.ru/Forum/actualthread.aspx?bid=38&tid=569498
Но теперь, если у вас java 6 это вообще не проблема, файл runme.bat может выглядеть следующим образом:
java -cp "lib/*" com.programmisty.tools.Main %*
Под линуксом wildcard (то есть звездочка) также успешно работает. Подробнее можно прочитать здесь: http://java.sun.com/javase/6/docs/technotes/tools/windows/classpath.html в разделе “Understanding class path wildcards”