2011年7月16日土曜日

PlayFrameworkチュートリアルでcoberturaのエラー

最近、週末はPlayFrameworkの勉強をしています。
非公式のようですが、マニュアルが日本語化されているのでスムーズに勉強できます。
http://playdocja.appspot.com/

チュートリアルが逸脱で、今まで様々な環境のチュートリアルを見てきましたが、PlayFrameworkのチュートリアルは群を抜いて分かりやすいです。(といっても一回読んだだけで全てを理解するのは難しいですが)

基本的に書いてあるとおりに勉強していけば問題ないのですが、最後の方のテストの完了で躓いたので備忘録としてまとめます。

ページ下部の方に、コードカバレッジ計測、という項目がありますが、公式も含めてここに書かれている通りにしてもエラーが発生します。
説明どおりにapplication.confを修正してEclipseからPlayをテストモードで起動しても、Play終了時にcoberturaはコードカバレッジレポートを生成してくれません。
何故かというとPlay本体にはcoberturaは含まれていないからです。

以下、PlayをEclipseから起動した際のコンソールビューの内容です。
---------------------------------------------
Listening for transport dt_socket at address: 8000
00:09:42,662 INFO ~ Starting /home/dev-user/work/play_projects/yabe
00:09:42,666 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.crud)
00:09:42,667 INFO ~ Module crud is available (/home/dev-user/local/play-1.2.1/modules/crud)
00:09:42,667 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.secure)
00:09:42,667 INFO ~ Module secure is available (/home/dev-user/local/play-1.2.1/modules/secure)
00:09:42,667 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.cobertura)
00:09:42,668 ERROR ~ Module cobertura will not be loaded because /home/dev-user/local/play-1.2.1/modules/cobertura does not exist
00:09:43,380 WARN ~ Actually play.tmp is set to null. Set it to play.tmp=none
00:09:43,391 WARN ~ You're running Play! in DEV mode
---------------------------------------------

なので、coberturaをインストールしなければなりません。
インストールにはplay installコマンドを使います。
プロジェクトディレクトリに移動したら「play install cobertura」を実行します。これだけでインストール完了です。
続けて「play test」を実行してからhttp://localhost:9000/@testsにアクセスして、テストを実行してからコンソールでctrl-cでPlayサーバを停止すると、正常にcoberturaがコードカバレッジレポートを生成してくれます。

ただし、Eclipseを使っている場合はこれだけではエラーになってしまいます。
通常、クラスパスを変更するような修正を行った場合、プロジェクトディレクトリで再度eclipsifyコマンドを実行する必要がありますが、今回はそれを実行してもEclipseからテストモードでPlayを起動してアクセスするとエラーが表示されてしまいました。



EclipseのコンソールビューはJavaのエラーが延々と
--------------------------------------------
Listening for transport dt_socket at address: 8000
20:43:48,811 INFO ~ Starting /home/dev-user/work/play_projects/yabe
20:43:48,816 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.crud)
20:43:48,817 INFO ~ Module crud is available (/home/dev-user/local/play-1.2.1/modules/crud)
20:43:48,817 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.secure)
20:43:48,817 INFO ~ Module secure is available (/home/dev-user/local/play-1.2.1/modules/secure)
20:43:48,817 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.cobertura)
20:43:48,817 INFO ~ Module cobertura is available (/home/dev-user/local/play-1.2.1/modules/cobertura-2.1)
20:43:49,465 WARN ~ You're running Play! in DEV mode
~
~ Go to http://localhost:9000/@tests to run the tests
~
20:43:49,578 INFO ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...
20:44:07,139 ERROR ~

@67578a30n
Internal Server Error (500) for request GET /@tests

Compilation error (In {module:cobertura-2.1}/app/controllers/Cobertura.java around line 6)
The file {module:cobertura-2.1}/app/controllers/Cobertura.java could not be compiled. Error raised is : play.modules.cobertura.CoberturaPlugin cannot be resolved

play.exceptions.CompilationException: play.modules.cobertura.CoberturaPlugin cannot be resolved
at play.classloading.ApplicationCompiler$2.acceptResult(ApplicationCompiler.java:246)
at org.eclipse.jdt.internal.compiler.Compiler.handleInternalException(Compiler.java:672)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:516)
at play.classloading.ApplicationCompiler.compile(ApplicationCompiler.java:278)
at play.classloading.ApplicationClasses$ApplicationClass.compile(ApplicationClasses.java:249)
at play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:150)
at play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:84)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at play.classloading.ApplicationClasses.getAssignableClasses(ApplicationClasses.java:61)
at play.classloading.ApplicationClassloader.getAssignableClasses(ApplicationClassloader.java:435)
at {module:crud}/app/views/tags/crud/types.tag.(line:3)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:213)
at play.templates.GroovyTemplate$ExecutableTemplate.invokeTag(GroovyTemplate.java:347)
at {module:crud}/conf/routes.(line:4)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:213)
at play.templates.Template.render(Template.java:26)
at play.mvc.Router.parse(Router.java:162)
at play.mvc.Router.parse(Router.java:190)
at play.mvc.Router.parse(Router.java:164)
at play.mvc.Router.load(Router.java:50)
at play.mvc.Router.detectChanges(Router.java:219)
at Invocation.HTTP Request(Play!)
20:44:07,561 ERROR ~

@67578a30o
Internal Server Error (500) for request GET /favicon.ico

Compilation error (In {module:cobertura-2.1}/app/controllers/Cobertura.java around line 6)
The file {module:cobertura-2.1}/app/controllers/Cobertura.java could not be compiled. Error raised is : play.modules.cobertura.CoberturaPlugin cannot be resolved

play.exceptions.CompilationException: play.modules.cobertura.CoberturaPlugin cannot be resolved
at play.classloading.ApplicationCompiler$2.acceptResult(ApplicationCompiler.java:246)
at org.eclipse.jdt.internal.compiler.Compiler.handleInternalException(Compiler.java:672)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:516)
at play.classloading.ApplicationCompiler.compile(ApplicationCompiler.java:278)
at play.classloading.ApplicationClasses$ApplicationClass.compile(ApplicationClasses.java:249)
at play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:150)
at play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:84)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at play.classloading.ApplicationClasses.getAssignableClasses(ApplicationClasses.java:61)
at play.classloading.ApplicationClassloader.getAssignableClasses(ApplicationClassloader.java:435)
at {module:crud}/app/views/tags/crud/types.tag.(line:3)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:213)
at play.templates.GroovyTemplate$ExecutableTemplate.invokeTag(GroovyTemplate.java:347)
at {module:crud}/conf/routes.(line:4)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:213)
at play.templates.Template.render(Template.java:26)
at play.mvc.Router.parse(Router.java:162)
at play.mvc.Router.parse(Router.java:190)
at play.mvc.Router.parse(Router.java:164)
at play.mvc.Router.load(Router.java:50)
at play.mvc.Router.detectChanges(Router.java:219)
at Invocation.HTTP Request(Play!)
---------------------------------------------------

EclipseからPlayを起動する際のクラスパスの設定が異なっているためで、eclipsifyではcoberturaを追加してくれない様です。

そこで、Eclipseの実行構成から、eclipsifyで自動的に生成されているサーバに、coberturaのjarファイルを手動で追加してあげる必要があります。







ユーザエントリーを選択して、外部Jar追加を選択後、cobertura/lib/*.jarを選択して追加してください。
それが終わった後にEclipseからPlayサーバをテストモードで起動すれば、問題なくcoberturaが動作します。

0 件のコメント: