在Eclipse中工作的Java程序在Jar中失败

在Eclipse中工作的Java程序在Jar中失败,java,Java,以下代码行: SoyFileSet sfs = sfsBuilder.add(this.getClass().getResource("templates/mail.soy")).build(); 在Jar外部运行时工作,但由于空指针异常而失败。类似的帖子表明我应该尝试getResourceAsStream,但是add方法需要一个URL。因此,我认为我必须将流转换为URL,但我不清楚具体如何继续。sfsBuilder.add()还允许您将内容添加为CharSequence。 因此,您可以自己读

以下代码行:

SoyFileSet sfs = sfsBuilder.add(this.getClass().getResource("templates/mail.soy")).build();
在Jar外部运行时工作,但由于空指针异常而失败。类似的帖子表明我应该尝试getResourceAsStream,但是add方法需要一个URL。因此,我认为我必须将流转换为URL,但我不清楚具体如何继续。

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项目

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

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

这最终的效果如下:

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


不确定这是否重要,但在Eclipse中,Runnable Jar是使用包所需的库创建的…

项目的结构是什么?也许您需要从资源的位置开始,比如
/templates/mail.soy
使用ClassLoader getResource()。在类路径中包含templates目录。这似乎无法编译。响应已更新。该方法还需要消息的文件路径。这些信息是什么?它是输出目录还是启动时它应该是非空的?这仍然失败。我尝试过带前导斜杠和不带斜杠的模板,但我得到了一个未知源错误,我认为这与IOUtils找不到mail.soy有关。