1

我有一个打包在 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?

4

2 回答 2

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 的代码,事情似乎就解决了。

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

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

于 2014-05-12T12:42:57.027 回答
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");
于 2014-05-12T12:44:43.267 回答