How to use Google App Engine Java with Maven

Posted: January 08, 2010

We all want to use Google App Engine with Maven, but Google stopped deploying GAE/J releases to their Maven repository for some reason. This article explains how to use Maven with App Engine. It also explains how to setup a local Maven repository. These instructions assume you're using Linux.

Step 1 - Setup a Maven Repository

You need a local Maven repository. If you already have one setup, skip this step.

I have a VPS running Apache, and here's the steps I followed:

# create a new shell account to use to publish maven artifacts
useradd maven

# set a password for this account
passwd maven

cd /www/mydocroot
mkdir maven
chown maven maven

Step 2 - Register your repository with your local settings file

I'm assuming you're on Linux here.

cd $HOME
cd .m2   (you may have to mkdir ~/.m2 if it doesn't exist already)
vi settings.xml

You need to add a <server> block for your repository. My settings.xml looks like this:

<settings>
    <servers>
    <server>
      <id>bitmechanic</id>
      <username>maven</username>
      <password>yourpasswordhere</password>
      <filePermissions>664</filePermissions>
      <directoryPermissions>775</directoryPermissions>
      <configuration></configuration>
    </server>
    </servers>
</settings>

We will use the value you put in id in a moment.

Step 3 - Download and unzip the App Engine zip

Change the URL to whatever version of App Engine you're downloading.

  cd /tmp
  wget http://googleappengine.googlecode.com/files/appengine-java-sdk-1.3.0.zip
  unzip appengine-java-sdk-1.3.0.zip

Step 4 - Create a bash script to import the relevant JARs to your repository

  cd /tmp
  vi app_engine_to_mvn.sh

Paste this in and edit the 3 variables at the top as desired.

#!/bin/sh                                                                                                                                                   

# EDIT THESE:
# version of app engine:
VERSION=1.3.0

# your repository id from settings.xml:
REPOSITORY=bitmechanic

# url for deployment.  here's what an scp one looks like
# path should be to the directory you made in step 1 above
URL=scp://myhost.com/www/mysite.com/htdocs/maven

# This should stay as is
mvn deploy:deploy-file -DgroupId=com.google -DartifactId=appengine-tools -Dversion=$VERSION \
  -Dpackaging=jar -Dfile=lib/appengine-tools-api.jar -Durl=$URL -DrepositoryId=$REPOSITORY

mvn deploy:deploy-file -DgroupId=com.google -DartifactId=appengine-local-runtime-shared \
  -Dversion=$VERSION -Dpackaging=jar -Dfile=lib/shared/appengine-local-runtime-shared.jar \
  -Durl=$URL -DrepositoryId=$REPOSITORY

mvn deploy:deploy-file -DgroupId=com.google -DartifactId=appengine-local-runtime \
  -Dversion=$VERSION -Dpackaging=jar -Dfile=lib/impl/appengine-local-runtime.jar \
  -Durl=$URL -DrepositoryId=$REPOSITORY

mvn deploy:deploy-file -DgroupId=com.google -DartifactId=appengine-api-stubs -Dversion=$VERSION \
  -Dpackaging=jar -Dfile=lib/impl/appengine-api-stubs.jar -Durl=$URL -DrepositoryId=$REPOSITORY

mvn deploy:deploy-file -DgroupId=com.google -DartifactId=appengine-api-labs -Dversion=$VERSION \
  -Dpackaging=jar -Dfile=lib/impl/appengine-api-labs.jar -Durl=$URL -DrepositoryId=$REPOSITORY

mvn deploy:deploy-file -DgroupId=com.google -DartifactId=appengine-sdk-api -Dversion=$VERSION \
  -Dpackaging=jar -Dfile=lib/impl/appengine-api.jar -Durl=$URL -DrepositoryId=$REPOSITORY

Step 5 - Run app_engine_to_mvn.sh

chmod 755 app_engine_to_mvn.sh
cd appengine-java-sdk-1.3.0
../app_engine_to_mvn.sh

This will run a bunch of maven commands to import 6 JARs to your local repository. Maven will report errors if something goes wrong.

Step 6 - Add dependencies to your pom.xml

I've found that there are 6 JAR files that are useful to add:

        <dependency>
            <groupId>com.google</groupId>
            <artifactId>appengine-tools</artifactId>
            <version>1.3.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.google</groupId>
            <artifactId>appengine-local-runtime-shared</artifactId>
            <version>1.3.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.google</groupId>
            <artifactId>appengine-local-runtime</artifactId>
            <version>1.3.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.google</groupId>
            <artifactId>appengine-api-stubs</artifactId>
            <version>1.3.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.google</groupId>
            <artifactId>appengine-sdk-api</artifactId>
            <version>1.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.google</groupId>
            <artifactId>appengine-api-labs</artifactId>
            <version>1.3.0</version>
        </dependency>

That's it!!