11

我们想要一个简单的嵌入式 Jetty servelet,其 Web 资源位于 JAR 文件的资源文件夹中。我们在 JAR 中有一些属性文件,并使用资源路径加载它们。我们希望将 Jetty Resource Base 指定为:

  • 资源/网络应用
  • 设置:resource_handler。setResourceBase ( "webapp" )
    • 通过正确的 URL 指向JAR 文件中的该资源。

JAR 文件中的文件夹。这是一个简单的 JAR 文件(不是 WAR,没有框架,没有 Spring,尽管我们可能是最原始的)。初始测试继续为以下字符串引发异常:

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

虽然服务器似乎在运行,但结果找不到我的 index.html。(更新:)这个例子只是取自码头“嵌入式文件服务器”的例子。在这种情况下,要求 Jetty资源库映射到 JAR 文件(完整 URL):

  • "jar:file:!/webapp/index.html",

如下:

  • resource_handler.setResourceBase(" jar:file:!/webapp ");

而不是给出的示例:

  • resource_handler.setResourceBase(".");

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

  • 本地主机:8080/index.html
    • ...给...
  • jar:file:!/webapp/index.html

为了对比适用于以下配置文件的 JAR 路径。问题:URL 应该是什么,这样 Jetty 资源库才能为我的 Index.html 文件提供服务?

  • 资源/
    • 配置/
      • 显示属性

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

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

给出总体思路。

类似的问题:

4

2 回答 2

9

我有一个可行的解决方案 - 我发布的解决方法是希望这种方法能够激发正确的方法。我仍然相信应该有一种方法可以在 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 -sa new jarfile 在正在运行的 JAR 之上,Jetty 会给出:

 HTTP ERROR: 500

 Problem accessing /. Reason:

        java.lang.NullPointerException

你不能再访问页面了。这是出乎意料的(显然 JAR 保持打开状态)。好消息是,如果你mv -s jarfile:

  • mv fileserver.jar fileserverXX.jar

Jetty 愉快地继续从(重命名的)fileserverXX.jar 内容中提供服务。我可以为此感到高兴。但是我仍然想知道与绝对文件名匹配的等效相对路径。

于 2014-08-07T02:03:22.397 回答
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" });
于 2019-06-28T19:02:14.743 回答