Статьи

Создание и запуск приложения на GWT и Maven в среде Eclipse

0 592

logo В статье собраны решения наиболее частых проблем, с которыми сталкиваются разработчики при создании и первоначальной настройке проекта на GWT под управлением Maven и Eclipse. 

Используемые инструменты и фреймворки

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

  • Eclipse 4.3.1 Kepler (Eclipse IDE for Java EE Developers)
  • GWT 2.6.0 (RC1)
  • Maven 3.1.1

Установка и настройка среды разработки Eclipse

В качестве IDE  в статье используется Eclipse — бесплатная и популярная среда разработки, а также платформа для построения программных инструментов различного назначения. Скачать последнюю доступную версию Eclipse можно на официальном сайте. Рекомендуется использовать версию сборки Eclipse IDE for Java EE Developers. Для дальнейшей работы понадобится плагин m2e для Eclipse. Чтобы убедиться, что он уже установлен, нужно открыть Help → About Eclipse и найти логотип m2e. Далее следует установить плагин от Google, который нужен для работы с GWT в Eclipse. В качестве сайта обновлений нужно указать http://dl.google.com/eclipse/plugin/4.3. (Help → Install New Software → Add). После добавления сайта обновления нужно выбрать пункт Google Plugin for Eclipse.

01-eclipse-add-update-site

Установка Maven

Maven — это программное обеспечение, которое позволяет управлять жизненным циклом проекта. Maven оперирует артефактами и зависимостями между ними. Все артефакты (т.е. библиотеки и из составные части), от которых зависит проект, хранятся в репозиториях. Любой проект Maven содержит файл pom.xml, в котором указывают все зависимости, а также информацию о репозиториях, целях сборки и плагинах. Подробнее о Maven можно прочитать на официальном сайте. Установка Maven заключается в скачивании и распаковке архива в любое место на жестком диске. Чтобы команда mvn работала в консоли, нужно также добавить путь до папки <путь_до_maven>\bin в переменную среды Path.

Создание проекта

Для использования Maven в проектах на GWT, потребуется специальный плагин — http://mojo.codehaus.org/gwt-maven-plugin/. Один из самых простых путей создания проекта с помощью данного плагина основан на т.н. архетипах (archetypes). Архетип — это образец, или шаблон проекта Maven. Существуют шаблоны проектов веб-приложений, проектов Spring-MVC и многие другие. Такой шаблон есть и для проекта на GWT. В консоли введите следующую команду:

    mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo \
    -DarchetypeArtifactId=gwt-maven-plugin -DarchetypeVersion=2.6.0-rc3
    

Возможно, во время прочтения статьи, значение параметра archetypeVersion будет другим. Чтобы узнать актуальную версию, нужно свериться с сайтом плагина. Далее в интерактивном режиме будет предложено ввести параметры проекта. Пример значений параметров:

  • groupId=ru.interosite.example.toto
  • artifactId=todolist
  • version=1.0-SNAPSHOT
  • package=ru.interosite.example.todo
  • module=TodoList

После завершения операции создастся папка todolist с проектом внутри. Файл pom.xml должен иметь примерно такое содержимое:

<!--?xml version="1.0" encoding="UTF-8"?-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

  <!-- POM file generated with GWT webAppCreator -->
  <modelversion>4.0.0</modelversion>
  <groupid>ru.interosite.example.todo</groupid>
  <artifactid>todolist</artifactid>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>GWT Maven Archetype</name>

  <properties>
    <!-- Convenience property to set the GWT version -->
    <gwtversion>2.6.0-rc3</gwtversion>
    <!-- GWT needs at least java 1.5 -->
    <webappdirectory>${project.build.directory}/${project.build.finalName}</webappdirectory>
    <project.build.sourceencoding>UTF-8</project.build.sourceencoding>
  </properties>

  <dependencies>
    <dependency>
      <groupid>com.google.gwt</groupid>
      <artifactid>gwt-servlet</artifactid>
      <version>${gwtVersion}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupid>com.google.gwt</groupid>
      <artifactid>gwt-user</artifactid>
      <version>${gwtVersion}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupid>junit</groupid>
      <artifactid>junit</artifactid>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupid>javax.validation</groupid>
      <artifactid>validation-api</artifactid>
      <version>1.0.0.GA</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupid>javax.validation</groupid>
      <artifactid>validation-api</artifactid>
      <version>1.0.0.GA</version>
      <classifier>sources</classifier>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <!-- Generate compiled stuff in the folder used for developing mode -->
    <outputdirectory>${webappDirectory}/WEB-INF/classes</outputdirectory>

    <plugins>

      <!-- GWT Maven Plugin -->
      <plugin>
        <groupid>org.codehaus.mojo</groupid>
        <artifactid>gwt-maven-plugin</artifactid>
        <version>2.6.0-rc3</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>test</goal>
              <goal>i18n</goal>
              <goal>generateAsync</goal>
            </goals>
          </execution>
        </executions>
        <!-- Plugin configuration. There are many available options, see            gwt-maven-plugin documentation at codehaus.org -->
        <configuration>
          <runtarget>TodoList.html</runtarget>
          <hostedwebapp>${webappDirectory}</hostedwebapp>
          <i18nmessagesbundle>ru.interosite.example.todo.client.Messages</i18nmessagesbundle>
        </configuration>
      </plugin>

      <!-- Copy static web files before executing gwt:run -->
      <plugin>
        <groupid>org.apache.maven.plugins</groupid>
        <artifactid>maven-war-plugin</artifactid>
        <version>2.1.1</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>exploded</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <webappdirectory>${webappDirectory}</webappdirectory>
        </configuration>
      </plugin>
      <plugin>
        <groupid>org.apache.maven.plugins</groupid>
        <artifactid>maven-compiler-plugin</artifactid>
        <version>2.3.2</version>
        <configuration>
          <source />1.5
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

Импорт проекта в Eclipse

Чтобы начать редактирование исходного кода проекта, нужно импортировать его в среду программирования Eclipse. Делается это командой Import→Existing Maven Project. 02-eclipse-import-projectЗатем, нужно выбрать папку, в которой находится созданный проект todolist и нажать Next. Скорее всего, Eclipse сообщит об ошибках в плагинах. Пока эти сообщения можно проигнорировать и нажать Finish. 03-eclipse-import-errors Далее, нужно убедиться, что новый проект использует Java версии не ниже 1.6. Возможно, потребуется отредактировать этот кусок кода в файле pom.xml:


      <plugin>
        <groupid>org.apache.maven.plugins</groupid>
        <artifactid>maven-compiler-plugin</artifactid>
        <version>2.3.2</version>
        <configuration>
          <source />1.5
          <target>1.5</target>
        </configuration>
      </plugin>

Нужно будет изменить значения в тегах source и target на 1.6\1.7, в зависимости от того, какая версия jdk установлена в системе. Скорее всего, на данном этапе, Eclipse сообщает о такой проблеме в файле pom.xml:

Plugin execution not covered by lifecycle configuration: org.codehaus.mojo:gwt-maven-plugin:2.6.0-rc3:i18n (execution: default, phase: generate-sources)

Подробнее о том, для чего нужна цель gwt:i18n, можно прочитать на сайте плагина. Источник проблемы описан подробно на официальной странице плагина m2e. Вкратце, для каждого плагина Maven m2e хочет знать, какие изменения нужно внести в конфигурацию рабочей среды (workspace) и проекта Eclipse-а на определенных стадиях сборки проекта Maven. Это т.н. «lifecycle mapping» -отображения состояние Maven-проекта на проект Eclipse. m2e создает предупреждающие маркеры для каждого плагина Maven, для которого нет такого отображения. Самый простой способ решить данную проблему — заставить m2e полностью игнорировать плагин, для которого нет соответствующей конфигурации. Следует  добавить такие инструкции в pom.xml::

		<pluginmanagement>
			<plugins>

				<plugin>
					<groupid>org.eclipse.m2e</groupid>
					<artifactid>lifecycle-mapping</artifactid>
					<version>1.0.0</version>
					<configuration>
								<lifecyclemappingmetadata>
							<pluginexecutions>
								<pluginexecution>
									<pluginexecutionfilter>
										<groupid>org.codehaus.mojo</groupid>
										<artifactid>
											gwt-maven-plugin
										</artifactid>
										<versionrange>
											[2.5.1,)
										</versionrange>
										<goals>
											<goal>i18n</goal>
										</goals>
									</pluginexecutionfilter>
									<action>
										<ignore></ignore>
									</action>
								</pluginexecution>
							</pluginexecutions>
						</lifecyclemappingmetadata>
					</configuration>
				</plugin>
			</plugins>
		</pluginmanagement>

Далее, в файле ru/interosite/example/todo/client/TodoList.java, Eclipse предупреждает об ошибке «Messages cannot be resolved to a type» . 04-eclipse-maven-errors Интерфейс Messages отвечает за строковые ресурсы приложения. Подробнее о строковых ресурсах и локализации можно почитать в GWP API. По умолчанию, интерфейс Messages не создается. За это отвечает GWT-maven-plugin. Как это происходит, можно прочитать на соответствующей странице плагина. Цель i18n создает соответствующие интерфейсы на основе строковых ресурсов (message.bundles), что, как правило, достаточно удобно. Итак, чтобы  GWT-maven-plugin создал все недостающие интерфейсы, нужно запустить конфигурацию Maven generate-sources (Project → Run as → Maven generate-sources). После этого в папке target/generated-sources/gwt появятся новые файлы — Messages.java и GreetingServiceAsync.java (отвечает за общение с сервером). Последняя ошибка, которая часто возникает при настройке проекта — «Java compiler level does not match the version of the installed Java project facet». 05-eclipse-maven-need-update Eclipse подсказывает решение — Project → Maven → Update Project. После выполнения этого действия видимых ошибок больше быть не должно. Теперь можно запустить проект командой Project → Run as → Maven build. В качестве цели нужно указать get:run (запустить DevMode). Возможно, при попытке запуска в консоли появится ошибка типа «Unable to locate the Javac Compiler». Чтобы устранить ее, нужно выполнить следующие действия: Project  → Properties → Build Path → Libraries → JRE  → Edit  → Installed JRE  → Edit и указать реальный путь до JDK. 06-fix-jdk07-fix-jdk-pathТеперь DevMode должен запуститься без каких-либо ошибок.

Тестовый запуск приложения

После запуска цели get:run откроется окно GWT Development Mode. 08-devmode Для работы с приложением в режиме разработчика необходим специальный плагин для браузера. При первом запуске (после нажатия кнопки Launch Default Browser в DevMode) отображается приглашение установить этот плагин. 09-pluginЕсли установка прошла успешно, то, после перезагрузки страницы, должен отобразиться главный (и единственный) экран тестового приложения. 10-default-app

Заключение

Первоначальная настройка проекта на GWT и Maven в среде Eclipse имеет свои особенности и подводные камни. Однако, все рассмотренные проблемы имеют свои адекватные решения, что позволяет достаточно легко создать проект, импортировать его в Eclipse и начать разработку. P.S. Все ваши замечания и пожелания прошу оставлять в комментариях к это статье.

About the author / 

admin