开始在java代码中嵌入码头,如何让它自动重新加载*.jsp/*.css/*.js?
Posted
技术标签:
【中文标题】开始在java代码中嵌入码头,如何让它自动重新加载*.jsp/*.css/*.js?【英文标题】:Start embed jetty in java code, how to make it auto reload *.jsp/*.css/*.js? 【发布时间】:2014-01-24 16:37:30 【问题描述】:在我的项目中,我们用java代码启动jetty server,比如:
import org.eclipse.jetty.server.Server;
public static void main(String[] args)
Server server= new Server();
server.setThreadPool(createThreadPool());
server.addConnector(createConnector());
server.setHandler(new WebAppContext(getWarRootPath(), "/"));
server.setStopAtShutdown(true);
server.start();
效果很好,但是唯一的问题是如果我们在jetty运行的时候修改*.jsp或者*.js或者*.css,刷新浏览器是看不到变化的。我必须重新启动程序。
有没有办法让它自动重新加载? (我必须在java代码中启动jetty,所以这里不能使用3rd-putty插件)
【问题讨论】:
【参考方案1】:您对 WebAppContext 的简单使用意味着您的 webapp 内容正在各种 servlet 临时目录中展开/复制/移动/管理。您的项目的 *.jsp
和 *.js
和 *.css
不存在。
其他工具(如jetty-maven-plugin
)实现此目的的方式是在检测到文件更改时重新启动 webapp。
示例(伪代码):
String webroot = getWarRootPath();
WebAppContext webapp = new WebAppContext(webroot, "/");
server.setHandler(webapp);
scanner.setMonitorDirectory(webroot);
scanner.addListener(this);
...
public void onScannerEvent(ScannerEvent evt)
if(!evt.path.isFile())
return; // no point restarting on directory only event
webapp.stop();
if(evt.isNew() || evt.wasDeleted())
reconfigureScanner();
webapp.start();
如果您正在使用 Java 7,您可以查看它的 java.nio.file.Watch*
工具,或者您可以使用 org.eclipse.jetty.util.Scanner
(旧代码)来完成 same end goal。
【讨论】:
出于对 Joakim 的兴趣,是否可以使用类似于您的答案 ***.com/a/14368310/129822 的 WebAppProvider 和 DeploymentManager 的组合。设置 setMonitoredDirName 和 setScanInterval。 @Andrew 当然可以,这就是 Jetty 发行版本身的运作方式。以上是关于开始在java代码中嵌入码头,如何让它自动重新加载*.jsp/*.css/*.js?的主要内容,如果未能解决你的问题,请参考以下文章
启动tomcat后,每次修改java文件都会重新加载整个应用(像重新部署),怎么修改让它不重新加载!
如何在 Datatables 中加载表并让它在加载时自动滚动到最后一条记录