将Jetty资源库设置为嵌入在同一jar文件中的静态文件

时间:2014-09-04 08:15:33

标签: jar jetty embedded-jetty

我正在尝试访问打包在同一.jar文件(testJetty.jar)中的静态资源(例如first.html),该文件还有一个启动jetty(v.8)服务器的类(MainTest.java) 。我无法正确设置资源库。

我的jar文件的结构(testJetty.jar): testJetty.jar

  • first.html

  • MainTest.java

== 在本地机器上正常工作,但当我将它包装在jar文件中然后运行它时,它不起作用,给出" 404:找不到文件"错误。

我尝试使用以下值设置资源库,所有这些都失败了:

a)尝试将其设置为。

resource_handler.setResourceBase("."); // Results in directory containing the jar file, D:\Work\eclipseworkspace\testJettyResult

b)尝试从getResource获取它

ClassLoader loader = this.getClass().getClassLoader();
File indexLoc = new File(loader.getResource("first.html").getFile());
String htmlLoc = indexLoc.getAbsolutePath();
resource_handler.setResourceBase(htmloc); // Results in D:\Work\eclipseworkspace\testJettyResult\file:\D:\Work\eclipseworkspace\testJettyResult\testJetty1.jar!\first.html

c)尝试获取webdir

String webDir = this.getClass().getProtectionDomain()
        .getCodeSource().getLocation().toExternalForm();
resource_handler.setResourceBase(webdir); // Results in D:/Work/eclipseworkspace/testJettyResult/testJetty1.jar

这三种方法都不起作用。

任何帮助或替代方案都将不胜感激

由于 阿巴斯

3 个答案:

答案 0 :(得分:3)

此线程中提供的解决方案有效,但我认为解决方案的一些清晰度可能很有用。

如果您正在构建一个胖罐并使用ProjectionDomain方式,那么您可能会遇到一些问题,因为您正在加载整个jar!

class.getProtectionDomain() .getCodeSource().getLocation().toExternalForm();

所以更好的解决方案是另一个提供的解决方案

contextHandler.setResourceBase(YourClass.class.getClassLoader().getResource("WEB-INF").toExternalForm());

这里的问题是,如果你正在构建一个胖jar,你实际上并没有将你的webapp资源转储到WEB-INF中,但可能会进入jar的根目录,所以一个简单的解决方法是创建一个文件夹XXX并使用第二种方法如下:

contextHandler.setResourceBase(YourClass.class.getClassLoader().getResource("XXX").toExternalForm());

或者更改构建工具以将webapp文件导出到该给定目录中。也许Maven会为你做一个Jar,但gradle没有。

答案 1 :(得分:1)

并非异常,我找到了解决问题的方法。 Stephen在Embedded Jetty : how to use a .war that is included in the .jar from which Jetty starts?中提到的第三种方法有效!

所以,我从Resource_handler更改为WebAppContext,其中WebAppContext指向同一个jar(testJetty.jar)并且它有效!

    String webDir = MainTest.class.getProtectionDomain()
            .getCodeSource().getLocation().toExternalForm(); ; // Results in D:/Work/eclipseworkspace/testJettyResult/testJetty.jar
    WebAppContext webappContext = new WebAppContext(webDir, "/");

答案 2 :(得分:0)

看起来ClassLoader.getResource不理解空字符串或。或/作为一个论点。在我的jar文件中,我必须将所有stuf移动到WEB-INF(任何其他包装目录都可以)。所以代码看起来像

contextHandler.setResourceBase(EmbeddedJetty.class.getClassLoader().getResource("WEB-INF").toExternalForm()); 所以上下文就像这样:

ContextHandler:744 - 已启动oejwWebAppContext @ 48b3806 {/,jar:file:/Users/xxx/projects/dropbox/ui/target/ui-1.0-SNAPSHOT.jar!/ WEB-INF,AVAILABLE}