为嵌入式Jetty指定JAR“resources / webapp”文件夹的ResourceBase的正确URL是什么?

时间:2014-08-06 07:36:56

标签: java maven url jar jetty-9

我们想要一个简单的嵌入式Jetty服务器,其中包含JAR文件资源文件夹中的Web资源。我们在JAR中有一些属性文件,并使用资源路径加载它们。我们想要将Jetty资源库指定为:

  • 资源/的 web应用
  • set:resource_handler。 setResourceBase (“webapp”)
    • 通过正确的网址指向JAR file
    • 中的该资源

JAR文件中的文件夹。这是一个简单的JAR文件(不是WAR,没有框架,没有Spring,就像我们可能那样的vanilla )。初始测试继续抛出类似以下字符串的异常:

webPath = "jar:file:!/webapp";     //.... runs the Jetty server 
 ... 
resource_handler.setResourceBase( webPath );

虽然服务器似乎运行,但结果无法找到我的index.html。 ( 更新 :)此示例仅来自Jetty“Embedded File Server”示例。在这种情况下,要求Jetty 资源库映射到JAR文件(完整URL):

  • “jar:file:!/ webapp / index.html”,

如下:

  • resource_handler.setResourceBase( “罐:文件:/ web应用”);

而不是给出的例子:

  • resource_handler.setResourceBase( “”);

我们希望将浏览器URL映射为:

  • 本地主机:8080 / index.html中
    • ......给...
  • 罐子:文件:/ web应用/ index.html的

对比下面用于配置文件的JAR路径。问题是:the URL应该是什么,Jetty资源库可以提供我的Index.html文件?

  • 资源/
    • 配置/
      • display.properties

文件是:“/ config / display.properties”,它使用加载资源操作在相同的项目代码中工作。布局是这样的:

 app.jar
   +----- com /
   |        +--- ( classes ... )
   |
   +----- config /
   |        |
   |        +--- display.properties
   |
   +----- webapp /
            |
            +--- index.html

提出一般性的想法。

类似的问题:

2 个答案:

答案 0 :(得分:7)

我有一个可行的解决方案 - 我发布的解决方法,希望这种方法能激发正确的方法。我仍然认为应该有一种方法来指定JAR中相对于JAR的文件夹。

无论如何这种方法有效。我用它来从JAR内部服务静态Web内容。基本上我有Java解析正在运行的JAR资源的绝对路径,并将该路径名传递给Jetty。当我这样做时,Jetty会显示我的" helloWorld.html",欢迎文件。

    String  baseStr  = "/webapp";  //... contains: helloWorld.html, login.html, etc. and folder: other/xxx.html
    URL     baseUrl  = SplitFileServerRunner.class.getResource( baseStr ); 
    String  basePath = baseUrl.toExternalForm();

      .... 
    resource_handler.setDirectoriesListed(true);      //... just for testing
    resource_handler.setWelcomeFiles(new String[]{ "helloWorld.html" });
    resource_handler.setResourceBase( basePath );
    LOG.info("serving: " + resource_handler.getBaseResource());

在欢迎文件中,我放置了特定文本来标识文件的来源(在资源文件夹中)。在浏览器中:

  • 本地主机:8080

提供helloWorld.html文件。

  • 本地主机:8080 /其他

显示JAR文件中 jar:/ webapp / other / 目录的目录列表。这依赖于在服务器运行时更​​改JAR。

在Linux上,如果有人 cp - 在运行的JAR的顶部有一个新的jar文件,Jetty会给出:

 HTTP ERROR: 500

 Problem accessing /. Reason:

        java.lang.NullPointerException

您无法再访问网页了。这是出乎意料的(显然JAR保持开放)。好消息是,如果你 mv -s jarfile:

  • mv fileserver.jar fileserverXX.jar

Jetty很高兴继续从(重命名的)fileserverXX.jar内容提供服务。我很高兴。但是,我仍然想知道匹配绝对文件名的等效相对路径。

答案 1 :(得分:0)

自原始答案以来,某些方法已发生更改,因此以下操作与Jetty版本相同:9.4.12.v20180830:

ServletContextHandler webappContext = new ServletContextHandler(ServletContextHandler.SESSIONS);  
URL webRootLocation = JettyStart.class.getResource("/webapp/index.html");  
URI webRootUri = URI.create(webRootLocation.toURI().toASCIIString().replaceFirst("/index.html$", "/"));  
webappContext.setContextPath("/");
webappContext.setBaseResource(Resource.newResource(webRootUri));
webappContext.setWelcomeFiles(new String[] { "index.html" });