Звездочка (*) в шестёрке и хитрые bat-файлы


Запуск 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”

Любое использование либо копирование материалов или подборки материалов сайта, элементов дизайна и оформления допускается лишь с разрешения правообладателя и только со ссылкой на источник: programador.ru

Телеграм канал: @prgrmdr
Почта для связи: vit [at] programmisty.com