今天碰到问题了。
在maven搭建的工程中,使用jetty做热部署,修改了演示文件无法保存,蛋疼了~~你说就改下静态文件还不让,非得要关掉jetty后修改保存!好事郁闷,google一下吧,哈哈
一大堆这样的问题。
1 首先找到了下边的描述
jetty启动后,如果修改javascript文件,将不能保存,使调试很麻烦。这是因为使用了CACHE,JETTY说是WINDOWS下的一个限制。可以通过如下方法修正:
解压出jetty.jar中的org/mortbay/jetty/webapp/webdefault.xml文件,将这一选项由true改为false,另存到src/main/resources目录,或者其它自选目录。
<init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>true</param-value> <!-- change to false -->
</init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>true</param-value> <!-- change to false -->
</init-param>
把修改后的webdefault.xml文件跟pom.xml放在一起
修改pom.xml里的Jetty Plugin的配置,加入webdefault.xml
...
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
<configuration>
<contextPath>/</contextPath>
<webDefaultXml>webdefault.xml</webDefaultXml>
...
</configuration>
...
</plugin>
...
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
<configuration>
<contextPath>/</contextPath>
<webDefaultXml>webdefault.xml</webDefaultXml>
...
</configuration>
...
</plugin>
...
但是,照做不行,报错了,请看错误
- java.lang.ClassNotFoundException: org.mortbay.jetty.servlet.DefaultServlet
- at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
- at java.security.AccessController.doPrivileged(Native Method)
- at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
- at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:428)
- at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:381)
很蛋疼吧,没有找到类,那么这个类是什么,仔细观察,是叫jetty包下的。
但是我们用的版本是什么呢 7.6
请注意了,这个时候的jetty 已经投入到eclipse的怀抱中了。哈哈
所以当然在公司内部使用groupId和ArtifactId也发生了变化肯定就变了啊
修改webdefault.xml文件
- <servlet>
- <servlet-name>default</servlet-name>
- <!-- <servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class> -->
- <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
- <init-param>
- <param-name>useFileMappedBuffer</param-name>
- <param-value>false</param-value>
- </init-param>
- <load-on-startup>0</load-on-startup>
- </servlet>
问题解决
附上项目中使用的server 代码
public static final String BASE_URL = "http://localhost:8888/";
public static void main(String[] args) throws Exception {
try {
Server server = buildNormalServer(8888, "/");
server.start();
server.join();
System.out.println("Server running at " + BASE_URL);
System.out.println("Hit Enter to reload the application");
// 等待用户输入回车重载应用.
while (true) {
char c = (char) System.in.read();
if (c == '\n') {
System.out.println("Application reloading");
server.stop();
server = buildNormalServer(8888, "/");
server.start();
server.join();
System.out.println("Application reloaded");
}
}
}
catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
}
/**
* 创建用于正常运行调试的Jetty Server, 以src/main/webapp为Web应用目录.
*/
public static Server buildNormalServer(int port, String contextPath) {
Server server = new Server(port);
WebAppContext webContext = new WebAppContext("./src/main/webapp", contextPath);
webContext.setDefaultsDescriptor("./webdefault.xml");
webContext.setClassLoader(Thread.currentThread().getContextClassLoader());
server.setHandler(webContext);
server.setStopAtShutdown(true);
return server;
}