Jersey 是否可以将静态资源存储在使用嵌入式jetty项目创建的uber jar中?

Jersey 是否可以将静态资源存储在使用嵌入式jetty项目创建的uber jar中?,jersey,jetty,embedded-jetty,Jersey,Jetty,Embedded Jetty,是否可以在使用嵌入式jetty服务器项目创建的uber jar中存储静态资源?我根据@JoakimErdfelt的回答创建了这个简单的项目。我保留了默认的servlet来提供静态内容,但我将动态servlet切换为restful jersey servlet,只要jar与index.html位于同一目录中,它就可以正常工作。我希望能够将index.html文件嵌入jar中,但是当我发布“mvn clean install”时,webapp目录不会出现在构建的jar中。我认为pom.xml需要一个

是否可以在使用嵌入式jetty服务器项目创建的uber jar中存储静态资源?我根据@JoakimErdfelt的回答创建了这个简单的项目。我保留了默认的servlet来提供静态内容,但我将动态servlet切换为restful jersey servlet,只要jar与index.html位于同一目录中,它就可以正常工作。我希望能够将index.html文件嵌入jar中,但是当我发布“mvn clean install”时,webapp目录不会出现在构建的jar中。我认为pom.xml需要一个条目,但我不知道它是什么,我认为jetty.java需要更改以在嵌入式webapp目录中找到index.html。下面是当前的目录结构

静态rest\src\main\java\org\rest\jetty.java

静态rest\src\main\java\org\rest\rest.java

静态rest\src\main\java\webapp\index.html

静态rest\pom.xml

jetty.java

package org.rest;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

public class Jetty {
    public static void main(String[] args) throws Exception {

        System.setProperty("org.eclipse.jetty.LEVEL","INFO");

        Server server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(8080);
        server.addConnector(connector);

        // Setup the basic appliation "context" for this application at "/"
        // This is also known as the handler tree (in jetty speak)
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);

        // The filesystem paths we will map
        String homePath = System.getProperty("user.home");
        String pwdPath = System.getProperty("user.dir");

        // add a simple Servlet at "dynamic/*"
        ServletHolder holderDynamic = new ServletHolder(
            "dynamic", org.glassfish.jersey.servlet.ServletContainer.class);
        context.addServlet(holderDynamic, "/dynamic/*");

        holderDynamic.setInitOrder(0);

        // Tells the Jersey Servlet which REST service/class to load.
        holderDynamic.setInitParameter(
           "jersey.config.server.provider.classnames",
           Rest.class.getCanonicalName());

        // add special pathspec of "/home/" content mapped to the homePath
        ServletHolder holderHome = new ServletHolder(
            "static-home", DefaultServlet.class);
        holderHome.setInitParameter("resourceBase",homePath);
        holderHome.setInitParameter("dirAllowed","true");
        holderHome.setInitParameter("pathInfoOnly","true");
        context.addServlet(holderHome,"/home/*");

        // Lastly, the default servlet for root content (always needed, to satisfy servlet spec)
        // It is important that this is last.
        ServletHolder holderPwd = new ServletHolder(
            "default", DefaultServlet.class);
        holderPwd.setInitParameter("resourceBase",pwdPath);
        holderPwd.setInitParameter("dirAllowed","true");
        context.addServlet(holderPwd,"/");

        try
        {
            server.start();
            server.dump(System.err);
            server.join();
        }
        catch (Throwable t)
        {
            t.printStackTrace(System.err);
        }
    }
}
package org.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

    @Path("/rest")
public class Rest {

    @GET
    @Path("/{msg}")
    @Produces(MediaType.TEXT_PLAIN)
    public String echo(@PathParam("msg") String msg) {
        return "echo: " + msg;
    }
}
rest.java

package org.rest;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

public class Jetty {
    public static void main(String[] args) throws Exception {

        System.setProperty("org.eclipse.jetty.LEVEL","INFO");

        Server server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(8080);
        server.addConnector(connector);

        // Setup the basic appliation "context" for this application at "/"
        // This is also known as the handler tree (in jetty speak)
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);

        // The filesystem paths we will map
        String homePath = System.getProperty("user.home");
        String pwdPath = System.getProperty("user.dir");

        // add a simple Servlet at "dynamic/*"
        ServletHolder holderDynamic = new ServletHolder(
            "dynamic", org.glassfish.jersey.servlet.ServletContainer.class);
        context.addServlet(holderDynamic, "/dynamic/*");

        holderDynamic.setInitOrder(0);

        // Tells the Jersey Servlet which REST service/class to load.
        holderDynamic.setInitParameter(
           "jersey.config.server.provider.classnames",
           Rest.class.getCanonicalName());

        // add special pathspec of "/home/" content mapped to the homePath
        ServletHolder holderHome = new ServletHolder(
            "static-home", DefaultServlet.class);
        holderHome.setInitParameter("resourceBase",homePath);
        holderHome.setInitParameter("dirAllowed","true");
        holderHome.setInitParameter("pathInfoOnly","true");
        context.addServlet(holderHome,"/home/*");

        // Lastly, the default servlet for root content (always needed, to satisfy servlet spec)
        // It is important that this is last.
        ServletHolder holderPwd = new ServletHolder(
            "default", DefaultServlet.class);
        holderPwd.setInitParameter("resourceBase",pwdPath);
        holderPwd.setInitParameter("dirAllowed","true");
        context.addServlet(holderPwd,"/");

        try
        {
            server.start();
            server.dump(System.err);
            server.join();
        }
        catch (Throwable t)
        {
            t.printStackTrace(System.err);
        }
    }
}
package org.rest;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

    @Path("/rest")
public class Rest {

    @GET
    @Path("/{msg}")
    @Produces(MediaType.TEXT_PLAIN)
    public String echo(@PathParam("msg") String msg) {
        return "echo: " + msg;
    }
}
index.html

<html>
<body>
<p>Send Restful Request Demo</p>
<input type="text" id="myText" value="message">
<button onclick="myFunction()">Send</button>
<p id="demo"></p>
<script>
function myFunction() {
  var msg = document.getElementById("myText").value;
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
      document.getElementById("demo").innerHTML=xmlhttp.responseText;
    }
  }
  xmlhttp.open("GET", "http://localhost:8080/dynamic/rest/" + msg, true);
  xmlhttp.send();
}
</script>
</body>
</html>