
Apache AntではScriptタスクを使うとJavaScirptを実行できる。 しかしJavaScriptで例外が上がると、表示される内容の9割以上がRhinoScriptEngineの例外になる。 興味があるJavaScriptの例外は一行だけ。
例外が起きるbuild.xml
<?xml version="1.0" encoding="UTF-8"?> <project default="a"> <target name="a"> <script language="javascript"><![CDATA[ throw 'わあ!'; ]]></script> </target> </project>
実行すると
C:\Users\ledsun\workingDirectory>ant
Buildfile: C:\Users\ledsun\workingDirectory\build.xml
a:
BUILD FAILED
C:\Users\ledsun\workingDirectory\build.xml:4: javax.script.ScriptException: sun.org.mozilla.javascript.internal.JavaScriptException: わあ! (<Unknown source>#2) in <Unknown source> at line number 2
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:156)
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:170)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tools.ant.util.ReflectUtil.invoke(ReflectUtil.java:108)
at org.apache.tools.ant.util.ReflectWrapper.invoke(ReflectWrapper.java:81)
at org.apache.tools.ant.util.optional.JavaxScriptRunner.evaluateScript(JavaxScriptRunner.java:103)
at org.apache.tools.ant.util.optional.JavaxScriptRunner.executeScript(JavaxScriptRunner.java:67)
at org.apache.tools.ant.taskdefs.optional.Script.execute(Script.java:52)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:392)
at org.apache.tools.ant.Target.performTasks(Target.java:413)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
at org.apache.tools.ant.Main.runBuild(Main.java:811)
at org.apache.tools.ant.Main.startAnt(Main.java:217)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Total time: 0 seconds
C:\Users\ledsun\workingDirectory>
まったくもって見づらい。JavaScriptで例外をキャッチするとAntの実行結果がBuild Successになってしまう。 Antの設定でエラーを伝えようにもScriptタスクにはそれらしい属性が無い。 Execタスクにはfailonerrorがあるのに!
解決策
project.setProperty で Antプロジェクトに変数を設定し、Failタスクでエラーを検出します*1。
<?xml version="1.0" encoding="UTF-8"?> <project default="a"> <target name="a"> <script language="javascript"><![CDATA[ try{ throw ''; }catch(e){ project.setProperty('fail', ''); } ]]></script> <fail if="fail" message="JavaScriptでエラーが起きた" /> </target> </project>
参考にしたStack Overflow : ant javascript failonerror
*1:プロパティに例外メッセージを設定しておけば実行結果に表示することも可能です。具体例はStack Overflowの例を見て下さい。




