1 //========================================================================
2 //$Id: Jetty6RunWarExploded.java 3591 2008-09-03 21:31:12Z jesse $
3 //Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
4 //------------------------------------------------------------------------
5 //Licensed under the Apache License, Version 2.0 (the "License");
6 //you may not use this file except in compliance with the License.
7 //You may obtain a copy of the License at
8 //http://www.apache.org/licenses/LICENSE-2.0
9 //Unless required by applicable law or agreed to in writing, software
10 //distributed under the License is distributed on an "AS IS" BASIS,
11 //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 //See the License for the specific language governing permissions and
13 //limitations under the License.
14 //========================================================================
15
16 package org.mortbay.jetty.plugin;
17
18 import java.io.File;
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.apache.maven.plugin.MojoExecutionException;
23 import org.apache.maven.plugin.MojoFailureException;
24 import org.mortbay.util.Scanner;
25
26 /**
27 *
28 * <p>
29 * This goal is used to assemble your webapp into an exploded war and automatically deploy it to Jetty.
30 * </p>
31 * <p>
32 * Once invoked, the plugin can be configured to run continuously, scanning for changes in the pom.xml and
33 * to WEB-INF/web.xml, WEB-INF/classes or WEB-INF/lib and hot redeploy when a change is detected.
34 * </p>
35 * <p>
36 * You may also specify the location of a jetty.xml file whose contents will be applied before any plugin configuration.
37 * This can be used, for example, to deploy a static webapp that is not part of your maven build.
38 * </p>
39 * <p>
40 * There is a <a href="run-exploded-mojo.html">reference guide</a> to the configuration parameters for this plugin, and more detailed information
41 * with examples in the <a href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin">Configuration Guide</a>.
42 * </p>
43 *
44 *@goal run-exploded
45 *@execute phase=package
46 */
47 public class Jetty6RunWarExploded extends AbstractJetty6Mojo
48 {
49
50
51
52 /**
53 * The location of the war file.
54 * @parameter expression="${project.build.directory}/${project.build.finalName}"
55 * @required
56 */
57 private File webApp;
58
59
60
61
62
63
64 /**
65 *
66 * @see org.mortbay.jetty.plugin.AbstractJettyMojo#checkPomConfiguration()
67 */
68 public void checkPomConfiguration() throws MojoExecutionException
69 {
70 return;
71 }
72
73 /**
74 * @see org.mortbay.jetty.plugin.AbstractJettyMojo#configureScanner()
75 */
76 public void configureScanner() throws MojoExecutionException
77 {
78 final ArrayList scanList = new ArrayList();
79 scanList.add(getProject().getFile());
80 File webInfDir = new File(webApp,"WEB-INF");
81 scanList.add(new File(webInfDir, "web.xml"));
82 File jettyWebXmlFile = findJettyWebXmlFile(webInfDir);
83 if (jettyWebXmlFile != null)
84 scanList.add(jettyWebXmlFile);
85 File jettyEnvXmlFile = new File(webInfDir, "jetty-env.xml");
86 if (jettyEnvXmlFile.exists())
87 scanList.add(jettyEnvXmlFile);
88 scanList.add(new File(webInfDir, "classes"));
89 scanList.add(new File(webInfDir, "lib"));
90 setScanList(scanList);
91
92 ArrayList listeners = new ArrayList();
93 listeners.add(new Scanner.BulkListener()
94 {
95 public void filesChanged(List changes)
96 {
97 try
98 {
99 boolean reconfigure = changes.contains(getProject().getFile().getCanonicalPath());
100 restartWebApp(reconfigure);
101 }
102 catch (Exception e)
103 {
104 getLog().error("Error reconfiguring/restarting webapp after change in watched files",e);
105 }
106 }
107 });
108 setScannerListeners(listeners);
109 }
110
111
112
113
114 public void restartWebApp(boolean reconfigureScanner) throws Exception
115 {
116 getLog().info("Restarting webapp");
117 getLog().debug("Stopping webapp ...");
118 webAppConfig.stop();
119 getLog().debug("Reconfiguring webapp ...");
120
121 checkPomConfiguration();
122
123 // check if we need to reconfigure the scanner,
124 // which is if the pom changes
125 if (reconfigureScanner)
126 {
127 getLog().info("Reconfiguring scanner after change to pom.xml ...");
128 ArrayList scanList = getScanList();
129 scanList.clear();
130 scanList.add(getProject().getFile());
131 File webInfDir = new File(webApp,"WEB-INF");
132 scanList.add(new File(webInfDir, "web.xml"));
133 File jettyWebXmlFile = findJettyWebXmlFile(webInfDir);
134 if (jettyWebXmlFile != null)
135 scanList.add(jettyWebXmlFile);
136 File jettyEnvXmlFile = new File(webInfDir, "jetty-env.xml");
137 if (jettyEnvXmlFile.exists())
138 scanList.add(jettyEnvXmlFile);
139 scanList.add(new File(webInfDir, "classes"));
140 scanList.add(new File(webInfDir, "lib"));
141 setScanList(scanList);
142 getScanner().setScanDirs(scanList);
143 }
144
145 getLog().debug("Restarting webapp ...");
146 webAppConfig.start();
147 getLog().info("Restart completed.");
148 }
149
150
151 /* (non-Javadoc)
152 * @see org.mortbay.jetty.plugin.util.AbstractJettyMojo#finishConfigurationBeforeStart()
153 */
154 public void finishConfigurationBeforeStart() throws Exception
155 {
156 return;
157 }
158
159
160
161 public void configureWebApplication () throws Exception
162 {
163 super.configureWebApplication();
164 webAppConfig.setWar(webApp.getCanonicalPath());
165 webAppConfig.configure();
166 }
167
168 public void execute () throws MojoExecutionException, MojoFailureException
169 {
170 super.execute();
171 }
172
173 }