Maven, Netbeans et Google App Engine

Comme promis dans mon précédent article, voici quelques explications sur la configuration du POM requise pour créer une application compatible avec GAE.

Les éléments présentés ci-dessous ne le sont qu'à titre d'exemple, le but étant essentiellement de les regrouper de manière accessible.

Server de test

Lors de la phase de développement, il est possible d'utiliser Maven pour démarrer un server App Engine de test basé sur Jetty :


<plugin>
 <groupId>org.mortbay.jetty</groupId>
 <artifactId>jetty-maven-plugin</artifactId>
 <version>8.0.1.v20110908</version>
 <configuration>
  <scanIntervalSeconds>1</scanIntervalSeconds>
  <stopKey>stop-jetty</stopKey>
  <stopPort>9999</stopPort>
 </configuration>
</plugin>
<plugin>
 <groupId>com.google.appengine</groupId>
 <artifactId>appengine-maven-plugin</artifactId>
 <version>1.8.0</version>
</plugin>

Configuration de Netbeans

Pour démarrer ce serveur, il faut également configurer les actions du projet :

Activer le debug du serveur de test avec Netbeans

Dans un profil par exemple :


 <profile>
 <id>appengine</id>
 <properties>
  <env>appengine</env>
 </properties>
 <activation>
  <activeByDefault>true</activeByDefault>
 </activation>
 <build>
  <plugins>
   <plugin>
    <groupId>com.google.appengine</groupId>
    <artifactId>appengine-maven-plugin</artifactId>
    <version>1.8.0</version>
    <configuration>
     <jvmFlags>
      <jvmFlag>-Xdebug</jvmFlag>
      <jvmFlag>-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n</jvmFlag>
     </jvmFlags>
    </configuration>
   </plugin>
  </plugins>
 </build>
</profile>

De cette manière, après le lancement du serveur de test avec la commande mvn appengine:devserver, il sera possible d'attacher un debugger au port du processus distant.

Dépendances à supprimer

Suite aux explications données dans l'article précédent, les dépendances ci-dessous ne sont plus nécessaires :

  • mysql (ou autre JAR de driver/connector de SGBD)
  • ehcache
  • aspectj
  • hibernate
  • spring AOP
  • spring tx (pour les transactions)

Couche de persistence

Voici les dépendances nécessaires :


<dependency>
 <groupId>com.googlecode.objectify</groupId>
 <artifactId>objectify</artifactId>
 <version>4.0b3</version>
</dependency>
<dependency>
 <groupId>com.google.appengine.orm</groupId>
 <artifactId>datanucleus-appengine</artifactId>
 <version>2.0.1.1</version>
 <!-- Need to exclude the enhancer since it interfere with the enhancer plugin.
 <exclusions>  
  <exclusion>  
   <groupId>org.datanucleus</groupId>  
   <artifactId>datanucleus-enhancer</artifactId>  
  </exclusion>  
 </exclusions> -->  
</dependency>
<dependency>
 <groupId>org.datanucleus</groupId>
 <artifactId>datanucleus-core</artifactId>
 <version>3.0.11</version>
</dependency>
<dependency>
 <groupId>org.datanucleus</groupId>
 <artifactId>datanucleus-api-jpa</artifactId>
 <version>3.0.11</version>
</dependency>
<dependency>
 <groupId>org.apache.geronimo.specs</groupId>
 <artifactId>geronimo-jpa_2.0_spec</artifactId>
 <version>1.0</version>
</dependency>
<dependency>
 <groupId>javax.jdo</groupId>
 <artifactId>jdo-api</artifactId>
 <version>3.0</version>
</dependency>

Pour activer le tissage des classes métier par Datanucleus lors de la compilation (enhancer), voici les plugins à déclarer dans la section build :


<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <version>2.14.1</version>
</plugin>
<plugin>
 <groupId>org.datanucleus</groupId>
 <artifactId>maven-datanucleus-plugin</artifactId>
 <version>3.0.2</version>
 <configuration>
  <api>JPA</api>
  <verbose>true</verbose>             
  <mappingIncludes>**/domain/*.class</mappingIncludes>
  <fork>false</fork>
 </configuration>
 <executions>
  <execution>
   <phase>process-classes</phase>
   <goals>
    <goal>enhance</goal>
   </goals>
  </execution>
 </executions>
</plugin>

Dans l'article suivant, je présenterai les autres fichiers de configuration nécessaires, notamment la configuration de Spring pour la persistence.


Fichier(s) joint(s) :

2 commentaires:

Jürgen Jatzkowski a dit…

Merci, that helped me start debugging my appengine application :)

Paul-Emmanuel Faidherbe a dit…

You are welcome, good luck!