jiakuan版Gradle-GWTプラグインマニュアル(後半)

2018年8月30日

ユースケース

ドラフトWar

ドラフトWarとは何か?

GWTプロジェクトのフルビルドは非常に時間がかかる、プロジェクトのサイズにもよるが。開発のあいだには、必ずしも製品レベルのクオリティは必要ない。その理由で、開発者は度々*.gwt.xmlを編集してコンパイラフラグを変更し、コンパイル時間を早める。これは汚いやり方だし、VCSにコミットしてしまわないよう注意する必要がある。このプラグインでは、こういったケースをサポートする。
compileGwtタスクの他に、draftCompileGwtというタスクを提供している。このタスクでは、デフォルトですべての最適化設定がOFFにされている。ただし、draftCompileフラグはONになっている。これによって、ビルドスクリプトや他のファイルを編集スルことなしにコンパイルを早めることができる。

これに加え、draftWarというタスクが加えられている。これによって、compileGwtではなくdraftCompileGwtの出力が利用可能になる。もし、warタスクをカスタマイズしているのであれば、同じことをdraftWarにも行う必要がある、もしそれがアプリの実行に不可欠であれば。

GWTモジュールの異なるセット

この機能を本当に有用にするためには、開発目的のために使う二番目のGWTモジュールセットを指定する必要がある。

gwt {
    modules 'org.wisepersist.gradle.plugins.gwt.example.Example'
    devModules 'org.wisepersist.gradle.plugins.gwt.example.ExampleDev'
}

典型的には開発用モジュール(devModules)には通常/製品のGWTモジュールが含まれる。
これを行うことにより、開発バージョンに対する具体的な設定を指定することができる。例えば、「collapse-all-properties」である。これは、開発中に、一つの大きなPermutationという結果になる。通常のGWTモジュールを参照しているHTMLページにおいて、開発モジュールを動作させるためには、同じrename-toプロパティを両方の*.gwt.xmlファイルに使う。それとまた、利用可能な言語や他の事柄を削減してコンパイルのスピードアップをすることができる。

開発用*.gwt.xmlは典型的には以下のようになる。

<module rename-to="app">
    <inherits name="org.wisepersist.gradle.plugins.gwt.example.Example" />
    <collapse-all-properties />
</module>

ドラフトWarを走行させる

これまでに記述したように、このプラグインはdraftWarタスクを追加しており、GWTモジュールのドラフトコンパイルされたバージョンを使ってwarファイルを作ることができる。このwarは単純に好みのサーブレットコンテナでは知らせることができる。しかし、これをgradleで行うこともできるのだ。以下で例を示す、異なるgradleのプラグインを使ってこれを行う方法である。

Jettyプラグイン

「apply plugin:’jetty’」で、このプラグインを追加しているものとする。以下のようにjettyDraftWarタスクを作ることができる。

task jettyDraftWar(type: JettyRunWar) {
    dependsOn draftWar
    dependsOn.remove('war')
    webApp=draftWar.archivePath
}

単純にこのタスクを実行し、ブラウザでhttp://localhost:8080を表示させる。

Cargoプラグイン

Cargoプラグインは、gradleそのものにバンドルされる標準プラグインではない。これについては、https://github.com/bmuschko/gradle-cargo-pluginを参照して欲しい。ここでは、Cargoプラグインのドキュメントを使い、好みのサーブレットコンテナを設定したものとする。以下のように、ドラフトWarを追加することができる。

cargo {
    deployable {
        file = tasks.draftWar.archivePath
        context = 'draft'
    }
}

もし、それが実行されたときに、Cargoプラグインに対して自動的にドラフトWarをビルドして欲しいなら、次をbuild.gradleの最後に入れる。

afterEvaluate {
    tasks.cargoStartLocal.dependsOn(tasks.draftWar)
    tasks.cargoRunLocal.dependsOn(tasks.draftWar)
}

SuperDevModeを使う

Super Dev Modeを実行するには?

※訳注:以下の記述は、Eclipse(+GWTプラグイン)等のIDEを使わずにgradleのみでSuper Dev Modeを実行する場合であり、Eclipseを使用しているのなら無視してよい。

Super Dev ModeはGWT 2.5以上でのみのサポートであることに注意する。加えて、Super Dev Modeを扱うには特定のブラウザが必要だ。

※訳注:2018/8時点ではChrome, Firefoxは動作する模様。ただし、Firefoxには若干の不具合があるようだ。Chromeをおすすめする。

この章では、Super Dev Modeの使い方を詳細には説明しない。使い方はオフィシャルのドキュメントを参照して欲しい。注意すべきは、*.gwt.xmlファイルを調整するか、あるいは開発用の特別なものを容易しなければならない点だ。

「通常の」開発モードに比較すると、Super Dev Modeは完全なウェブアプリを開始しない。

※訳注:2018/8時点の現在のブラウザではもはや「通常の」開発モードは使えない。Super Dev Mode一択になる。

そうではなく、ウェブアプリを自身で走らせなくてはいけない。詳細については、ドラフトWarの文書を参照してほしい。そこにサーブレットコンテナを使ってのドラフトWarの開始の仕方がある。

Super Dev Modeを始めるには、タスクgwtSuperDevを起動する。レディ状態になると、「Next, visit: http://localhost:9876/」というメッセージが表示される。その通りにブラウザでオープンする。Dev Mode On, DevMode OFFという二つのボタンが現れるので、これをドラッグドロップしてブラウザのブックマークバーに加える。

次に、ブラウザを使い、アプリをホスティングしているウェブアップを表示する。Dev Mode Onブックマークをクリックする。すると、すべてのGWTモジュールをリストするダイアログが表示される。デバッグしたいものを選択する。Super Dev ModeがGWTモジュールを再コンパイルした後ページがリロードされる。そして、ブラウザの開発ツールを使ってアプリをデバッグすることができる。

Eclipseでの作業

このEclipseの機能はEclipse 4.7と、(Eclipse用の)GWTプラグイン3.0.0でテストされている。

この機能は、3.0.0以前のGWTプラグインでは動作しない。

※訳注:2018/8時点の最新は、それぞれ4.8.0(Photon)、3.0.0.201710131939。

プロジェクトのレイアウト

(この項記述なし)

プロジェクトのインポート

GradleプロジェクトをEclipseにインポートするには、おおよそ二つのやり方がある。

  1. 「gradle clipse」を実行し、既存のプロジェクトとしてプロジェクトをインポートする。
  2. EclipseのGradle統合を使う(Githubリポジトリ)

両者のやり方ともに有利性があり、gwt-gradle-pluginはどちらかを強制するものではない。

Gradle Eclipseで行う

この方法でプロジェクトをインポートすることは、そのままうまくいくはずである。プラグインがEclipseのモデルも操作してくれるからだ。ここでやるべきことは以下である。

  1. build.gradleに「apply plugin: ‘eclipse’」を追加してgradle用eclipseプラグインを適用する。
  2. 「gradle eclipse」を実行する。
  3. Eclipseにおいて、File>Importを実行し、このプロジェクトについて「Exisiting Projects into Workspace」とする。

Eclipseに関するものを何かしら変更した、単純に「gradle eclipse」を行うこと。

※訳注:Eclipseを使わずにgradleのみで作業しているGWTプロジェクトには、Eclipseプロジェクトとして必要な.project, .classpathの設定ファイルが存在しない。Gradleにeclipseプラグインを追加し、「eclipseタスク」を実行すると、それらのファイルを作成してくれるので、これをEclipseにインポートすることができる。

EclipseのGradle統合で行う

(省略する)

Intellij IDEAを使う

Intellij IDEAには非常に良いGradleプロジェクトのサポートがある。Intellij IDEAにGradleプロジェクトをインポートすることは非常に簡単だ。

Gradleプロジェクトには常にGradleラッパを使うこが推奨される。IDEAにインポートする場合には、どうか「Use Ddefault gradle wrapper(recomenned)」を選択して欲しい。

技術的詳細

プラグインのデザイン

このプラグインは以下の原理を念頭にして動作するようにデザインされている(が、異なる動きに構成することもできる)。

  • ウェブアプリのソース(典型的には/src/main/webapp)は申請であり、生成されたものに汚されてはならない。そうではなく、特別な作業ディレクトリが設定され、そこにウェブアプリ(典型的には/war)のテンプレートが展開されて作業される。
  • コンパイルは専用のフォルダに出力され、インクリメンタルビルドが働くようにする。
  • すべての出力は、${buildDir}/gwtに出力するよう設定されている、その下にいくつかの異なる目的のサブディレクトリがある(次のデフォルトディレクトリ構造を見てほしい)。

このドキュメントでは、このプラグインがプロジェクトに加えるものと、変更されているデフォルト設定について述べる。

デフォルトのディレクトリ構造

デフォルト設定では、このプラグインは以下のようなディレクトリ構造を用いる。

  • プロジェクトルート
    • src/main/webapp:デフォルトのウェブアプリディレクトリであり、warプラグインによって設定しうる
    • build: Gradleによって設定可能なbuildディレクトリ
      • gwt
        • out:compileGwtタスクの出力先
        • draftOut:draftCompileGwtタスクの出力先
        • extra: GWTコンパイラ/開発モード(つまり、compile report)によって使用される拡張ディレクトリ
        • gen: 生成されえたファイルの出力先
        • work: いくつかのGWTタスクの作業ディレクトリ
        • GWTコンパイラ/開発モードによって使われるキャッシュ
        • log: 開発モードのためのロギングディレクトリ
    • war: GWTの開発モードとEclipseによって使用されるウェブアプリテンプレート

プラグイン拡張

org.wisepersist.gradle.plugins.gwt.GwtPluginExtension型のgwtという名前の拡張である。このプラグインの設定の詳細は、次のプラグインコンフィギュレーションを参照してほしい。あるいは、ソースコードを参照して、何が設定可能かを見出してほしい。

コンフィギュレーション

gwtという名前のコンフィギュレーションが追加されている。GWTそれ自身に必要とされるすべての依存にはこのコンフィギュレーションが使われるべきである(例えば、gwt-dev.jar)。このコンフィギュレーションに関連する依存は、コンパイルタイムにのみ利用可能であり、ランタイムでは利用できない。

基本的なプラグインタスク

このプラグインは少なくとも以下のタスクを設定する。

  • compileGwt:JavaソースコードをJavaScriptにコンパイルする。
  • draftCompileGwt:JavaソースコードをJavaScruiptにコンパイルするが、最適化は行わない。コンパイル時間が短くなるので、開発目的のためには有用である。
  • gwtSuperDev:Super Dev Mode(GWT 2.5以上)を使って、GWTのコードサーバを動作させる。

warプラグインのある場合

gwtプラグインと共にwarプラグインを使用する場合には、以下の変更がされる。

  • compileGwtタスクの生成結果が、自動的warタスクによって作られるwarファイルに追加される(出力が最新でない場合、このタスクが自動的に実行される)。
  • warTemplateタスクが追加され、webappの展開バージョンを作成する。
  • gwtDevが追加され、これがwarTemplateで作られた展開済ウェbアプリを使ってGWT開発モードを動作させる。
  • draftWarタスクが追加され、warタスクと同様のwarファイルを生成する。違いとしては、このwarファイルはdrawftCompileGwtの生成結果を含むことであり、これにより開発中のビルド時間を短くする。

eclipseプラグインのある場合

gwtプラグインと共にEclipseプラグインを使っている場合には、Eclipseのコンフィギュレーションに以下の変更がされる。

  • com.google.gwt.eclipse.core.gwtNatureというnatureが追加される。これはGoogle Plugin for Eclipseによって提供されているものだ。つまり、gwt, eclipseを使う場合には、このプラグインがインストールされているものと仮定される。
  • com.google.gwt.eclipse.core.gwtProjectValidatorというbuildCommandが追加される。これは、Google Plugin for Eclipseによって提供されているいものだ。つまり、gwt, eclipseを使う場合には、このプラグインがインストールされているものと仮定される。

eclipse, warプラグインのある場合

gwtプラグインと共に、eclipse,warプラグインを使う場合には、以下の変更がeclipseコンフィギュレーションに起こる。

  • com.google.gwt.eclipse.core.gwtProjectValidatorというbuildCommandが追加される。
  • デフォルトの出力ディレクトリが”/war/WEB-INF/classes”に変更される。これによって、Google Plugin for Eclipseを使っての開発モードの実行が簡単になる。

バージョン履歴

1.0.0+ (2017-07-09)

    Compatibility
        Gradle 4.0+ (tested 4.0.1)
        GWT 2.x (tested 2.8.1)
    Changes/fixes
        Upgraded Gradle version to 4.0.1
        Upgraded GWT version to 2.8.1

0.6 (2014-12-07)

    Compatibility
        Gradle 1.6+ (tested 2.0 - 2.1)
        GWT 2.x (tested 2.7.0)
    Changes/fixes
        Added new flags introduced in GWT 2.7 and 2.6 (GitHub issue #55)
        Added new task 'checkGwt' for validation of GWT sources (GitHub issue #58)
        Fixed configuration of test task for GWT (GitHub issue #57)

0.5 (2014-09-08)

    Compatibility
        Gradle 1.6+ (tested 1.12 - 2.1)
        GWT 2.x (tested 2.6.1)
    Changes/fixes
        Fixed devModules property in GwtPluginExtension (GitHub issue #40)
        Added new Flag 'useClasspathForSrc' to GwtSuperDevOptions/GwtSuperDev to work around a bug in GWT (GitHub issues #34 and #37)
        Added example with non-Maven layout
        Several cosmetic changes

0.4 (2014-03-21)

    Compatibility
        Gradle 1.6+ (tested 1.6-1.11)
        GWT 2.x (tested 2.6.0)
    Changes/fixes
        Internal changes to improve compatibility with several Gradle versions
        Fixed an issue that caused incompatibilities with Gradle 1.12
        Added more example projects
        Improved and extended the documentation
    Breaking changes
        The inheritance of several tasks is changed. Do a clean build if anything behaves strange.

0.3 (2014-01-09)

    Compatibility
        Gradle 1.8+ (tested 1.8-1.10)
        GWT 2.x (tested 2.5.1)
    Changes/fixes
        The plugin was split into several smaller plugins (gwt, gwt-base, gwt-compiler) to better work with GWT libraries and non-webapp projects.

0.2 (2013-12-08)

    Compatibility
        Gradle 1.6+ (tested 1.6-1.9)
        GWT 2.x (tested 2.5.1)
    Changes/fixes
        Improved JavaDocs (including external links)
        The log level of GWT related tasks is now bound to Gradle's log level by default
        Addition of "gwtSdk" configuration to fix Eclipse classpath when using GWT_CONTAINER
    Breaking changes
        If you manually define your GWT dependencies, you have to change gwt-dev and gwt-user to be added to the new gwtSdk configuration.

0.1 (2013-10-18)

    Compatibility
        Gradle 1.6+ (tested 1.6-1.8)
        GWT 2.x (tested 2.5.1)
    Changes
        Initial release