[Resolvido] Caminho relativo (com VRaptor)

6 respostas
R

Bom dia pessoal,

Procurei muito sobre isso mas todas as respostas que encontrei, não funcionaram no meu caso. Não sei se fiz algo de errado ou se pode ter alguma coisa haver com ambiente, por isso estou pedindo ajuda.

Minha situação é a seguinte:

Antes eu abria arquivos .properties com o ResourceBundle.getBundle(“arquivo”), mas surgiu a necessidade de carregar esses arquivos de fora do WAR, para facilitar a configuração, porém o pessoal queria manter os valores default dentro do WAR, então a lógica seria assim:

  • existe o arquivo .properties externo?
    • pega ele
  • não?
    • pega o local (dentro do WAR)

Pegar o externo está tranquilo, porém o local está complicado, não consigo chegar nele, minhas últimas tentativas foram baseadas no ClassLoader, porém sem sucesso. Tentando achar de onde ele está tentando pegar os arquivos, usei o ClassLoader.getSystemResources("/"), porém não me retornou nada.

Alguém poderia me ajudar, por favor? Para complementar as informações, estou usando o VRaptor (não sei se ele pode influenciar nesse caso).

De preferencia, não queria usar nada baseado em servlet, para poder ter uma classe que não dependa de onde está sendo usada.

Muito obrigado desde já!

6 Respostas

Lucas_Cavalcanti

o VRaptor não influencia em nada…

vc pode tentar isso:

Enumeration<URL> urls = getClass().getClassLoader().getResources("/arquivo.properties");

se não funcionar, vc precisa pegar o classloader da servlet… talvez servletContext.getClassLoader()

R

Lucas Cavalcanti:
o VRaptor não influencia em nada…

vc pode tentar isso:

Enumeration<URL> urls = getClass().getClassLoader().getResources("/arquivo.properties");

se não funcionar, vc precisa pegar o classloader da servlet… talvez servletContext.getClassLoader()

Lucas, eu fiz um teste e aparentemente funcionaria com em uma classe “normal”, porém em uma static não (tentei com Class.class.getClassLoader…), teria alguma esquema nesse caso?

Muito obrigado!

Lucas_Cavalcanti

vc tá fazendo isso em um método estático?

não faça isso, transforme a classe em um @Component @ApplicationScoped, e execute o código dentro da classe, no construtor ou em um método anotado com @PostConstruct

daí vc pode receber um ServletContext no construtor e usar o context.getClassLoader()

R

Lucas Cavalcanti:
vc tá fazendo isso em um método estático?

não faça isso, transforme a classe em um @Component @ApplicationScoped, e execute o código dentro da classe, no construtor ou em um método anotado com @PostConstruct

daí vc pode receber um ServletContext no construtor e usar o context.getClassLoader()

É Lucas, eu acabei mudando mesmo, só que fiz uma classe “normal”, sem dependência de VRaptor para poder usá-la em outros projetos também.

Deixa aproveitar que estamos falando sobre isso e te perguntar, qual é o local correto para os arquivos .properties? Cada um fala uma coisa, eu costumo por na pasta raiz das classes, porque usava o ResourceBundle.getBundle(), mas não sei, eu acho que talvez na WEB-INF fosse mais indicado, o que você acha?

Muito obrigado,

Lucas_Cavalcanti

a raiz da pasta classes já está dentro do WEB-INF :wink:

deixar os seus properties na pasta src (ou src/main/resources ou qqer coisa do tipo) é o normal.

R

Lucas Cavalcanti:
a raiz da pasta classes já está dentro do WEB-INF :wink:

deixar os seus properties na pasta src (ou src/main/resources ou qqer coisa do tipo) é o normal.

Beleza então, vou manter lá mesmo!

Valeu cara, muito obrigado!

Criado 3 de novembro de 2011
Ultima resposta 3 de nov. de 2011
Respostas 6
Participantes 2