Google App Engine, Maven, Eclipse

Google App Engine je jedna z průkopnických služeb typu PaaS (Platform as Service), která umožňuje s určitými omezeními běh webových java aplikací. Pro Eclipse existuje Google Eclipse Plugin - usnadňuje tvorbu aplikace určené pro Google App Engine, včetně běhu lokálního testovacího serveru, deploy na Google App Engine, ...

Pro správu knihoven na svých projektech využívám užitečný nástroj: Maven - no a nutno říct, že pohodlí, které přináší, jsem se nechtěla vzdát ani při tvorbě aplikace pro Google App Engine v prostředí Eclipse a s využitím Google Eclipse Pluginu. Takže úkol číslo jedna: rozchodit Maven a Google App Engine v Eclipse. Rozhodně to nebylo zcela přímočaré, ale jakžtakž mi to funguje, takže tady je návod - snad se bude někomu hodit (dokumentace jsem opravdu moc nenašla):

1. Předpoklady:
[a]
Eclipse IDE for Java EE Developers (tedy především podpora WTP - Web Tool Platform)

[b]
Nainstalovaný m2eclipse plugin (včetně extensions - m2eclipse extras!) - návod zde: http://m2eclipse.sonatype.org/installing-m2eclipse.html

[c]
Nainstalovaný google eclipse plugin

2. Postup vytvoření projektu

[a]
Nejjednodušší je začít od vytvoření nového standardního Maven projektu - a to buď úplně nového pomocí průvodce (File -> New Project)



nebo z existujícího zdrojového kódu (File -> Import...)




[b]
Důležité části z pom.xml:

[b - 1]
Knihovny, které jsou obsaženy v Google App Engine SDK - ve složce user (a chceme-li v projektu použít i persistentní ukládání dat, tak také ve složce user/orm). V testovacím projektu jsem používala SDK verze 1.4.2 (takže verze použitých "dependencies" odpovídají verzím v dané SDK - v příkladu tedy neuvádím)


<dependency>
<groupId>javax.jdo</groupId>
<artifactId>jdo2-api</artifactId>
<version>${jdo.version}</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>transaction-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<version>${geronimo-jta.version}</version>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jpa_3.0_spec</artifactId>
<version>${geronimo-jpa.version}</version>
</dependency>
<dependency>
<groupId>com.google.appengine.orm</groupId>
<artifactId>datanucleus-appengine</artifactId>
<version>${datanucleus-appengine.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>${datanucleus.version}</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>transaction-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-jpa</artifactId>
<version>${datanucleus.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>${gae.version}</version>
</dependency>
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-labs</artifactId>
<version>${gae.version}</version>
</dependency>
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-jsr107cache</artifactId>
<version>${gae.version}</version>
</dependency>


[b - 2]

Do sekce build je třeba zahrnout maven plugin pro Google App Engine a Data Nucleus Enhancer Plugin.


<build>
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/${project.name}/WEB-INF/classes</outputDirectory>
<plugins>
<plugin>
<groupId>net.kindleit</groupId>
<artifactId>maven-gae-plugin</artifactId>
<version>${maven-gae-plugin.version}</version>
<dependencies>
<dependency>
<groupId>net.kindleit</groupId>
<artifactId>gae-runtime</artifactId>
<version>${gae.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</plugin>
<!-- This plug-in "enhances" your domain model objects (i.e. makes them
persistent for datanucleus) -->
<plugin>
<groupId>org.datanucleus</groupId>
<artifactId>maven-datanucleus-plugin</artifactId>
<version>${datanucleus-plugin.version}</version>
<configuration>
<!-- Make sure this path contains your persistent classes! -->
<mappingIncludes>**/model/*.class, **/model/*.jdo</mappingIncludes>
<verbose>true</verbose>
<!-- <enhancerName>ASM</enhancerName> -->
<api>JDO</api>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>${datanucleus.version}</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>transaction-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-rdbms</artifactId>
<version>${datanucleus-rdbms.version}</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-enhancer</artifactId>
<version>${datanucleus-enhancer.version}</version>
</dependency>
<dependency>
<groupId>javax.jdo</groupId>
<artifactId>jdo2-api</artifactId>
<version>${jdo.version}</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>transaction-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>


Důležité:
1) nastavit správně outputDirectory, jak je uvedeno v příkladě
2) nastavit mappingIncludes u data nucleus pluginu - cesta k třídám a metadatům pro enhancer


[c]
Nakonfigurovat build path pro daný projekt
- je třeba přidat Google App Engine SDK,



a důležité: pak v záložce Order and Export přesunout Maven Dependencies až nakonec!

[d]
V properties projektu nastavit použití Google App Engine:



[e]
Kontrola "builders" projektu:



3. Spuštění projektu


Spouštět projekt na lokálním serveru lze standardně s využitím Google Eclipse Pluginu:

Comments

Popular posts from this blog

Hibernate delete and update queries with joins

Access application Google Drive account from javascript without client side authorization dialog

Hibernate schema export with Hibernate Validator constraints accepted and Spring configured persistence