Загрузчик ресурсов файла шаблона скорости не работает - PullRequest
0 голосов
/ 18 марта 2019

Столкнувшись с какой-то странной проблемой, настраивая Velocity Engine следующим образом.

 Properties properties = new Properties();
    properties.setProperty(RuntimeConstants.EVENTHANDLER_INCLUDE,IncludeRelativePath.class.getName());

    properties.setProperty(RuntimeConstants.RESOURCE_LOADER, "file");
    properties.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
    File f = new File(".");
    LOGGER.info("Base class path : {}",f.getCanonicalPath());
    //Objects.requireNonNull(resource);
    properties.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH,f.getCanonicalPath());
    VelocityEngine velocityEngine = new VelocityEngine();
    velocityEngine.init(properties);
    return velocityEngine;

Затем я пытаюсь получить файл, созданный с использованием:

PrintWriter out = new PrintWriter(templateName+".vm");
        out.println(fileContentStr);
        out.close();

, например:

Template t = this.getEngine().getTemplate(  fileName + ".vm");

Это дает мне ResourceNotFoundException.Это работает в моем местном.Я нигде не прописываю путь.Не в состоянии понять, почему это не работает.Пожалуйста, кто-нибудь может попытаться помочь мне здесь.Я застрял после попытки всех комбинаций перестановок.

Мотив: Мне просто нужно иметь возможность прочитать файл VM из каталога проекта и создать его.

1 Ответ

0 голосов
/ 18 марта 2019

Если вы уверены, что рабочий каталог не изменяется между временем создания шаблона и временем его чтения, тогда вам не нужно устанавливать какое-либо свойство перед инициализацией Velocity:

  • вам не нужен IncludeRelativePath, поскольку его назначение - позволить #include () и #parse () найти шаблоны в том же каталоге, что и текущий шаблон.Это не относится к вашему случаю использования.
  • вам не нужно устанавливать загрузчик ресурсов file, потому что это по умолчанию.
  • вам, конечно, не нужно устанавливать классзагрузчик ресурсов classpath, потому что вы даже не используете его
  • , вам не нужно указывать путь к загрузчику ресурсов файлов, поскольку по умолчанию он равен ".".

Я не знаю, почему ваш код работает локально, а не в производство.Возможно, рабочий каталог изменился.Возможно переменные templateName и fileName не согласованы.Возможно, шаблон запрашивается до того, как он будет написан.Есть ли серьезные различия между средами?Есть проблемы с безопасностью?Операционные системы одинаковы?Как отметил soorapadman, это может быть проблема с чувствительностью к регистру между Linux и Windows.

Следующий код должен работать везде:

VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.init();
PrintWriter out = new PrintWriter("test.vm");
out.println("hello");
out.close();
Template template = velocityEngine.getTemplate("test.vm");
...