I keep meaning to get stuck in and learn some Python, and especially make use of some Jython. After coming across this post about using Jython with Glassfish, I thought I'd give it a go myself.
This post is about creating a Maven WAR project making use of Python scripts running on embedded Jython on an embedded Glassfish v3 instance.
Here is the projects POM:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.adrianwalker.maven.skeleton.war.jython.glassfish</groupId> <artifactId>maven-war-jython-glassfish-example</artifactId> <packaging>war</packaging> <version>0.1.0</version> <name>Maven WAR-Jython-Glassfish Example</name> <description> Example project for creating a Jython WAR running on Glassfish. Usage: mvn clean install embedded-glassfish:run </description> <url>http://www.adrianwalker.org</url> <organization> <name>adrianwalker.org</name> <url>http://www.adrianwalker.org</url> </organization> <developers> <developer> <name>Adrian Walker</name> <email>ady.walker@gmail.com</email> <organization>adrianwalker.org</organization> <organizationUrl>http://www.adrianwalker.org</organizationUrl> </developer> </developers> <repositories> <!-- Use project lib directory as repository --> <repository> <id>project</id> <url>file://${basedir}/lib</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>java.net</id> <url>http://download.java.net/maven/glassfish</url> </pluginRepository> </pluginRepositories> <build> <finalName>example</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <webResources> <webResource> <directory>${basedir}/src/main/python</directory> <includes> <include>**/*.py</include> </includes> </webResource> </webResources> </configuration> </plugin> <plugin> <groupId>org.glassfish</groupId> <artifactId>maven-embedded-glassfish-plugin</artifactId> <configuration> <port>8080</port> <app>${project.build.directory}/${build.finalName}.war</app> <instanceRoot>${project.build.directory}/glassfish</instanceRoot> <contextRoot>${build.finalName}</contextRoot> </configuration> </plugin> </plugins> </build> <dependencies> <!-- Jython version 2.5.1 and it's standard library are included in the project lib directory --> <dependency> <groupId>org.python</groupId> <artifactId>jython</artifactId> <version>2.5.1</version> </dependency> <dependency> <groupId>org.python</groupId> <artifactId>jython-lib</artifactId> <version>2.5.1</version> </dependency> </dependencies> </project>
I couldn't find the latest version (2.5.1) of the Jython JAR in any Maven repository, so I have included it with the project source code in the lib
directory. Also, I wanted the Jython instance to be completely self contained, so instead of referencing an install external to the project, I have JAR'ed up the standard library and included it in the project as lib/jython-lib-2.5.1.jar
.
The project uses the embedded Glassfish v3 plugin to quickly start a basic configuration Glassfish server.
PyServlet, distributed with Jython is used to create Java Servlets using Jython source files. It is configured in the project's web.xml
:
web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="Message" version="2.5"> <servlet> <servlet-name>PyServlet</servlet-name> <servlet-class>org.python.util.PyServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>PyServlet</servlet-name> <url-pattern>*.py</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>Calendar.py</welcome-file> </welcome-file-list> </web-app>
Python code to create a Java servlet which uses the Python calendar library:
Calendar.py
import time import calendar from javax.servlet.http import HttpServlet class Calendar (HttpServlet): def doGet(self, request, response): response.setContentType ("text/html") out = response.getWriter() out.println (""" <html> <head> <title>Calendar</title> </head> <body> <h1>Calendar</h1> <pre>%s</pre> </body> </html> """ % calendar.calendar(time.localtime()[0]))
Run the project with 'mvn clean install embedded-glassfish:run
' and point your brower at http://localhost:8080/example/.
Source Code
- Java Maven Project With Dependencies - MavenWARJythonGlassfish.zip