Search This Blog

18 April 2010

Galatea - A Maven/Android Archetype

After my experience writing an archetype for Red Dwarf; I decided to do the same thing for Android.  This archetype is based on the maven-android-plugin. I'd like to thank Hugo for helping me get the configuration correct.   So let's get started.

As before...
F:\work>mvn archetype:generate -DarchetypeCatalog=http://kallisti.eoti.org:8081/content/repositories/snapshots/archetype-catalog.xml
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-archetype-plugin:2.0-alpha-5-SNAPSHOT:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: http://kallisti.eoti.org:8081/content/repositories/snapshots/archetype-catalog.xml -> ardor3d-archetype (null)
2: http://kallisti.eoti.org:8081/content/repositories/snapshots/archetype-catalog.xml -> kryten-archetype (null)
3: http://kallisti.eoti.org:8081/content/repositories/snapshots/archetype-catalog.xml -> galatea-archetype (null)
4: http://kallisti.eoti.org:8081/content/repositories/snapshots/archetype-catalog.xml -> kryten-archetype (null)
Choose a number: : 3
[INFO] snapshot org.eoti.galatea:galatea-archetype:1.0-SNAPSHOT: checking for updates from eoti-public
[WARNING] *** CHECKSUM FAILED - Checksum failed on download: local = 'c4696ce0aeee29d53523e63f02230636518f8ad2'; remote = 'deb2361707aa66b51d4055be6452e818b9283be2' - RETRYING
[WARNING] *** CHECKSUM FAILED - Checksum failed on download: local = 'c4696ce0aeee29d53523e63f02230636518f8ad2'; remote = 'deb2361707aa66b51d4055be6452e818b9283be2' - IGNORING
Define value for property 'groupId': : org.eoti.android.test
Define value for property 'artifactId': : TestAndroid
Define value for property 'version':  1.0-SNAPSHOT: :
Define value for property 'package':  org.eoti.android.test: :
Confirm properties configuration:
groupId: org.eoti.android.test
artifactId: TestAndroid
version: 1.0-SNAPSHOT
(hit enter)
package: org.eoti.android.test
(hit enter)
 Y: : (hit enter)
[WARNING] Don't override file F:\work\TestAndroid\src\main\android\res\values\strings.xml
[WARNING] Don't override file F:\work\TestAndroid\src\main\android\res\layout\main.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:02.860s
[INFO] Finished at: Sun Apr 18 19:58:56 PDT 2010
[INFO] Final Memory: 6M/11M
[INFO] ------------------------------------------------------------------------

F:\work> cd TestAndroid
The resulting files:

F:\work\TestAndroid>tree /F
Folder PATH listing for volume WINDOWS
Volume serial number is 9827-5E66
F:.
│   pom.xml

└───src
    │   AndroidManifest.xml
    │
    └───main
        ├───android
        │   └───res
        │       ├───drawable
        │       │       icon.png
        │       │
        │       ├───layout
        │       │       main.xml
        │       │
        │       └───values
        │               strings.xml
        │
        └───java
            └───org
                └───eoti
                    └───android
                        └───test
                                MyActivity.java

Make sure you have your emulator running (emulator -avd Device1, in my case):
F:\work\TestAndroid>mvn install
This will build, package and deploy it to your emulator.
 
F:\work\TestAndroid>mvn clean
In addition to cleaning your build tree, that will undeploy your app from the emulator.

12 April 2010

Et tu Java?

We all know that Sun employees are dropping like flies (either by quitting or being laid off with their entire teams)...  It seems that shortly after finding out that Kohsuke quit, we find out that James Gosling has quit as well.

Does anyone NOT fear the future of Java under Oracle's "leadership"?

Project Darkstar, Red Dwarf, Kryten

As you are probably aware, Project Darkstar is no more.  Owen and others have moved it over into a new project called Red Dwarf.  One of the things I noticed was that they have a maven plugin to ease quick development cycles.  I decided to spend some time this weekend getting associated with the plugin and the new project.

I started off by redoing the original tutorial exercises from the Darkstar ServerAppTutorial and ClientTutorial.  One of the goals while doing this was to come up with a basic skeleton to get a RedDwarf project up and running quickly.  After getting each tutorial exercise running as a submodule in maven, I tweaked the pom's until I had a fairly clean approach.

Originally I had planned on documenting those minimal steps here.  Instead, I chose to write my first maven archetype.  I'm sure there are errors and such, but as you will see below, this should give you an entry point very quickly.  (Getting the archetype catalog working in Nexus was another story because it took me a few hours to realize that you will get a 500 Server Error if you try to point to a repository group [like 'public'] instead of a specific repository [thus the long URL below]).

Ok, let's get started.  First thing we need to do is use the archetype to create a basic structure:



F:\work>mvn archetype:generate -DarchetypeCatalog=http://kallisti.eoti.org:8081/content/repositories/snapshots/archetype-catalog.xml
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-archetype-plugin:2.0-alpha-5-SNAPSHOT:generate (default-cli) @ standalone-pom ---
[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: http://kallisti.eoti.org:8081/content/repositories/snapshots/archetype-catalog.xml -> ardor3d-archetype (null)
2: http://kallisti.eoti.org:8081/content/repositories/snapshots/archetype-catalog.xml -> kryten-archetype (null)
Choose a number: : 2
[INFO] snapshot com.example.myapp:kryten-archetype:1.0-SNAPSHOT: checking for updates from eoti-public
[WARNING] *** CHECKSUM FAILED - Checksum failed on download: local = '218a428a68f50b483a388f7fee54d2bb1ceec981'; remote = 'f1bcef05eca9d0e230f5dc8ff1fa0b8af1e8ab53' - RETRYING
[WARNING] *** CHECKSUM FAILED - Checksum failed on download: local = '218a428a68f50b483a388f7fee54d2bb1ceec981'; remote = 'f1bcef05eca9d0e230f5dc8ff1fa0b8af1e8ab53' - IGNORING
Define value for property 'groupId': : org.eoti.kryten.test
Define value for property 'artifactId': : TestApp
Define value for property 'version':  1.0-SNAPSHOT: :
Define value for property 'package':  org.eoti.kryten.test: :
Confirm properties configuration:
groupId: org.eoti.kryten.test
artifactId: TestApp
version: 1.0-SNAPSHOT (hit enter)
package: org.eoti.kryten.test
(hit enter)
 Y: : (hit enter)
[INFO] Parent element not overwrited in F:\work\TestApp\api\pom.xml
[INFO] Parent element not overwrited in F:\work\TestApp\client\pom.xml
[INFO] Parent element not overwrited in F:\work\TestApp\server\pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 25.844s
[INFO] Finished at: Sun Apr 11 23:26:34 PDT 2010
[INFO] Final Memory: 6M/11M
[INFO] ------------------------------------------------------------------------
F:\work>cd TestApp
I have bold-faced the actual typing involved...  This will create a basic structure:
F:\WORK\TESTAPP
│   pom.xml

├───api
│   │   pom.xml
│   │
│   └───src
│       └───main
│           └───java
│               └───org
│                   └───eoti
│                       └───kryten
│                           └───test
│                               └───api
│                                       MyApp.java

├───client
│   │   pom.xml
│   │
│   └───src
│       └───main
│           └───java
│               └───org
│                   └───eoti
│                       └───kryten
│                           └───test
│                               └───client
│                                       MyClient.java

└───server
    │   pom.xml
    │
    └───src
        └───main
            ├───java
            │   └───org
            │       └───eoti
            │           └───kryten
            │               └───test
            │                   └───server
            │                           MyServer.java
            │                           MyServerUser.java
            │
            └───resources
                └───META-INF
                        app.properties

As you can see, this makes a multimodule project.  The top-level pom specifies versions of libraries, repositories, etc.  The API module provides a common library to be used by both the client and server [in this case, it just converts Strings to/from ByteBuffers.  The server module is a minimalist server app and the client module is a minimalist client app (console i/o rather than swing from the tutorials).

To get started, we first need to build it
F:\work\TestApp>mvn clean install
Next, we will startup a red dwarf server, deploy the app and dependencies to it, and then boot it.
F:\work\TestApp>cd server
F:\work\TestApp\server>mvn validate -Psgs-run
This utilizes a maven profile (named 'sgs-run') to do all the heavy lifting via the red dwarf maven plugin.

In another terminal, go to the client subdirectory and start the client:
F:\work\TestApp\client>mvn validate -Pclient-run
The client-run profile just executes the client module (executable jar) with the dependencies in the classpath.  When it starts up, it will log into the server then wait for you to type.  Every time you hit enter, it will send the text you had typed to the server.  The server will simply respond with a message telling you that it received the message.  When you are done, type 'quit' or 'exit' to stop the client.

Once you are done and you want to stop the server, make sure to use the profile to stop it or you will have to kill it in the task manager (ie: do NOT use ctrl-c).
F:\work\TestApp\server>mvn validate -Psgs-stop
It will take about 1-2 minutes to shut down cleanly (in the 'sgs-run' window).

Now that you have a basic structure that you can easily run and test, start editing the code =)

NOTE: The URL has been changed:
mvn archetype:generate -DarchetypeCatalog=http://repository-malachid.forge.cloudbees.com/public-snapshot/archetype-catalog.xml


08 April 2010

Kohsuke leaves Sun

Kohsuke is leaving Sun to start his own business.  Good luck Kohsuke.  I'm glad you are doing your own thing rather than being cannon fodder for Oracle.

04 April 2010

Hudson reset on upgrade

I realized today that Hudson was about 15 versions out of date.  I did the upgrade (pfexec pkg install hudson).  On restart, Hudson now had a blank configuration.  Don't worry - your data isn't gone. My manifest file had been modified and reimported; so now the various paths were incorrect for my system.  Fixing and reimporting (pfexec svccfg import hudson.xml) was enough to get it working again.