Search This Blog

12 April 2010

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


13 comments:

  1. This tutorial helped me a lot.
    Thank you!

    ReplyDelete
  2. I tried your tutorial and I got an error platform windows 64 not supported, I believe this is because I'm running it in 64bit without the appropriate native files, any idea where I could get those? Thank you

    ReplyDelete
  3. Hmmm.. The above was done on XP64... Are you running Vista, Windows7, ...?

    ReplyDelete
  4. Windows 7, using powershell

    ReplyDelete
  5. Maybe talk with mastershadow ( see their post in the forums ) as it appears they are using Windows7 64.

    ReplyDelete
  6. Thanks for the tip, I'll send him a PM.

    ReplyDelete
  7. Thanks for the article!

    Do you know where can I get performance statements for RedDwarf? and a list of projects using it?

    Thanks!

    ReplyDelete
  8. For projects using it, look here.

    I'm not sure about performance statements.

    ReplyDelete
  9. Awesome Archetype Malachi. Nice Job.
    Thanks!

    -Richard Warren

    ReplyDelete
  10. Excelent maven plugin! Good job!

    ReplyDelete