如何才能在Jetty中访问Jar包中META-INF/resources下的静态资源?

注:问题与JFinal本身无关,只是想在这里寻找答案。

开发环境:eclipse + Maven + Jetty9 + JDK8 + servlet3.0

实现过程:将js、css等静态资源文件封装到模块Jar包的META-INF/resources中,希望利用servlet3的特性,可以直接被Web访问到,实现各模块的静态文件单独部署的目的。

目前的情况是替换成Tomcat8环境确实可以,说明Maven生成的模块Jar包应该没有问题。但在Jetty9环境无法访问,个人怀疑还是我的Jetty封装部分存在问题。

注:原来使用JFinal默认的Jetty8无法实现,所以才换成Jetty9,依然如此。

下面附上我的Jetty9封装:

import java.net.InetSocketAddress;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
import com.jfinal.log.Log;

/**
 * 嵌入式Jetty封装
 * @author netwild
 *
 */
public class MyJetty {

    private static Log log = Log.getLog(MyJetty.class);

    private Server server;
    private WebAppContext handler;
    
    private String host = "127.0.0.1";
    private Integer port = 80;
    private String webAppDir = "src/main/webapp";
    private String contextPath = "/";
    
    private boolean running = false;

    public MyJetty() {
    }

    public MyJetty(String host, Integer port, String webAppDir, String contextPath) {
        this.host = host;
        this.port = port;
        this.webAppDir = webAppDir;;
        this.contextPath = contextPath;
    }

    /**
     * 启动服务
     * @return
     */
    public boolean start() {
        if (!running) {
            try {
                initServer();
                server.start();
                running = false;
                log.info("MyJetty启动成功!");
            } catch (Throwable ex) {
                log.info("MyJetty启动失败!");
                log.error(ex.toString(), ex);
                stop();
                return false;
            }
        }
        return true;
    }

    /**
     * 初始化服务
     */
    private void initServer() {
        InetSocketAddress address = new InetSocketAddress(host, port);
        server = new Server(address);
        server.setStopAtShutdown(true);

        handler = new WebAppContext();
        handler.setContextPath(contextPath);
        handler.setResourceBase(webAppDir);
        handler.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
        handler.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");    // webApp.setInitParams(Collections.singletonMap("org.mortbay.jetty.servlet.Default.useFileMappedBuffer", "false"));
        server.setHandler(handler);
    }

    /**
     * 停止服务
     * @return
     */
    public boolean stop() {
        if (running) {
            try {
                server.stop();
                running = false;
                log.info("MyJetty停止成功!");
            } catch (Exception ex) {
                log.info("MyJetty停止失败!");
                log.error(ex.toString(), ex);
                return false;
            }
        }
        return true;
    }

}

评论区

七五热

2018-02-06 11:55

META-INF/ 是啥路径啊,百度下呗,我也不知道啊。为什么一定要是这个路径啊

netwild

2018-02-06 11:57

@七五热 servlet3.x支持的,jar包里,META-INF/resource中的静态文件可以直接被Web访问