Рубрики
3. Инструментарий Java

Работа с Maven + Tomcat

Maven и Tomcat


Ни для кого не секрет, что maven-ом можно деплоить проекты в Apache Tomcat.
Правда многие разработчики все-таки используют функции, встроенные в среду разработки (в Netbeans — из коробки, в Eclipse — ставим плагин).
Это удобно и просто, но к сожалению, мне приходится часто «перескакивать» с разных IDE и поэтому в некоторых своих проектах я предпочитаю сразу настроить tomcat:deploy.

Рубрики
3. Инструментарий UML

UML в Javadoc через maven+umlgraph

Где-то год назад писал про различные UML-редакторы.
К сожалению, ситуация толком не изменилась, пока действительно удобного на 100% для себя инструмента для создания UML-диаграмм не нашел.
UMLet — хорошо спасает в 80% случаев для быстрого прототипирования, но иногда его не хватает.

Сейчас речь пойдет не о нем, а о UMLGraph.
Это инструмент, который позволяет осуществлять декларативный способ рисования uml-диаграмм. Другими словами UML диаграммы создаются в текстовом виде, а не рисуется мышкой. Некоторым программистам (в частности мне) работать с текстом несколько удобней, чем с мышкой и со множеством графических объектов.

Возможностей у UMLGraph довольно много, но лично меня интересовали только следующие его возможности:

1. Рисование только диаграмм классов. Использование umlgraph для создания диаграмм последовательности, развертывания и т.д. мне не интересно.
2. Встраивание полученных диаграмм в JavaDoc.
3. Связка с maven-ом.

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

Рубрики
3. Инструментарий

Maven: Lifecycle, Phase, Goal

Для того, чтобы не запутаться в работе maven’а нужно разобраться с базовыми понятиями.

1. Жизненный цикл (lifecycle) :  default, clean, site.

2. Фазы (phase). Жизненный цикл состоит из чередования различных фаз. Например жизненный цикл clean состоит из фаз : pre-clean, clean и post-clean. Порядок выполнения важен. Если мы запустим mvn package , то также будут выполняться все предыдущие фазы: validate,compile, test и т.д.

3. Цели, задачи, голы (goal).  Фазы состоят из чередования голов, например: gwt:run, assembly:assembly, compiler:compile (т.е. голы они с двоеточием).  Для того, чтобы указать какие голы должны быть забиты в какой фазе нужно в pom.xml  отредактировать секцию plugin.  Так сделано потому, что голы создаются плагинами.

Вот такая матрёшка.

Жизненный цикл состоит из фаз, а фазы состоят из голов.

То есть, когда выполняется mvn clean gwt:run, мы проходим жизненный цикл clean, а затем забиваем гол gwt:run


Рубрики
3. Инструментарий 4. Полезняшки Java

Звездочка (*) в шестёрке и хитрые 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»

Рубрики
3. Инструментарий

GWT 2.0 + GXT (Ext GWT) + Maven

1. GWT (Google Web Toolkit, произноситься: /’gwit/). На момент написания поста текущая версия  — 2.0.3.  Загрузить можно с официальной страницы GWT — http://code.google.com/intl/ru/webtoolkit/download.html.

Вкратце механизм работы GWT можно описать так.  Исходный код пишется на Java, затем он транслируется в JavaScript,  в результате получаются несколько версий программ для разных браузеров (Firefox, IE, Safari, Google Chrome, Opera 9.0). Полученный JavaScript код неплохо оптимизирован — название переменных и методов сокращенны, убраны комментарии и лишние пробелы. В итоге получается его естественная обфускация.  (Пример кусочка полученного кода: function Y7(a){W7();LE(a);a.Vb=NOc;return a} ).

После выхода версии  GWT 2.0 появилась возможность разбивать полученный JavaScript код (runAsync)  на отдельные файлы, которые затем загружаются асинхронно по мере надобности.  Так уменьшается размер первоначального скрипта и как следствие время загрузки и запуска приложения.

Подробное описание есть на официальном сайте GWT.

Рубрики
3. Инструментарий 4. Полезняшки

GWT+Maven

Связка Maven + GWT на мой взгляд один из самых эффективных  способов работы.

  1. Ставим maven. Как всегда, прописываем путь в PATH к mvn.bat
  2. Читаем про maven. Прочитать можно здесь тут .  Руководство на мой взгляд не особо удобное, но разобраться можно…
  3. Читаем про плагин к maven’у для работы с GWT. Читать здесь

Далее остается только создать соответствующий maven проект.

Можно руками, а можно например так:

mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo -DarchetypeArtifactId=gwt-maven-plugin -DarchetypeVersion=1.1 -DgroupId=myGroupId  -DartifactId=myArtifactId