Onde devo colocar arquivos de modelo de velocidade para um utilitário de linha de comando construído com Maven?

StackOverflow https://stackoverflow.com/questions/435210

  •  10-07-2019
  •  | 
  •  

Pergunta

Eu tenho um projeto utilitário de linha de comando pequena que eu estou usando Maven para gerenciar. O utilitário é um aplicativo muito simples de preencher um modelo Velocity e despejar os resultados em um novo arquivo. Meu problema é onde colocar meus modelos Velocity. Quando eu colocá-los em src/test/resources/foo/bar/baz, mvn test falha porque ele não pode encontrar o modelo de referência, embora seja claramente lá em target/classes/foo/bar/baz, que é onde o arquivo .class para o teste e a classe em teste estão localizados. Se eu colocar o modelo no diretório de nível superior do projeto, o teste passa, mas então eu não estou seguindo a estrutura do projeto Maven, e eu suspeito que o arquivo .jar embalados real não funcionaria. O que eu estou ausente?

UPDATE:

Método sob teste :

public final void mergeTemplate(final String templateFileName, final Writer writer) throws ResourceNotFoundException, ParseErrorException, MethodInvocationException, IOException, Exception {
    Velocity.init();
    Velocity.mergeTemplate(templateFileName, Charset.defaultCharset().name(), context(), writer);
}

Método de ensaio :

@Test
public void testMergeTemplate() throws Exception {
    final FooGenerator generator = new FooGenerator();
    final StringWriter writer = new StringWriter();
    generator.mergeTemplate("foo.yaml", writer);
    Assert.assertEquals("Something went horribly, horribly wrong.", EXPECTED_RESULT, writer.toString().trim());
}

O único lugar que pode colocar foo.yaml e ter os testes passarem está no diretório raiz do projeto, ou seja, como um par de src e target.

Foi útil?

Solução 3

Assim, verifica-se que em vez de usar algo como

generator.mergeTemplate("foo.yaml", writer);

Eu deveria usar algo como

InputStream fooStream = getClass().getResourceAsStream("foo.yaml");
generator.mergeTemplate(fooStream, writer);

Outras dicas

Você pode template_root programaticamente configure o seguinte:

Properties props = new Properties();        
props.put("file.resource.loader.path", templateRootDir);

VelocityEngine engine = new VelocityEngine();
engine.init(props);
engine.evaluate(...);

Você deve colocá-los em src / main / recursos / foo / bar / baz, porque eles precisam ser incluídos no arquivo jar principal.

Você poderia Velocity apenas configure para usar o ClasspathResourceLoader, em vez do FileResourceLoader padrão.

Velocity.setProperty

Eu tentei () para definir as propriedades semelhantes ao que foi dito acima, @Jin Kim e foi capaz de executá-lo.

VelocityEngine ve = new VelocityEngine();
ve.setProperty(RunTimeConstants.RESOURCE_LOADER,"file");
ve.setProperty("file.resource.loader.path",templaterootdir);

ve.init();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top