从嵌套JAR加载Velocity模板

时间:2014-05-08 19:54:33

标签: java classpath velocity onejar

我有一个应用程序打包在onejar中,它使用Velocity进行模板化。

在我的maven项目设置中,我在$base/src/main/resources/template.html中有一个文件。当应用程序打包为onejar时,生成的onejar包含一个嵌套的jar(在main / my-jar.jar下)。该jar又将template.html文件打包在其根目录下。 (显然maven将它从src / main / resources复制到包的根目录中)

我想将该模板作为Velocity中的资源加载。我已经读过我需要使用ClassPathResourceLoader来做到这一点,所以我的代码看起来像这样:

    VelocityEngine ve = new VelocityEngine();
    ve.setApplicationAttribute("resource.loader", "class");

    ve.setApplicationAttribute("class.resource.loader.class", 
                               org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader.class);

    ve.init();
    Template t = ve.getTemplate("template.html");

每次都失败,但Velocity的资源加载器都无法找到该文件。

我有两个问题 - 首先,这是配置使用ClasspathResourceLoader的正确方法吗?第二,如果配置正确,我会指定哪条路径,以便在内部嵌套jar中找到template.html?

2 个答案:

答案 0 :(得分:1)

经过大量的挖掘后,我找到了答案。

使用ClasspathResourceLoader的代码如下:

VelocityEngine ve = new VelocityEngine();

ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath"); 
ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());

ve.init();

其次,很多人告诉我,在嵌套jar中,标准类路径加载器甚至不能找到template.html文件。我被告知有必要使用一些奇特的第三方类加载器。 OneJar提供了这样一个花哨的装载机。一旦我得到正确的代码以使用ClasspathResourceLoader,事情似乎就解决了。

要记住的是" /"是相对于类路径根。因此,当$base/src/main/resources/template.html在解压缩的JAR的根目录中重新打包为template.html时,这意味着/template.html是要加载的正确资源路径。

该路径/template.html当然与嵌套的内部JAR相关。类加载器(无论是标准的还是OneJar)如何在外罐的/和内罐之间混淆,我不知道。

答案 1 :(得分:0)

使用/作为相对路径

指定template.html所在的路径

并使用setProperty,如下所示

VelocityEngine ve = new VelocityEngine();
            ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
            ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());

            ve.init();

            final String templatePath = "/" + template + ".html";


            Template template = ve.getTemplate(templatePath, "UTF-8");