(クイックリファレンス)

4 コマンドライン

Authors: Graeme Rocher, Peter Ledbrook, Marc Palmer, Jeff Brown, Luke Daley, Burt Beckwith ,
Japanese Translation: T.Yamamoto, Japanese Grails Doc Translating Team
このドキュメントの内容はスナップショットバージョンを元に意訳されているため、一部現行バージョンでは未対応の機能もあります。

Version: 2.1.0.BUILD-SNAPSHOT

4 コマンドライン

GrailsのコマンドラインシステムはGant(シンプルなApache AntのGroovyによるラッパー)によって構築されています。

Grailsではgrailsコマンドを使用し、Gantとは少し違った実行方法になります。

grails [command name]

このように入力した場合、GrailsはGantスクリプトを実行するために以下のディレクトリを探しに行きます。
  • USER_HOME/.grails/scripts
  • PROJECT_HOME/scripts
  • PROJECT_HOME/plugins/*/scripts
  • GRAILS_HOME/scripts

Grailsは "run-app" のような小文字のコマンドをキャメルケースに変換して探します。なので次のように入力すると:

grails run-app

結果、以下のファイルを検索するよう指定したことになります。
  • USER_HOME/.grails/scripts/RunApp.groovy
  • PROJECT_HOME/scripts/RunApp.groovy
  • PLUGINS_HOME/*/scripts/RunApp.groovy
  • GLOBAL_PLUGINS_HOME/*/scripts/RunApp.groovy
  • GRAILS_HOME/scripts/RunApp.groovy

もし、複数の結果が見つかった場合はGrailsはどれを実行するかの選択肢を提示してきます。

GrailsがGantスクリプトを実行するとき、デフォルトとして設定されたターゲットを起動します。デフォルト指定(setDefaultTarget(main)など)がない場合、Grailsはエラーで終了します。

実行可能なコマンドのヘルプとリストを表示したい場合は以下を入力します:

grails help

このように入力すると、Grailsが認識しているコマンドのリストと使用方法が出力されます:

Usage (optionals marked with *):
grails [environment]* [target] [arguments]*

Examples: grails dev run-app grails create-app books

Available Targets (type grails help 'target-name' for more info): grails bootstrap grails bug-report grails clean grails compile ...

左メニューにある個別のコマンドラインリファレンス情報も参照して下さい。

It's often useful to provide custom arguments to the JVM when running Grails commands, in particular with run-app where you may for example want to set a higher maximum heap size. The Grails command will use any JVM options provided in the general JAVA_OPTS environment variable, but you can also specify a Grails-specific environment variable too:

export GRAILS_OPTS="-Xmx1G -Xms256m -XX:MaxPermSize=256m"
grails run-app

non-interactive mode

When you run a script manually and it prompts you for information, you can answer the questions and continue running the script. But when you run a script as part of an automated process, for example a continuous integration build server, there's no way to "answer" the questions. So you can pass the --non-interactive switch to the script command to tell Grails to accept the default answer for any questions, for example whether to install a missing plugin.

For example:

grails war --non-interactive

4.1 インタラクティブモード

Interactive mode is the a feature of the Grails command line which keeps the JVM running and allows for quicker execution of commands. To activate interactive mode type 'grails' at the command line and then use TAB completion to get a list of commands:

If you need to open a file whilst within interactive mode you can use the open command which will TAB complete file paths:

Even better, the open command understands the logical aliases 'test-report' and 'dep-report', which will open the most recent test and dependency reports respectively. In other words, to open the test report in a browser simply execute open test-report. You can event open multiple files at once: open test-report test/unit/MyTests.groovy will open the HTML test report in your browser and the MyTests.groovy source file in your text editor.

TAB completion also works for class names after the create-* commands:

If you need to run an external process whilst interactive mode is running you can do so by starting the command with a !:

Note that with ! (bang) commands, you get file path auto completion - ideal for external commands that operate on the file system such as 'ls', 'cat', 'git', etc.

4.2 Gantスクリプトの作成

プロジェクトのルートディレクトリでcreate-scriptコマンドを実行することにより、自分でGantスクリプトを作成することができます。例えば以下のようなコマンドです:

grails create-script compile-sources

このコマンドによりscripts/CompileSources.groovyというスクリプトが作成されます。Gantスクリプト自身は通常のGroovyスクリプトと似ていますが、ターゲットという概念とそれぞれのターゲットの依存関係をサポートしています。

target(default:"The default target is the one that gets executed by Grails") {
    depends(clean, compile)
}

target(clean:"Clean out things") { ant.delete(dir:"output") }

target(compile:"Compile some sources") { ant.mkdir(dir:"mkdir") ant.javac(srcdir:"src/java", destdir:"output") }

上記で示したスクリプトのように、暗黙的な変数のantはApache Ant APIを使うことができます。
前バージョンのGrails(1.0.3以前)では、変数名はAntのように大文字始まりでした。

また、上記のdefaultターゲットで示したように、dependsメソッドを使って他のターゲットに 依存させることができます。

デフォルトターゲット

上記の例では"default"と明示的にターゲットを指定しました。これは、スクリプトでデフォルトターゲットを定義する方法の一つです。(最新のバージョンでは使用できません)代わりにsetDefaultTarget()メソッドを使用することもできます。

target("clean-compile": "Performs a clean compilation on the app source") {
    depends(clean, compile)
}

target(clean:"Clean out things") { ant.delete(dir:"output") }

target(compile:"Compile some sources") { ant.mkdir(dir:"mkdir") ant.javac(srcdir:"src/java", destdir:"output") }

setDefaultTarget("clean-compile")

こうすることで、他のスクリプトのターゲットを直接デフォルトターゲットに指定できます。setDefaultTarget()は、対象のターゲット(今回の場合は "clean-compile")の後であればどこにでも書くことができます。

どちらのアプローチが良いのでしょうか?正直なところ、あなたは好みで使い分けて使用することができます。どちらの場合も、王道の利点があるわけではありません。一つ言えることは、他のスクリプトからデフォルトターゲットを呼び出せるようにしたい場合は、デフォルトターゲットを持っていない共有スクリプトにそれを移動する必要があるということです。これについては次のセクションでも詳しく説明します。

4.3 Grailsスクリプトの再利用

Grailsは独自のスクリプトでも使用できる便利なコマンドライン機能を提供しています(コマンドに関する詳細はリファレンスガイド内のコマンドラインリファレンスを参照してください)。特にcompilepackageおよびbootstrapスクリプトはよく利用されます。

bootstrapスクリプトはデータソースなどを参照可能にするSpringのApplicationContextインスタンスを生成します。(統合テストはこの機能を使っています):

includeTargets << grailsScript("_GrailsBootstrap")

target ('default': "Database stuff") { depends(configureProxy, packageApp, classpath, loadApp, configureApp)

Connection c try { c = appCtx.getBean('dataSource').getConnection() // do something with connection } finally { c?.close() } }

他のスクリプトからターゲットを取り出す

Gantはターゲットを他のGantスクリプトから取り込むことができます。取り込んだターゲットは、あたかも現在のスクリプトで定義されているかのように実行することができます。この仕組みはincludeTargetsプロパティにより実現されます。単純に左シフト演算子でファイル又は使用するクラスを追加します:

includeTargets << new File("/path/to/my/script.groovy")
includeTargets << gant.tools.Ivy
クラスを使用している構文はGantのルールに従って記述されたクラスを使用しています。もし興味があればGantのドキュメントを参照して下さい。

Core Grailsターゲット

この章の冒頭の例でお見せしたように、Core Grailsターゲットを含める際に利用するincludeTargetsでは、ファイルベース構文、クラスベース構文のどちらも使用しません。代わりに、Grailsコマンドランチャが提供しているgrailsScript()という特別なメソッドを使用します(このメソッドはGrails専用であり、通常のGantでは利用できません)。

grailsScript()メソッドの構文は、単に含めたいGrailsスクリプトの名称を渡すだけです。以下に再利用できるGrailsスクリプトの一覧を示します:

スクリプト説明
_GrailsSettingsGrailsの設定などを読み込むスクリプト。このスクリプトは他のスクリプト(_GrailsProxyなど)で自動的にインクルードされているので、通常は明示的にインクルードする必要はありません。
_GrailsEventsイベントトリガーを実装するためのメソッド(event(String eventName, List args))を使用するには、これをインクルードする必要があります。このスクリプトもほぼ全てのGrailsスクリプトでインクルードされています。
_GrailsClasspathコンパイル、テスト、およびランタイムのクラスパスを設定します。このスクリプトもほぼ全ての Grailsスクリプトでインクルードされています。
_GrailsProxyインターネットにアクセスする場合は、プロキシの解決をするためにこのスクリプトをインクルードして下さい。
_GrailsArgParsingparseArgumentsターゲットはその名の通り解析する機能を提供します。スクリプトを実行する際に指定した引数を解析します。argsMapプロパティにそれらの設定の追加します。
_GrailsTestすべてのテスト実行に使用するコードが含まれています。他の種類のテストを追加する際に便利です。
_GrailsRunアプリケーションを起動させるために必要な機能を提供します。通常は(runApp/runAppHttps)から、またはWARファイル(runWar/runWarHttps)から実行します。

Grailsではもっと多くのスクリプトが提供されていますので、どんな種類のターゲットが利用可能かを調べてみる価値があるでしょう。" "で始まっているものはすべて再利用されることを考慮してデザインされています。

スクリプトアーキテクチャ

アンダースコアで始まるGrailsスクリプトは、何を示しているものかを説明すると、それらはコマンドではなく、他のスクリプトから利用されるスクリプト群として認識されます。なので、それらのスクリプト(内部スクリプト)はデフォルトターゲットを持っておらず、スクリプトは実行できません。

内部スクリプトは共有して再利用するために存在します。実際に独自のスクリプトを書く場合は、同等の手法をとることをお勧めします。簡単に共有できるターゲットは内部スクリプトにすべて置き、コマンドライン引数を解析して、内部スクリプト内のターゲットを呼び出すだけのコマンドスクリプトを提供します。例えば、いくつかのファンクショナルテストを行うスクリプトがあるという場合、以下のように分割できます。

./scripts/FunctionalTests.groovy:

includeTargets << new File("${basedir}/scripts/_FunctionalTests.groovy")

target(default: "Runs the functional tests for this project.") { depends(runFunctionalTests) }

./scripts/_FunctionalTests.groovy:

includeTargets << grailsScript("_GrailsTest")

target(runFunctionalTests: "Run functional tests.") { depends(...) … }

以下にスクリプトを書く際のガイドラインを示します:

  • スクリプトを"コマンドスクリプト"と"内部スクリプト"に分割します。
  • 実装の大部分は"内部スクリプト"で行います。
  • 引数の解析は"コマンドスクリプト"で行います。
  • ターゲットに引数を渡すには、いくつかのスクリプト変数を作成し、ターゲットを呼び出す前にそれらを初期化します。
  • ターゲットの代わりにスクリプト変数に割り当てられているクロージャを使用して名前の衝突を避けるようにします。そうすれば、引数をクロージャに直接渡すことができます。

4.4 イベントを取得する

Grailsはスクリプトのイベントフックを提供しています。イベントフックとは、Grailsターゲット実行時やプラグインスクリプト実行時に発行されるイベントを取得して処理を行うことができる機能です。

仕組みはわざと単純でゆるく明記できるようになっています。起こりうるイベントは予測できないからです。なので、コアターゲットと同等のイベントが無い場合はプラグインスクリプトからトリガーされたイベントにフックする事も可能です。

イベントハンドラを定義する

イベントハンドラは_Events.groovyという名称のスクリプトで定義します。Grailsは次の場所からスクリプトを検索します:

  • USER_HOME/.grails/scripts - ユーザー固有のイベントハンドラ
  • PROJECT_HOME/scripts - アプリケーション固有のイベントハンドラ
  • PLUGINS_HOME/*/scripts - プラグイン固有のイベントハンドラ
  • GLOBAL_PLUGINS_HOME/*/scripts - グローバルプラグインによって提供されているイベントハンドラ

イベントが発生するたびに登録されている すべての ハンドラが実行されます。ハンドラの登録はGrailsによって自動的に行われることに注意してください。なので、必要な作業は関連する_Events.groovyファイルにそれらを宣言するだけです。

イベントハンドラは _Events.groovy で定義されている名前が "event" で始まっているブロックです。次の例のように_Events.groovyを記述して、/scripts ディレクトリに配置することによって、イベントハンドラを実装することができます:

eventCreatedArtefact = { type, name ->
   println "Created $type $name"
}

eventStatusUpdate = { msg -> println msg }

eventStatusFinal = { msg -> println msg }

ここでは三つのハンドラが指定されています。eventCreatedArtefacteventStatusUpdateeventStatusFinal。Grailsはいくつかの標準的なイベントを提供しています。詳細はコマンドラインリファレンスガイドを参照してください。たとえば、 compileコマンドは、次のようなイベントを発行させます。
  • CompileStart - sourceまたはtestsコンパイル開始時に発行されます。
  • CompileEnd - sourceまたはtestsコンパイル終了時に発行されます。

イベントトリガー

イベントを発行するには _GrailsEvents.groovy スクリプトをインクルードしてevent()クロージャを使用します:

includeTargets << grailsScript("_GrailsEvents")

event("StatusFinal", ["Super duper plugin action complete!"])

共通イベント

以下はいくつかの利用可能な共通イベントの一覧です:

イベントパラメータ説明
StatusUpdatemessage実行されているスクリプトのステータス、進捗メッセージを知らせる
StatusErrormessage実行されているスクリプトのエラーメッセージを 知らせる
StatusFinalmessageスクリプトの終了時に最終メッセージを知らせる。 スクリプトによっては完全終了時ではなく、コマ ンドの終了時に動作する
CreatedArtefactartefactType,artefactNamecreate-xxxxなどのアーティファクト生成スクリプトが、アーティファクトの生成完了時にアーティ ファクトタイプとアーティファクト名を知らせる
CreatedFilefileNameファイルがスクリプトによって生成されたときに ファイル名を知らせる
ExitingreturnCodeスクリプトが正常に終了したときに終了コードを 知らせる
PluginInstalledpluginNameプラグインのインストールが終了した後にプラグイン 名を知らせる
CompileStartkindコンパイル開始時にコンパイルする種類(source または tests)を知らせる
CompileEndkindコンパイル終了時にコンパイルした種類(source または tests)を知らせる
DocStartkindドキュメント生成時に、どのドキュメント生成(javadoc または groovydoc)が開始するかを知らせる
DocEndkindドキュメント生成完了時に、どのドキュメント生成(javadoc または groovydoc)が完了したかを知らせる
SetClasspathrootLoaderクラスパス初期化中にGrailsRootLoader が渡されるので、「rootLoader.addURL( … )」でクラスをGrailsRootLoader に追加できる
PackagingEndnoneGrailsアプリケーションのパッケージング完了時 (web.xml生成後、Tomcatサーバ起動前)に呼び出される

4.5 ビルドのカスタマイズ

Grailsは確かにものすごく固執したフレームワークであり、設定よりも規約という方式を主張していますが、それは様々な設定をできないという意味ではありません。このセクションでは、どのようにGrailsの標準的なビルドをカスタマイズする方法を解説します。

初期値

ビルド設定の中心部分は、ビルド時に有用な情報が含まれている grails.util.BuildSettingsクラスです。このクラスは、どこにコンパイルされるのか、アプリケーションが何に依存関係を持っているのか、どのような設定を保持しているのか、を制御します。

設定オプションと初期値は以下のようになります:
プロパティ設定オプション初期値
grailsWorkDirgrails.work.dir$USER_HOME/.grails/<grailsVersion>
projectWorkDirgrails.project.work.dir<grailsWorkDir>/projects/<baseDirName>
classesDirgrails.project.class.dir<projectWorkDir>/classes
testClassesDirgrails.project.test.class.dir<projectWorkDir>/test-classes
testReportsDirgrails.project.test.reports.dir<projectWorkDir>/test/reports
resourcesDirgrails.project.resource.dir<projectWorkDir>/resources
projectPluginsDirgrails.project.plugins.dir<projectWorkDir>/plugins
globalPluginsDirgrails.global.plugins.dir<grailsWorkDir>/global-plugins
verboseCompilegrails.project.compile.verbosefalse

BuildSettingsクラスは、他にもいくつかの読み取り専用のプロパティを持っています:

プロパティ説明
baseDirプロジェクトの場所。
userHomeユーザーのホームディレクトリ。
grailsHome使用中のGrailsのインストール先(nullの場合あり)。
grailsVersionプロジェクトで使用されているGrailsのバージョン。
grailsEnv現在のGrails環境。
compileDependenciesコンパイル時のプロジェクト依存関係のFileインスタンスのリスト。
testDependenciesテスト時のプロジェクト依存関係のFileインスタンスのリスト。
runtimeDependencies実行時のプロジェクト依存関係のFileインスタンスのリスト。

もちろんこれらのプロパティがぴったり合うとは限りません。幸いなことに、BuildSettingsのインスタンスのgrailsSettingspスクリプト変数を介して利用可能です。他のコードからもgrails.util.BuildSettingsHolder@クラスを使用してアクセスすることができます。でもこれは推奨されません。

初期値を上書きする

1つめの表内のすべてのプロパティは、システムプロパティや設定オプションで上書きすることができます。たとえば、プロジェクトの作業ディレクトリ(projectWorkDir)を変更するには、このようにコマンドを実行することができます:
grails -Dgrails.project.work.dir=work compile
grails-app/conf/BuildConfig.groovyに記述します:
grails.project.work.dir = "work"
注意点として、プロパティが依存しているプロパティのデフォルト値にも影響するので、このようにプロジェクトの作業ディレクトリを設定すると、コンパイルされたクラス、テストクラス、リソース、およびプラグインの場所を変更することにもなります。

システムプロパティと設定オプションの両方を指定した場合、システムプロパティはBuildConfig.groovyファイルの設定よりも優先順位が高いので、システムプロパティの値が設定されます。

BuildConfig.groovyファイルは、grails-app/conf/Config.groovyと兄妹関係にあります。前者は、ビルド時にのみ影響を及ぼすオプションを含んでいるのに対して、後者はアプリケーションの実行時に影響を与えるオプションを含んでいます。設定オプションは、1つめの表で示したオプション以外にも、サーブレットコンテナを動かすポート指定や、WARファイルにどのファイルを格納するかを決定する指定など、他にも指定可能なビルド設定が存在します。

使用可能なビルド設定

名前説明
grails.server.port.http組み込みのサーブレットコンテナを実行するポート番号。("run-app" と "run-war")
grails.server.port.httpsHTTPS用の組み込みのサーブレットコンテナを実行するポート番号。("run-app --https"と"run-war --https")
grails.config.base.webXmlアプリケーションで使用するカスタムのweb.xmlファイルへのパス。(web.xmlテンプレートを使用しない場合)
grails.compiler.dependenciesコンパイラのクラスパスに依存関係を追加する。"fileset()"を含んでいるクロージャに設定。
grails.testing.patternsテストに含まれるファイルを制御するためのAntパスのパターンリスト。パターンは、次のgrails.testing.nameSuffixに設定されているテストケースのサフィックス以外。
grails.testing.nameSuffixデフォルトでは、テストは"Tests"のサフィックスが設定されていますが、好きなようにオプション設定を変更することができます。
grails.project.war.file生成されるWARファイルの名称(拡張子を含む)のファイルパス。例として、"target/my-app.war" 等。
grails.war.dependenciesWARファイルの"WEB-INF/lib"階層に含む内容を、クロージャ内の"fileset()"でコントロール。
grails.war.copyToWebAppWARのルートディレクトリ階層に含む内容を、クロージャ内の"fileset()"でコントロール。
grails.war.resources最初の引数としてステージングディレクトリの場所を受け取れるクロージャを指定。クロージャ内でAntタスクを使用することで、WAR化される前にステージングディレクトリの内容を変更する事ができます。
grails.project.web.xmlGrailsがweb.xmlを生成する場所の指定。

4.6 AntとMaven

もし、あなたのプロジェクトチームや会社でAntやMavenなどのような標準的なビルドツールを利用している場合は、アプリケーションをビルドする時にGrailsのコマンドラインを使っていると一家の厄介者にされてしまいます。幸いなことに、Grailsビルドシステムは今日使われている主なビルドツールに簡単に統合することができます。(少なくともJavaプロジェクトで使用されているものへ)

Antへの統合

create-appコマンドでGrailsアプリケーションを作成した際に、Grailsは自動的にはApache Antのbuild.xmlを生成しません。integrate-withコマンドを使用して生成することが可能です。


grails integrate-with --ant

作成されたbuild.xmlファイルには、次のターゲットが含まれています:
  • clean - Grailsアプリケーションをクリーンします。
  • compile - アプリケーションのソースコードをコンパイルします。
  • test - Unitテストを実行します。
  • run - Grailsの"run-app"コマンド相当を実行します。
  • war - WARファイルを作成します。
  • deploy - デフォルトでは空ですが、自動配備を実装することができます。

これらは例えば、以下のようなAntコマンドで実行できます。

ant war

ビルドファイルは Apache Ivy をの依存性管理を使う準備ができています。必要に応じてGrailsが利用したり、またはそれ以外で利用される依存関係のあるJARファイルを自動的にダウンロードしてくることができるということです。それを使うにはローカルにGrailsをインストールする必要すらありません!CruiseControlJenkinsのような継続的インテグレーションツールを使う場合、特に便利でしょう。

これはGrailsのAntタスクを既存のGrailsビルドシステムにフックします。タスクは、Grailsの生成されたビルドファイル以外の利用可能なスクリプトの実行を許可されています。タスクを使用するには、まずこう宣言します。
<taskdef name="grailsTask"
         classname="grails.ant.GrailsTask"
         classpathref="grails.classpath"/>

ここで疑問が生じます。どれが"grails.classpath"でしょうか。タスク自体は"grails-bootstrap"JARの一部です。なので、少なくともクラスパス上にある必要があります。また、"groovy-all" JARを含める必要があります。タスク宣言ではこれらを仕使用する必要があります!次の表は、どんな属性が利用可能かを示しています。

属性説明必須
homeビルドに使用するGrailsのインストールディレクトリの場所。パスが指定されている場合を除き必須です。
classpathrefGrailsがロードする基点となるクラスパス。"grails-bootstrap"を含めなければなりません。また、"grails-scripts"を含めるべきです。homeが設定されていなかったり、classpath要素を使う場合は必須です。
scriptGrailsスクリプトの実行名。例えば "TestApp"。必須です。
argsスクリプトに渡す引数。例えば "-unix -xml"。必須ではありません。デフォルトは "" です。
environmentスクリプト実行時のGrails環境変数。必須ではありません。デフォルトはスクリプトのデフォルトになります。
includeRuntimeClasspath高度な設定です。 trueの場合、アプリケーション実行時クラスパスをクラスパスに追加します。必須ではありません。 デフォルトはtrueです。

タスクネスト要素をサポートします。こられの全ては標準的なAntの構造となっています。

  • classpath - ビルド時のクラスパス。(GantとGrailsスクリプトロード時に使用)
  • compileClasspath - アプリケーションコンパイル時のクラスパス。
  • runtimeClasspath - アプリケーションとWARパッケージ実行時のクラスパス。通常compileClasspathに全てが含まれます。
  • testClasspath - コンパイル時と、テスト実行時のクラスパス。通常runtimeClasspathに全てが含まれます。

どうやってパスを追加するかはあなた次第です。もし、homeを利用しており、自分自身の依存関係をlibディレクトリに設定している場合は、これらを使う必要はありません。こららの利用例としては、生成された新しいアプリケーションのAntビルドファイルを見てみましょう。

Mavenの統合

GrailsはMavenプラグインを介して Maven 2":http://maven.apache.org との統合を提供しています。現在のMavenプラグインもこれを基礎としいますが、偉業を成し遂げたOctoのバージョンに取って代わります。

準備

新しいプラグインを使用するのに必要なことは、Maven2をインストールし設定することです。なぜなら、Grailsを別途インストールする必要はないからです!

GrailsのMaven2統合は、Maven 2.0.9以上を対象として設計・テストされています。それ以前のバージョンでは動作しません。

既定のmvnコマンド設定ではGrails環境で実行するための十分なメモリを供給できません。パフォーマンス低下を防止するため、次の環境変数を追加することをお勧めします:

export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=256"

GrailsのMavenのプロジェクトを作成する

Maven化されたGrailsプロジェクトを作成するには、単に以下のコマンドを実行します:

mvn archetype:generate -DarchetypeGroupId=org.grails \
    -DarchetypeArtifactId=grails-maven-archetype \
    -DarchetypeVersion=1.3.2 \
    -DgroupId=example -DartifactId=my-app

アプリケーションで使用するGrailsバージョン、グループID、アーティファクトIDを指定するだけで必要な内容が書き込まれます。このコマンドで新規にMavenプロジェクトのPOMと他のファイルが生成されます。生成された内容を見るとGrailsアプリケーションで必要なものが見つかりません。次のステップでいつも通りの物が出来上がります。 はじめに、ターゲットJDKをJava 6にセットします。my-app/pom.xmlを開いて、次のように変更します:
<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>
上記を、以下のように変更します。
<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
</plugin>

これでプロジェクト構造を作成する環境が整いました。

cd my-app
mvn initialize

以下のようなメッセージが出る場合:

Resolving plugin JAR dependencies …
:: problems summary ::
:::: WARNINGS
        module not found: org.hibernate#hibernate-core;3.3.1.GA

application.properties に手動でプラグインを追加する必要があります:

plugins.hibernate=2.0.0
plugins.tomcat=2.0.0

そして実行します。

mvn compile

これで、hibernateとtomcatプラグインがインストールされます。

これで、Grailsアプリケーションのすべての準備が整いました。プラグインは標準ビルドサイクルに統合され、Mavenの標準的なアプリケーションのビルドやパッケージングのフェーズで利用できるようになります: mvn cleanmvn compilemvn testmvn packagemvn install

また、MavenのゴールとしてラッピングされたGrailsコマンドを使うこともできるようになっています:

  • grails:create-controller - create-controllerコマンドを呼び出します。
  • grails:create-domain-class - create-domain-classコマンドを呼び出します。
  • grails:create-integration-test - create-integration-testコマンドを呼び出します。
  • grails:create-pom - 既存のGrailsプロジェクト用に新しいMavenのPOMファイルを作成します。
  • grails:create-script - create-scriptコマンドを呼び出します。
  • grails:create-service - create-serviceコマンドを呼び出します。
  • grails:create-taglib - create-tag-libコマンドを呼び出します。
  • grails:create-unit-test - create-unit-testコマンドを呼び出します。
  • grails:exec - 任意のGrailsのコマンドラインスクリプトを呼び出します。スクリプトを実行する任意のGrailsのコマンドライン
  • grails:generate-all - generate-allコマンドを呼び出します。
  • grails:generate-controller - generate-controllerコマンドを呼び出します。
  • grails:generate-views - generate-viewsコマンドを呼び出します。
  • grails:install-plugin - install-pluginコマンドを呼び出します。
  • grails:install-templates - install-templatesコマンドを呼び出します。
  • grails:list-plugins - list-pluginsコマンドを呼び出します。
  • grails:package - packageコマンドを呼び出します。
  • grails:run-app - run-appコマンドを呼び出します。
  • grails:uninstall-plugin - uninstall-pluginコマンドを呼び出します。

完全なリストはmvn grails:helpで確認して下さい。

既存プロジェクトをMaven化する

新しく始めるには、プロジェクトを新規作成するのが最善の方法ですが、既にプロジェクトが存在する場合はどうしたらいいでしょうか?新しくプロジェクトを作成したくないし、内容を上書きコピーもしたくないでしょう。解決策は以下のMavenコマンドを使用して既存プロジェクトにPOMファイルを作ることです。(バージョン番号は既存のGrailsプロジェクトのバージョンで置き換えて下さい)

mvn org.grails:grails-maven-plugin:1.3.2:create-pom -DgroupId=com.mycompany
コマンドが完了したら、すぐにmvn packageのような標準フェーズで使い始めることができます。POMファイルを作成する際はグループIDを指定する必要があることに注意してください。

また、対象JDKバージョンをJDK6に設定したい場合は、上記を参照して下さい。

Grailsコマンドをフェーズに追加する

Grailsが作成した標準のPOMファイルは、Grailsのビルドフェーズに対応したコアコマンドに適切に付属しています。"compile" は "compile"フェーズに、"war" は "package"フェーズに。特定のフェーズにプラグインコマンドを付属させたい場合には役立ちません。古典的な例は、機能テストです。どうやって機能テストが統合テストフェーズの間に(あなた使用しているどんなプラグインを使った場合でも)実行されるのかを確かめるのでしょうか?

恐れる必要はありません、すべて可能です。この場合には、"execution"ブロックを追加してフェーズに関連付けることができます。
<plugin>
    <groupId>org.grails</groupId>
    <artifactId>grails-maven-plugin</artifactId>
    <version>1.3.2</version>
    <extensions>true</extensions>
    <executions>
        <execution>
            <goals></goals>
        </execution>
        <!-- Add the "functional-tests" command to the "integration-test" phase -->
        <execution>
            <id>functional-tests</id>
            <phase>integration-test</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <command>functional-tests</command>
            </configuration>
        </execution>
    </executions>
</plugin>

またこれは grails:exec goal の実演にもなっています。Grailsのどんなコマンドも実行できるのです。単にコマンド名を渡すcommandシステムプロパティと、オプションで引数を渡すargsプロパティがあります:

mvn grails:exec -Dcommand=create-webtest -Dargs=Book

GrailsのMavenプロジェクトのデバッグ

Mavenは "mvnDebug" コマンドを使用して、デバッグモードで起動することができます。デバッグでGrailsアプリケーションを起動するには、単純に以下のコマンドを実行します:

mvnDebug grails:run-app

プロセスは起動時に停止して、デバッガをポート8000上で待ち受けます。

デバッガのより詳細に制御する必要がある場合は、環境変数のMAVEN_OPTSを指定して標準の "mvn" コマンドを使用してMavenを起動させます。

MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
mvn grails:run-app

問題提起

Maven統合を使っている際になにか問題に直面した場合、GRAILS-3547のJIRAにサブタスクとして問題を提起して下さい。