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

How to set width of a table within Twitter Bootstrap