22.07.2009

GWT и Maven

Для удобства разработки систем используя gwt, можно использовать отслеживания зависимостей с помощью maven. Рассмотрим пример создания каркаса gwt-приложения в IDE Eclipse.
Cоздаем maven проект.
В качестве типа проекта выбираем, что проект будет просто (не использовать никаких архетипов).

Конфигурируем проект
После того, как проект создан, нобходимо настроить зависимости gwt. Для этого можно воспользоваться инструкцией, которую написали разработчики gwt. Полученный проект выглядит так:
Так как gwt это веб-приложение, то необходимо создать в проекте папку war, в ней WEB_INF и добавить файл настройки веб-приложения web.xml. Так же добавить в WEB_INF папку lib для хранения библиотек необходимых для работы gwt.

Для того чтобы скомпилировать gwt проект можно воспользоваться build.xml, который генерируется при создании проекта для eclipse. Его необходимо отредактировать, чтобы он понимал структуру проекта maven
<project name="org.test.gwtMaven"
....default="build"
....basedir="."
....xmlns:artifact="antlib:org.apache.maven.artifact.ant">
....
</project>
Необходимо добавить plugin к Ant для того чтобы он смог интегрироваться с maven. Подключаем plugin для данной сборки xmlns:artifact="antlib:org.apache.maven.artifact.ant">.
Добавляем свойства, которые можно будет использовать в тасках Ant:
<property name="gwt.version" value="1.7.0" />
<property name="gwt.sdk" location="war/WEB-INF/gwt-sdk" />
<property name="platform" value="windows" />
Создаем список файлов, который будет получен из pom для использования при сборки.
<artifact:dependencies filesetId="dependency.fileset">
....<pom file="pom.xml" />
</artifact:dependencies>
Настройка classpath:
<path id="project.class.path">
....<pathelement location="war/WEB-INF/classes" />
....<pathelement location="${gwt.sdk}/gwt-user-${gwt.version}.jar" />
....<fileset dir="${gwt.sdk}" includes="gwt-dev*.jar" />
....<fileset dir="${gwt.sdk}" includes="*.jar" />
....<fileset dir="war/WEB-INF/lib" includes="**/*.jar" />
</path>
Загруза библиотек необходимых для компиляции и работы GWT.
<target name="libs" description="">
....<mkdir dir="war/WEB-INF/gwt-sdk" />
....<copy todir="war/WEB-INF/gwt-sdk">
........<fileset refid="dependency.fileset" />
........<mapper type="flatten" />
....</copy>
....<unzip src="${gwt.sdk}/gwt-dev-${gwt.version}-${platform}-libs.zip"
............dest="${gwt.sdk}/" />
....<copy todir="war/WEB-INF/lib"
....
........file="${gwt.sdk}/gwt-servlet-${gwt.version}.jar" />
</target>
Компиляция исходных кодов.
<target name="javac" depends="libs" description="">
....<mkdir dir="war/WEB-INF/classes" />
....<javac srcdir="src/main/java"
.... ....includes="**"
.... ....encoding="utf-8"
........destdir="war/WEB-INF/classes"
........source="1.5" target="1.5"
........nowarn="true"
........debug="true"
........debuglevel="lines,vars,source">
<classpath refid="project.class.path" />
....</javac>

....<copy todir="war/WEB-INF/classes">
........<fileset dir="src/main/java" excludes="**/*.java" />
....</copy>
</target>
Компиляция Java в JavaScript.
<target name="gwtc" depends="javac" description="">
....<java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
........<classpath>
................<pathelement location="src/main/java" />
................<path refid="project.class.path" />
........</classpath>
........<jvmarg value="-Xmx256M" />
........<arg value="org.test.MainEntryPoint" />
....</java>
</target>
Сборка всего проекта GWT.
<target name="build" depends="gwtc" description="" />
Упаковка проект в war файл для размещения на веб-сервере.
<target name="war" depends="build" description="">
....<zip destfile="org.test.gwtMaven.war" basedir="war" />
</target>
Очистка проекта, удаление из папки war библиотек и скомпилированных классов.
<target name="clean" description="">
....<delete dir="war/WEB-INF/classes" failonerror="false" />
....<delete dir="war/gwt" failonerror="false" />
....<delete dir="war/WEB-INF/gwt-sdk" failonerror="false" />
....<delete dir="war/gwtMain" />
....<delete file="war/WEB-INF/lib/gwt-servlet-${gwt.version}.jar" />
</target>
На этом редактирование build.xml пока закончим. Теперь необходимо создать класс-точку входа в gwt приложения. Для этого создадим два namespace'a. org.test и org.test.gwtMavenClient в папке исходников src/main/java. В org.test.gwtMavenClient создадим класс MainEntryPoint, который реализует интерфейс com.google.gwt.core.client.EntryPoint.

package org.test.gwtMain;

import com.google.gwt.core.client.EntryPoint;

public class MainEntryPoint implements EntryPoint{
public void onModuleLoad() {
// TODO Auto-generated method stub
}
}
В org.test создим MainEntryPoint.gwt.xml, который будет содержать настройки gwt-приложения.

<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='gwtMain'>
<inherits name='com.google.gwt.user.User' />
<inherits name='com.google.gwt.i18n.I18N' />

<extend-property name="locale" values="ru_RU" />

<inherits name='com.google.gwt.user.theme.chrome.Chrome' />

<source path="gwtMain" />
<entry-point class='org.test.gwtMain.MainEntryPoint' />
</module>
Дерево проекта выглядет вот так.

Gwt-приложению необходимо где-то хоститься. Для этого в папке war необходимо создать index.html.
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta http-equiv="content-language" content="ru">
<title>Insert title here</title>
<script type="text/javascript" language="javascript"
src="gwtMain/gwtMain.nocache.js"></script>
</head>
<body>
<iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1'
style="position: absolute; width: 0; height: 0; border: 0"></iframe>

<div id="mainWorkSpace"></div>

</body>
</html>
А в build.xml добавить target, который позволит запускать приложения в специальном отладочном браузере
<target name="hosted"
....depends="javac" description="">
........<java
...............failonerror="true"
...............fork="true"
...............classname="com.google.gwt.dev.HostedMode">
............<classpath>
................<pathelement location="src/main/java" />
................<path refid="project.class.path" />
............</classpath>
............<jvmarg value="-Xmx256M" />
............<arg value="-startupUrl" />
............<arg value="index.html" />
............<arg value="org.test.MainEntryPoint" />
........</java>
</target>
Каркас готов. Продолжение следует...

1 комментарий:

Unknown комментирует...

Из далека узнать можно C++/C# программиста Олега, который java-йские packages называет namespaces. Занятная статейка. А еще maven можно использовать для сборки и запуска проекта. У тебя же скорее описан Ant-way. Рекомендую к прочтению вот эту статью и обратить внимание на комментарии. С GWT и Maven не очень понятная ситуация складывается. Приблизительно такая же как была с GWT-плагинами для Eclipse(до выхода GEP, который к сожалению не работает с Gallileo) - много разных и какой более кошерный не ясно. Нужно только проверять и проверять самому. Блеск и нищета ОпинСорса!!!