开始在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 中加载表并让它在加载时自动滚动到最后一条记录

Java 嵌入式数据库持久化

嵌入式码头热部署

tomcat更新了class文件,如果不reload,有啥方法能让它自动重新加载吗

如何使用嵌入式码头添加 servlet 过滤器