The Source for Java Technology Collaboration
User: Password:



Vivek Pandey's Blog

May 2008 Archives


Scala Lift Web Framework on GlassFish v3

Posted by vivekp on May 16, 2008 at 04:35 PM | Permalink | Comments (0)

During JavaOne I heard about Lift - a Scala web framework and wanted to try it. It claims to provide best of Rails(simple and fast development), Seaside(security), Django(access control by default) and uses Wicket for view templates. In few steps I had my first Lift web application running on GlassFish v3.

Lift applicatin development process is Maven based and uses Derby as the default database. These are the steps to build a simple Lift application and deploy it on Embedded GlassFish v3 during development or deploy it on GlassFish v3 server.

Create Application

Lift uses Maven Archetype plugin to build a template project.

    
mvn org.apache.maven.plugins:maven-archetype-plugin:1.0-alpha-7:create  \
-DarchetypeGroupId=net.liftweb                             \
-DarchetypeArtifactId=lift-archetype-basic                 \
-DarchetypeVersion=0.8                            \
-DremoteRepositories=http://scala-tools.org/repo-releases  \
-DgroupId=my.liftapp -DartifactId=liftapp
    
This created liftapp directory.
  • src/main/scala directory contains the Scala source code.
  • src/main/webapp directory contains the HTML, JavaScript, CSS, and WEB-INF code.
  • lift_example directory contains the derby database.
Now let's build it
    
cd liftapp
mvn install
    

This would create a WAR directory structure at target/liftapp-1.0-SNAPSHOT/ and also the WAR file target/liftapp-1.0-SNAPSHOT.war

Deploy on GlassFish v3

I could simply deploy the application on GlassFish v3 server by doing:

    
        asadmin deploy target/liftapp-1.0-SNAPSHOT
    

Click http://localhost:8080/liftapp-1.0-SNAPSHOT/ and you should see the Welcome screen. Also note that the access controls login, add user features are automatically generated similar to Django admin.

lift-gf.png

Code-Save-Refresh with GlassFish v3

The previous deployment on to GlassFish v3 works fine but I needed something that could help me do Code-Save-Refresh cycle without restarting the v3 server. Basically I wanted to use Embedded GlassFish v3 where I would simply invoke mvn glassfish:run and make changes and compile in another window and at the end refresh the browser to see the changes.

Since pom.xml generated by Lift Archetype does not have entry for maven-glassfish-plugin so I had to add this plugin entry:

    

        <pluginRepositories>
            <pluginRepository>
                <id>maven2.java.net</id>
                <name>Java.net Repository for Maven 2</name>
                <url>http://download.java.net/maven/2</url>
            </pluginRepository>
        </pluginRepositories>

        <plugins>
            <plugin>
                <groupId>org.glassfish</groupId>
                <artifactId>maven-glassfish-plugin</artifactId>
                <version>1.0-alpha-4</version>
                <configuration>
                    <resourcesDirectory>target/liftapp-${project.version}</resourcesDirectory>
                </configuration>
            </plugin>
        </plugins>
    

I also had to make one more change in src/main/webapp/WEB-INF/web.xml to workaround due to the fact that http://java.sun.com/j2ee/dtds/web-app_2_3.dtd has been renamed to http://java.sun.com/dtd/web-app_2_3.dtd and the aliasing is not happening properly with Embedded GlassFish v3

So the change was to edit src/main/webapp/WEB-INF/web.xml and replace http://java.sun.com/j2ee/dtds/web-app_2_3.dtd by http://java.sun.com/dtd/web-app_2_3.dtd. This step would not be required once it is fixed in embedded GlassFish v3.

That's it! Next I did was invoke mvn glassfish:run


    vivekmz@boson(620)> mvn glassfish:run
    [INFO] Scanning for projects...
    [INFO] Searching repository for plugin with prefix: 'glassfish'.
    [INFO] ------------------------------------------------------------------------
    [INFO] Building liftapp
    [INFO]    task-segment: [glassfish:run]
    [INFO] ------------------------------------------------------------------------
    [INFO] Preparing glassfish:run
    [INFO] [resources:resources]
    [INFO] Using default encoding to copy filtered resources.
    [INFO] [yuicompressor:compress {execution: default}]
    [INFO] nb warnings: 0, nb errors: 0
    Downloading: http://scala-tools.org/repo-releases/org/igniterealtime/smack/smack/3.0.4/smack-3.0.4.pom
    Downloading: http://repo1.maven.org/maven2/org/igniterealtime/smack/smack/3.0.4/smack-3.0.4.pom
    Downloading: http://scala-tools.org/repo-releases/org/igniterealtime/smack/smackx/3.0.4/smackx-3.0.4.pom
    Downloading: http://repo1.maven.org/maven2/org/igniterealtime/smack/smackx/3.0.4/smackx-3.0.4.pom
    [INFO] [compiler:compile]
    [INFO] Nothing to compile - all classes are up to date
    [INFO] [scala:compile {execution: default}]
    [INFO] Nothing to compile - all classes are up to date
    [INFO] [glassfish:run]
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.server.AppServerStartup run
    INFO: HK2 initialized in 236 ms
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.server.AppServerStartup run
    INFO: com.sun.enterprise.naming.impl.ServicesHookup@1e708b2 Init done in 241 ms
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.server.AppServerStartup run
    INFO: com.sun.enterprise.v3.server.Globals@1fbc355 Init done in 242 ms
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.server.AppServerStartup run
    INFO: com.sun.enterprise.v3.server.SystemTasks@1f2edd2 Init done in 246 ms
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.server.AppServerStartup run
    INFO: com.sun.enterprise.v3.services.impl.HouseKeeper@f221f6 Init done in 247 ms
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.server.AppServerStartup run
    INFO: com.sun.enterprise.v3.services.impl.CmdLineParamProcessor@189a773 Init done in 249 ms
    JMXMP connector server URL = service:jmx:jmxmp://localhost:8888
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.services.impl.GrizzlyProxy start
    INFO: Listening on port 8080
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.server.AppServerStartup run
    INFO: com.sun.enterprise.v3.services.impl.GrizzlyService@154ea79 startup done in 398 ms
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.services.impl.ApplicationLoaderService postConstruct
    INFO: loader service postConstruct started at 1210978351811
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.server.AppServerStartup run
    INFO: Application Loader startup done in 431 ms
    May 16, 2008 2:52:31 PM com.sun.enterprise.v3.server.AppServerStartup run
    INFO: Glassfish v3 started in 432 ms
    May 16, 2008 2:52:37 PM com.sun.enterprise.web.WebModuleContextConfig authenticatorConfig
    SEVERE: webModuleContextConfig.missingRealm
    Hit ENTER for redeploy

Click http://localhost:8080/liftapp/ would display

lift-gf-1.png

Then I tried to make some changes in the Scala code compile it and then refresh the browser to see if the changes appear there. So in another window, edit src/main/scala/my/liftapp/snippet/HelloWorld.scala

Replace
    
        def howdy = Welcome to liftapp at {new java.util.Date}
    
by
    
        def howdy = Welcome to liftapp deployed on GlassFish v3 at {new java.util.Date}
    

Save this file and run mvn install and hit Entner key in the windows where I ran embedded GlassFish v3.

That's

Now, I go back to the browser and refresh the window and it displays the changed text, but first see the GlassFish log where you hit Enter and see the log printed when refresh button was pressed in the browser

    
        Hit ENTER for redeploy
        May 16, 2008 2:57:30 PM com.sun.enterprise.web.WebModuleContextConfig authenticatorConfig
        SEVERE: webModuleContextConfig.missingRealm
        INFO - Service request (GET) /liftapp/ took 412 Milliseconds
        INFO - Service request (GET) /liftapp/classpath/blueprint/screen.css took 13 Milliseconds
        INFO - Service request (GET) /liftapp/classpath/blueprint/print.css took 2 Milliseconds
        INFO - Service request (GET) /liftapp/classpath/blueprint/plugins/fancy-type/fancy-type.css took 2 Milliseconds
        INFO - Service request (GET) /liftapp/classpath/jquery.js took 4 Milliseconds
        INFO - Service request (GET) /liftapp/classpath/json.js took 1 Milliseconds
    

lift-gf2.png

To summarize, a Scala Lift application can be deployed on GlassFish v3 server as well as can be run in development mode with hot deployment by running embedded GlassFish mvn glassfish:run. Go ahead and try it out and let us know at the the forum or alias



GlassFish Gem 0.2.0 and JRuby 1.1.1 module for GlassFish v3 update center

Posted by vivekp on May 05, 2008 at 06:52 PM | Permalink | Comments (0)

New version of GlassFish gem 0.2.0 is out. See Arun's announcements. The major changes in this version are:

  • Version upgrade to GlassFish v3 TP2.
  • Fix to the size regression introduced in the previous release. It is back to about 3MB.

We also released JRuby 1.1.1 runtime bundle that includes Rails 2.0.2 along with other required gems, such as jdbc, jdbc-mysql.

To install JRuby 1.1.1 and Rails 2.0.2 runtime on Glassfish v3 TP2, do the following:

  • From inside GlassFish install directory:
    bin/updatetool

    This will get all the required jars to run updatetool. After it gets all the dependencies, run

    bin/updatetool


ips-jruby.png

Select JRuby On GlassFish and click install. It will create jruby directory inside glassfish-tp2/glassfish/modules directory. Thats all you need. Now start deploying your Ruby/Rails applications on GlassFish v3 and you dont need to set JRUBY_HOME in config/asenv.bat or asenv.conf that you would do otherwise to tell GlassFish where to find JRuby runtime.



Scripting in GlassFish @ JavaOne 2008

Posted by vivekp on May 04, 2008 at 10:29 AM | Permalink | Comments (0)

JavaOne 2008 starts form tomorrow, actually today: there is Unconference in the afternoon. This is going to be my first 8th JavaOne in a row and a most busy one! Here are some of the scripting related talks and events:

  • BOF-5111 Scripting in GlassFish
  • TS-5416 JRuby: Why, What, How...Do It Now
  • TS-4806 JRuby on Rails: Web Development Evolved
  • TS-6039 Jython - Implementing Dynamic Language Features for the Java™ Platform Ecosystem
  • PAN-5435 The Script Bowl: A Rapid-Fire Comparison of Scripting Languages
  • TS-5764 Grails in Depth
  • TS-5793 Groovy and Grails: Changing the Landscape of Java™ Platform, Enterprise Edition (Java EE Platform) Patterns

There are also all week GlassFish events, do plan to attend these.

I hope to meet many of you. I will be speaking at BOF-5111: Scripting In GlassFish and also at CommunityOne sessions S295418 - Tools for GlassFish V3 (Java EE Platform and Scripting Environment) and Scripting environment.

We also have POD#135 Scripting On GlassFish Booth in the Pavillion. I plan to be around there on Wednesday afternoon so drop by to see what we are up to on supprting dynamic languages and frameworks on GlassFish.



JRuby Module 3.0 for for GlassFish v2 is out

Posted by vivekp on May 03, 2008 at 01:11 AM | Permalink | Comments (1)

JRuby Update Center module 3.0 for GlassFish v2 is out. It has been tested to work with GlassFish v2 UR2. The Update Center modules provide out of the box tested-on-GlassFish version of JRuby, Rails and other required gems. For the GlassFish users it is very convinient just install the JRuby module from the GlassFish update center and start writing the Rails applications.

Here are some details on this release of Update Centner Modules:

It is a major upgrade from the previous 2.1 version which came with JRuby 1.0.3 and Rails 1.2.6. The major upgrade comes in forms of JRuby version 1.1.1, Rails version 2.0.2 and Warbler. You can use Warbler to create a WAR of the Rails application on GlassFish v2. The UC module also provides ant scripts for shared mode, where JRuby and Goldspike jars are installed on Glassfish v2 and you don't have to package any of these jars and the gems with JRuby. This will result in to smaller Rails applications compared to the WAR files created by Warbler.

Rails 2.0.2 is not backward compatible with Rails 1.2.6 so samples form the previous JRuby UC module will not work on this new ver 3.0.

JRuby and installed gem versions

  • JRuby 1.1.1
  • gems
  • actionmailer (2.0.2)
    actionpack (2.0.2)
    activerecord (2.0.2)
    activerecord-jdbc-adapter (0.8)
    activerecord-jdbcmysql-adapter (0.8)
    activeresource (2.0.2)
    activesupport (2.0.2)
    jdbc-mysql (5.0.4)
    rails (2.0.2)
    rake (0.8.1)
    rspec (1.1.3)
    sources (0.0.1)
    warbler (0.9.5)
                

Installing JRuby UC Module 3.0

To install, cd to your GlassFish installation, and run

./updatecenter/bin/updatetool
. This will bring the window below:

gfv2-jruby-uc.png

Select JRuby On GlassFish checkbox and click Install. After it finishes, it will create jruby director inside the GlassFish installation.

lsjruby.png

Run HelloWorldRailsApp sample

  • Start GlassFish v2
    asadmin start-domain
                    
  • Inside your GlassFish installation,
    cd jruby/samples/HelloWorldRailsApp
  • Create a WAR file HelloWorldRailsApp.war by running warbler
    JRuby -S warble
  • Now Deploy the war file
    asadmin deploy HelloWorldRailsApp.war
  • Access http://localhost:8080/HelloWorldRailsApp/say/hello in your browser.

Above Warbler was used to create a standalone WAR file. Warbler packages all the required JARs and gems in the the WAR file resulting in to large WAR size. You can as well use setup-shared-env target from jruby/build.xml from inside the GlassFish installation. This will copy JRuby and Goldspike jars in to glassfish/lib directory. After this instead of running Warlbe, simply run create-shared target inside the application this will create WEB-INF/web.xml inside your Rails application. At the end simply run asadmin deploy yourRailsApp. For details see GLASSFISH_README.txt inside the samples.

Continue sending your feedback to the GlassFish WebTier forum or to the mailing list. Report any bugs to the IssueTracker

Embedding GlassFish v3 with Grails

Posted by vivekp on May 01, 2008 at 04:52 PM | Permalink | Comments (3)

In my blog on running Grails application on GlassFish v3, I need to create a war of my application and then deploy that war. This was a serious bottleneck in my development process as I wanted to test it out this application on GlassFish v3.

I really wanted to run my Grails application with GlassFish v3 as embedded server in the same fashion as running grails run-app, that is without creating a war file and to speed up my development. By default Grails uses Jetty web server to run the applications. But I wanted to use V3, it is very modular, extensible and embeddable and and is going to allow me to get the JavaEE features that I may like to use at some point in time. One possible way was that GlassFish v3 is an OSGi container and if Grails has an OSGi container I could easily replace jetty with v3. So I mentioned this problem to Kohsuke and came to know that he is working on GlassFish v3 embed APIs. So I gave it a try and guess what? It was darn simple to write few lines of groovy script to get it embedded with Grails and run my application.

Here is the groovy script that starts GlassFish v3 server and deploys the grails application. Please note that the API is using scattered war in literal sense - there is no WAR file structure here.

    appName = new File("${grailsAppName}");
    webxml = new File(webXmlFile.absolutePath)
    resource = new File("${basedir}/web-app")
    ScatteredWar war = new ScatteredWar(
                "${grailsAppName}",
                resource,
                webxml,
                Collections.singleton(new File(appName, classesDir.getAbsolutePath()).toURI().toURL()))

    grailsServer = new GlassFish(serverPort)/a>
    grailsApp = grailsServer.deploy(war)
        

I called this script RunaAppGf.groovy and after adding V3 Embed API and other v3 dependent jars (web-all.jar) to the Grails classpath, copied it to $GRAILS_HOME/script directory. With this I was ready to run my grails app and so I did by invoking grails run-app-gf inside my grails application directory.

vivekmz@boson(653)> grails run-app-gf

Welcome to Grails 1.0.1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /tools/grails

Base Directory: /myhome/vivekmz/dev/grails/hello
Environment set to development
Note: No plugin scripts found
Running script /tools/grails/scripts/RunAppGf.groovy
Starting GlassFish embedded server...Running Grails application..
Application name : hello
Web App Root :/myhome/vivekmz/dev/grails/hello/web-app
web.xml:/myhome/vivekmz/.grails/1.0.1/projects/hello/resources/web.xml
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.server.AppServerStartup run
INFO: HK2 initialized in 380 ms
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.server.AppServerStartup run
INFO: com.sun.enterprise.naming.impl.ServicesHookup@304648 Init done in 391 ms
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.server.AppServerStartup run
INFO: com.sun.enterprise.v3.server.Globals@6c9f0f Init done in 393 ms
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.server.AppServerStartup run
INFO: com.sun.enterprise.v3.server.SystemTasks@1cdc190 Init done in 400 ms
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.server.AppServerStartup run
INFO: com.sun.enterprise.v3.services.impl.HouseKeeper@d9b071 Init done in 403 ms
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.server.AppServerStartup run
INFO: com.sun.enterprise.v3.services.impl.CmdLineParamProcessor@19f9c7a Init done in 407 ms
JMXMP connector server URL = service:jmx:jmxmp://localhost:8888
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.services.impl.GrizzlyProxy start
INFO: Listening on port 8080
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.server.AppServerStartup run
INFO: com.sun.enterprise.v3.services.impl.GrizzlyService@3a4822 startup done in 718 ms
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.services.impl.ApplicationLoaderService postConstruct
INFO: loader service postConstruct started at 1209678405813
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.server.AppServerStartup run
INFO: Application Loader startup done in 764 ms
May 1, 2008 1:46:45 PM com.sun.enterprise.v3.server.AppServerStartup run
INFO: Glassfish v3 started in 765 ms
May 1, 2008 1:46:51 PM com.sun.enterprise.web.WebModuleContextConfig authenticatorConfig
SEVERE: webModuleContextConfig.missingRealm
[0] commons.DefaultGrailsApplication The class [UrlMappings] was not found when attempting to load Grails application. Skipping.
[3] commons.DefaultGrailsApplication The class [Config] was not found when attempting to load Grails application. Skipping.
[5] commons.DefaultGrailsApplication The class [BootStrap] was not found when attempting to load Grails application. Skipping.
[8] commons.DefaultGrailsApplication The class [DataSource] was not found when attempting to load Grails application. Skipping.
[10] commons.DefaultGrailsApplication The class [resources] was not found when attempting to load Grails application. Skipping.
[1426] spring.GrailsWebApplicationContext Refreshing org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@1e5052b: display name [org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@1e5052b]; startup date [Thu May 01 13:46:53 GMT-08:00 2008]; parent: org.springframework.web.context.support.XmlWebApplicationContext@13cb2c6
[1426] spring.GrailsWebApplicationContext Bean factory for application context [org.codehaus.groovy.grails.commons.spring.GrailsWebApplicationContext@1e5052b]: org.springframework.beans.factory.support.DefaultListableBeanFactory@192974
Server running. Browse to http://localhost:8080/hello
    

The next steps are really to provide the required V3 jars, V3 Embed Jars and this script as a bundle so that you can easily install over the Grails installation and enjoy modularity, extensibility and embeddability of GlassFish v3. I plan to talk about it more during JavaOne and Kohsuke and me are trying to see if we could have something ready in another day or so.





Powered by
Movable Type 3.01D
 Feed java.net RSS Feeds