【问题标题】:Java program that worked in Eclipse fails when in a Jar在 Eclipse 中运行的 Java 程序在 Jar 中失败
【发布时间】:2015-12-31 01:21:20
【问题描述】:

以下代码行:

SoyFileSet sfs = sfsBuilder.add(this.getClass().getResource("templates/mail.soy")).build();

在 Jar 外部运行但因空指针异常而失败。类似的帖子表明我应该尝试 getResourceAsStream 但 add 方法需要一个 URL。所以我认为我必须将 Stream 转换为 URL,但我不清楚如何继续。

【问题讨论】:

  • 你的项目结构是什么?也许你需要从资源的位置开始,比如/templates/mail.soy
  • 使用 ClassLoader getResource() 代替。 stackoverflow.com/a/1900173/16549
  • 在你的类路径中包含模板目录。

标签: java


【解决方案1】:

sfsBuilder.add() 还允许您将内容添加为 CharSequence。 因此,您可以自己读取文件并将其添加到构建器中。

类似:

SoyFileSet sfs = SoyFileSet.builder().add(IOUtils.toString(this.getClass().getResourceAsStream("templates/mail.soy")), "file/path/for/messages").build();

IOUtils 来自 apache 的 commons-io 项目

【讨论】:

  • 这似乎无法编译。
  • 响应已更新。该方法还需要消息的文件路径。 closure-templates.googlecode.com/svn/trunk/javadoc-lite/com/…
  • 消息是什么?是输出目录还是启动时不为空?
  • 这仍然失败。我尝试了带有前导斜杠的模板,但没有出现未知来源错误,我认为这与 IOUtils 找不到 mail.soy 有关。
【解决方案2】:

这最终工作如下:

{SoyFileSet sfs = sfsBuilder.add(this.getClass().getResource("/resources/templates/email.soy")).build();}

不确定这是否重要,但在 Eclipse 中,Runnable Jar 是使用 Package Required Libraries 创建的...

【讨论】:

    【解决方案3】:

    根据您发布的代码,我猜templates/mail.soy 是属于您的项目的文件,因此应该将其正确打包到 jar 中。但是,路径应该以斜杠开头:/templates/mail.soy 将匹配以下 jar 结构:

    META-INF/
    templates/
        mail.soy
    mypackage/
        MyProgram.class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多