Now that JBoss 7 CR1 is out, let's play with it.
Because of standards, it should be straightforward to run a Play application packaged as a war in JBoss AS7.
Step 1: Download and Install Play
Grab Play framework here and unzip it in the location of you choice, we'll call that location $PLAY_HOME and make sure $PLAY_HOME is in your path.
Step 2: Verify installation
Type:
play
and you should see:
~ _ _ ~ _ __ | | __ _ _ _| | ~ | '_ \| |/ _' | || |_| ~ | __/|_|\____|\__ (_) ~ |_| |__/ ~ ~ play! 1.2.1, http://www.playframework.org ~ ~ Usage: play cmd [app_path] [--options] ~ ~ with, new Create a new application ~ run Run the application in the current shell ~ help Show play help ~
Step 3: Download and install JBoss AS 7
Get a copy of JBoss AS 7 here. Unzip it and we'll name the home directory of AS7 $JBOSS_HOME.
To verify that the installation went well, go to $JBOSS_HOME/bin and type:
standalone.sh
or
standalone.bat
You will see something like:
========================================================================= JBoss Bootstrap Environment JBOSS_HOME: /tmp/jboss-7.0.0.CR1 JAVA: java JAVA_OPTS: -server -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djboss.modules.system.pkgs=org.jboss.byteman ========================================================================= 11:23:59,956 INFO [org.jboss.modules] JBoss Modules version 1.0.0.CR4 11:24:00,262 INFO [org.jboss.msc] JBoss MSC version 1.0.0.CR2 11:24:00,321 INFO [org.jboss.as] JBoss AS 7.0.0.CR1 "White Rabbit" starting 11:24:01,326 INFO [org.jboss.as] creating http management service using network interface (management) port (9990) securePort (-1) 11:24:01,336 INFO [org.jboss.as.logging] Removing bootstrap log handlers 11:24:01,351 INFO [org.jboss.as.connector.subsystems.datasources] (Controller Boot Thread) Deploying JDBC-compliant driver class org.h2.Driver (version 1.2) 11:24:01,543 INFO [org.jboss.as.naming] (Controller Boot Thread) Activating Naming Subsystem 11:24:01,562 INFO [org.jboss.as.naming] (MSC service thread 1-4) Starting Naming Service 11:24:01,576 INFO [org.jboss.as.osgi] (Controller Boot Thread) Activating OSGi Subsystem 11:24:01,598 INFO [org.jboss.as.security] (Controller Boot Thread) Activating Security Subsystem 11:24:01,606 INFO [org.jboss.remoting] (MSC service thread 1-2) JBoss Remoting version 3.2.0.Beta2 11:24:01,631 INFO [org.xnio] (MSC service thread 1-2) XNIO Version 3.0.0.Beta3 11:24:01,665 INFO [org.xnio.nio] (MSC service thread 1-2) XNIO NIO Implementation Version 3.0.0.Beta3 11:24:01,862 INFO [org.apache.catalina.core.AprLifecycleListener] (MSC service thread 1-1) The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64/server:/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/amd64:/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 11:24:01,908 INFO [org.jboss.as.ee] (Controller Boot Thread) Activating EE subsystem 11:24:01,937 INFO [org.jboss.as.jmx.JMXConnectorService] (MSC service thread 1-3) Starting remote JMX connector 11:24:01,959 INFO [org.jboss.as.remoting] (MSC service thread 1-2) Listening on /127.0.0.1:9999 11:24:01,990 WARN [org.jboss.osgi.framework.internal.URLHandlerPlugin] (MSC service thread 1-2) Unable to set the URLStreamHandlerFactory 11:24:02,012 WARN [org.jboss.osgi.framework.internal.URLHandlerPlugin] (MSC service thread 1-2) Unable to set the ContentHandlerFactory 11:24:02,383 INFO [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-1) Starting Coyote HTTP/1.1 on http--127.0.0.1-8080 11:24:02,603 INFO [org.jboss.as.connector] (MSC service thread 1-2) Starting JCA Subsystem (JBoss IronJacamar 1.0.0.CR2) 11:24:02,750 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-1) Bound data source [java:jboss/datasources/ExampleDS] 11:24:03,318 INFO [org.jboss.as.deployment] (MSC service thread 1-1) Started FileSystemDeploymentService for directory /tmp/jboss-7.0.0.CR1/standalone/deployments 11:24:03,345 INFO [org.jboss.as] (Controller Boot Thread) JBoss AS 7.0.0.CR1 "White Rabbit" started in 3742ms - Started 91 of 146 services (55 services are passive or on-demand)
Now point your web browser to localhost:8080 and you should see:
Step 4: Package a Play application as a Web Archive (WAR)
We will take the "booking" application that comes with play and is a replicate of the famous booking sample application for Seam.
Warning: For 'some' reason, the #{welcome /} inclusion of Play doesn't work in the servlet environment, so if you try to create a new application from scratch, don't be surpised to not see all the content.
In $PLAY_HOME/samples-and-tests/ type:
play war booking -o /tmp/jboss-7.0.0.CR1/standalone/deployments/booking.war
You should see in JBoss AS log (if you still have it running):
11:30:04,645 INFO [org.jboss.as.deployment] (DeploymentScanner-threads - 1) Found booking.war in deployment directory. To trigger deployment create a file called booking.war.dodeploy
We'll just do what it says and create an empty file next to booking.war called booking.war.dodeploy. This file is just a marker to tell the application server that all files have been copied and it's ready to be deployed since we haven't zipped the war.
So create that empty file (with a text editor or simply using touch if you are on a linux/Mac machine)
touch $JBOSS_HOME/standalone/deployments/booking.war.dodeploy
And you should see in JBoss AS log:
12:03:18,020 INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) Starting deployment of "booking.war" 12:03:19,976 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-4) Deploying JDBC-compliant driver class org.h2.Driver (version 1.3) 12:03:19,985 INFO [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-4) Deploying non-JDBC-compliant driver class com.mysql.jdbc.Driver (version 5.1) 12:03:19,985 WARN [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-4) Unable to instantiate driver class "com.mysql.jdbc.Driver": org.jboss.msc.service.DuplicateServiceException: Service jboss.jdbc-driver.booking_war is already registered 12:03:20,149 INFO [stdout] (MSC service thread 1-2) 12:03:20,148 INFO ~ Starting /tmp/jboss-7.0.0.CR1/standalone/deployments/booking.war/WEB-INF/application 12:03:20,217 INFO [stdout] (MSC service thread 1-2) 12:03:20,217 INFO ~ Application is precompiled 12:03:20,889 INFO [stdout] (MSC service thread 1-2) 12:03:20,889 INFO ~ Connected to jdbc:h2:mem:play;MODE=MYSQL 12:03:21,328 INFO [org.hibernate.validator.util.Version] (MSC service thread 1-2) Hibernate Validator 4.1.0.Final 12:03:21,335 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] (MSC service thread 1-2) Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver. 12:03:21,427 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] (MSC service thread 1-2) Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver. 12:03:21,436 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] (MSC service thread 1-2) Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver. 12:03:21,722 INFO [org.hibernate.validator.engine.resolver.DefaultTraversableResolver] (MSC service thread 1-2) Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver. 12:03:22,205 INFO [stdout] (MSC service thread 1-2) 12:03:22,205 INFO ~ Application 'Hotel Booking' is now started ! 12:03:22,963 INFO [stdout] (MSC service thread 1-2) 12:03:22,963 WARN ~ Precompiled template /conf/data.yml not found, trying to load it dynamically... 12:03:23,750 INFO [stdout] (MSC service thread 1-2) 12:03:23,750 INFO ~ Forcing PROD mode because deploying as a war file. 12:03:23,760 INFO [org.jboss.web] (MSC service thread 1-2) registering web context: /booking 12:03:23,767 INFO [org.jboss.as.server.controller] (DeploymentScanner-threads - 2) Deployed "booking.war"
Now point your browser to http://localhost:8080/booking and you will see:
And that's it, the application is now running in the best application server in the world , you can go ahead and use the services provided by a Java EE container, including application management.
This was my first experience with Play Framework on AS7 a better experience would be to remove the Servlet layer and hit JBoss Netty directly to get the best of both worlds. Any volunteer to work on that ?
See this in action on this video (Bare with me, first video and upload issues with the processed version on Vimeo, so it is very rough)
Enjoy !
Comments