Dienstag, 29. Dezember 2009

Grails App Engine Ant-Macro Exception

Die DataNucleus EnhancerTask der App Engine macht mir in meinen Grails Projekten relativ häufig Probleme. Das ganze sieht so aus, dass ich beim kompilieren der sourcen auf folgende Fehlermeldung stoße:

C:\Programmier-Tools\appengine-java-sdk-1.3.0\config\user\ant-macros.xml:95: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.6.0_14\jre\bin\java.exe": CreateProcess error=87, Falscher Parameter
gant.TargetExecutionException: : The following error occurred while executing this line:
C:\Programmier-Tools\appengine-java-sdk-1.3.0\config\user\ant-macros.xml:95: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.6.0_14\jre\bin\java.exe": CreateProcess error=87, Falscher Parameter
...
...
...
Caused by: C:\Programmier-Tools\appengine-java-sdk-1.3.0\config\user\ant-macros.xml:95: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.6.0_14\jre\bin\java.exe": CreateProcess error=87, Falscher Parameter
at org.apache.tools.ant.taskdefs.Java.fork(Java.java:774)
at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:194)
at org.apache.tools.ant.taskdefs.Java.execute(Java.java:104)
at com.google.appengine.tools.enhancer.EnhancerTask.execute(EnhancerTask.java:99)
...
...
...

Diesen Fehler kann man beheben, wenn man in der ant-marcos.xml, die sich im $APPENGINE_HOME$/config/user Verzeichnis befindet, eine Anpassung in der macrodef "enhance_war" vornimmt. Diese beginnt (in der Version 1.3.0) in der Zeile 90.
In der macrodef wird folgendes fileset definiert (Z.102):

<fileset dir="@{war}/WEB-INF/classes" includes="**/*.class"/>

Wenn wir dieses fileset auf die Klassen für unsere Anwendung einschränken, dann taucht die Fehlermeldung nichtmehr auf und das kompilieren und enhancen der Domain Klassen läuft wieder durch.

Liegen die Klassen unserer Anwendung also in einem Package de.myproject, dann sieht das fileset folgendermaßen aus:

<fileset dir="@{war}/WEB-INF/classes/de/myproject" includes="**/*.class"/>

Achtung: Nicht vergessen diese Zeile bei einer neuen Version des App-Engine SDKs wieder anzupassen!