Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "Jetty/Feature/Jetty Maven Plugin"
Line 61: | Line 61: | ||
<configuration> | <configuration> | ||
<scanIntervalSeconds>10</scanIntervalSeconds> | <scanIntervalSeconds>10</scanIntervalSeconds> | ||
+ | <webAppConfig> | ||
+ | <contextPath>/test</contextPath> | ||
+ | </webAppConfig> | ||
</configuration> | </configuration> | ||
− | |||
− | |||
− | |||
</plugin> | </plugin> | ||
</source> | </source> |
Revision as of 22:21, 7 September 2009
Introduction
The Jetty Maven plugin is useful for rapid development and testing. It can be added to any webapp project which is structured according to the usual Maven defaults.
The plugin can then periodically scan your project for changes and automatically redeploy the webapp if any are found. This makes the development cycle more productive by eliminating the build and deploy steps: you use your IDE to make changes to the project, and the running web container will automatically pick them up, allowing you to test them straight away.
The information on this page refers to the plugin versions for Jetty 7 and above. If you're using the plugin with Jetty 6, see the Jetty 6 Maven Plugin guide at codehaus.
Feature
Quick Start
Get up and running
First, add jetty-maven-plugin to your pom.xml definition:
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> </plugin>
Then, from the same directory as your root pom.xml, simply type:
mvn jetty:run
This will start Jetty and serve up your project on http://localhost:8080/.
Jetty will continue to run until you stop it. While it runs, it will periodically scan for changes to your project files, so if you save changes and recompile your class files, Jetty will redeploy your webapp, and you can instantly test the changes you just made.
Stop the plugin from the same terminal window
You can terminate the plugin with a <ctrl-c> in the terminal window where it is running.
Running and Deploying
The jetty-maven-plugin has six Maven goals. Each goal is an action you can run to accomplish a specific task, or to work with a particular web application setup. You may need to insert goal-specific configuration to run it properly.
To run the jetty-maven-plugin with a particular goal, use this command:
mvn jetty:goalname
Here are things you can do with the jetty-maven-plugin:
Run an assembled webapp with mvn jetty:run
The run goal runs on assembled webapps which follow the usual Maven defaults, as follows:
- resources in ${basedir}/src/main/webapp
- classes in ${project.build.outputDirectory}
- web.xml in ${basedir}/src/main/webapp/WEB-INF/
The webapp does not need to be assembled into a WAR, saving time during the development cycle. Once invoked, the plugin can be configured to run continuously, scanning for changes in the project and automatically performing a hot redeploy when necessary. Any changes you make will be immediately reflected in the running instance of Jetty, letting you quickly jump from coding to testing, rather going through the cycle of: code, compile, reassemble, redeploy, test.
A quick example, which turns on scanning for changes (every ten seconds), and sets the webapp context path to "/test":
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <scanIntervalSeconds>10</scanIntervalSeconds> <webAppConfig> <contextPath>/test</contextPath> </webAppConfig> </configuration> </plugin>
If, for whatever reason, you cannot run on an unassembled webapp, the goals run-war and run-exploded will work on unassembled webapps.
Run an unassembled webapp as a WAR with mvn jetty:run-war
Run an unassembled webapp as an exploded WAR with mvn jetty:run-exploded
The run-exploded goal assembles your webapp into an exploded WAR and automatically deploys it to Jetty.
Run a pre-assembled WAR with mvn jetty:deploy-war
More Actions
Stop the plugin from another terminal window with mvn jetty:stop
You can terminate the plugin from another terminal window by executing the stop goal. If you wish to be able to use mvn jetty:stop then you need to configure the plugin with a special port number and key that you also supply on the stop command:
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <stopPort>9966</stopPort> <stopKey>foo</stopKey> </configuration> </plugin>
Then, while Jetty is running, type:
mvn jetty:stop
The <stopPort>
must be free on the machine you are running on. If this is not the case, you will get an "Address already in use" error message after the "Started SelectedChannelConnector ..." message.
Get more help with mvn jetty:help
mvn jetty:help prints out the list of goals for the jetty-maven-plugin, with a description of each goal.
mvn jetty:help -Ddetail=true -Dgoal=<goal-name> will print out a list of the settable properties for that goal, in addition to its description, which is useful to get quick information about a goal.
Automatic plugin execution during unit testing with mvn jetty:run
One useful feature of the plugin is its automatic plugin execution. You can automatically have your webapp started at the beginning of the tests, and stopped at the end rather than manually executing mvn jetty:run on the command line.
To do this, you need to set up a couple of <execution>
scenarios for the Jetty plugin and use the <daemon>true</daemon>
configuration option to force Jetty to only execute while Maven is running, instead of running indefinitely.
The pre-integration-test
and post-integration-test
Maven build phases can be used to trigger the execution and termination of Jetty:
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <scanIntervalSeconds>10</scanIntervalSeconds> <stopKey>foo</stopKey> <stopPort>9999</stopPort> </configuration> <executions> <execution> <id>start-jetty</id> <phase>pre-integration-test</phase> <goals> <goal>run</goal> </goals> <configuration> <scanIntervalSeconds>0</scanIntervalSeconds> <daemon>true</daemon> </configuration> </execution> <execution> <id>stop-jetty</id> <phase>post-integration-test</phase> <goals> <goal>stop</goal> </goals> </execution> </executions> </plugin>