如何从java代码访问Maven资源目录?

时间:2014-07-22 10:02:06

标签: java maven freemarker

我正在尝试访问位于maven项目的resources文件夹中的文件(hello.ftl)。

这是尝试访问目录的类:

HelloFreemarker.java

package mypackage.main;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;


public class HelloFreemarker {

    public static void main(String[] args) throws IOException, TemplateException {
        Configuration cfg = new Configuration();
        cfg.setObjectWrapper(new DefaultObjectWrapper());

        cfg.setDirectoryForTemplateLoading(new File("."));

        Map<String, Object> model = new HashMap<String, Object>();
        model.put("name", "World");

        Template template = cfg.getTemplate("hello.ftl");
        template.process(model, new OutputStreamWriter(System.out));
    }
}

我在控制台中遇到的错误如下:

Exception in thread "main" java.io.FileNotFoundException: Template "hello.ftl" not found.
    at freemarker.template.Configuration.getTemplate(Configuration.java:742)
    at freemarker.template.Configuration.getTemplate(Configuration.java:665)
    at mypackage.main.HelloFreemarker.main(HelloFreemarker.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Process finished with exit code 1

1 个答案:

答案 0 :(得分:1)

这是HelloFreemarker类,经过添加注释的人建议的一些代码更改后:

package mypackage.main;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;


public class HelloFreemarker {

    public static void main(String[] args) throws IOException, TemplateException {
        Configuration cfg = new Configuration();
        cfg.setObjectWrapper(new DefaultObjectWrapper());

        String path = HelloFreemarker.class.getResource("../..").getPath();

        cfg.setDirectoryForTemplateLoading(new File(path));

        Map<String, Object> model = new HashMap<String, Object>();
        model.put("name", "World");

        Template template = cfg.getTemplate("hello.ftl");
        template.process(model, new OutputStreamWriter(System.out));
    }
}

从编译类的目录到文件所在的目录(目标/类),需要两个目录向上命令。