1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

ClassLoading em um Módulo WEB

Meu projeto possui a seguinte estrutura:

 Reactor Build Order:

 artifact
 artifact-commons
 artifact-domain
 artifact-repository
 artifact-web Maven Webapp
------------------------------------------------------------------------
 br.com.empresa.artifact:artifact-web:war:0.0.1-SNAPSHOT
 +- br.com.empresa.artifact:artifact-repository:jar:0.0.1-SNAPSHOT:runtime
 |  +- br.com.empresa.artifact:artifact-domain:jar:0.0.1-SNAPSHOT:runtime
 |  |  +- br.com.empresa.artifact:artifact-commons:jar:0.0.1-SNAPSHOT:runtime
------------------------------------------------------------------------

Estou inserindo internacionalização tanto no módulo WEB (artifact-web) quanto no módulo JAR (artifact-domain). Para tanto, inclui a seguinte classe em cada um dos projetos.

import java.io.IOException;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.Properties;

public final class MessageProp implements Serializable {

    private static final long serialVersionUID = 1L;

    private static final String PATH = "/Messages_pt_BR.properties";

    private final Properties configProperties = new Properties();

    public MessageProp() {
        try {
            configProperties.load(getClass().getResourceAsStream(PATH));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getProperty(String key) {
        return getProperty(key, "");
    }

    public String getProperty(String key, String defaultValue) {
        return this.getConfigProperties().getProperty(key, defaultValue);
    }

    public String getPropertyFormat(String key, Object... values) {
        return MessageFormat.format(this.getConfigProperties().getProperty(key), values);
    }

    public static MessageProp getInstance() {
        return SingletonHolder._instance;
    }

    private static class SingletonHolder {
        protected static final MessageProp _instance = new MessageProp();
    }

    public Properties getConfigProperties() {
        return this.configProperties;
    }

Essa classe ao ser inicializada busca a partir do ClassPath dela o resource no PATH "/Messages_pt_BR.properties". O problema é o que ClassPath da classe contida no artifact-domain é inicializada com o ClassLoader do WebAppClassLoader e ela busca o Messages_pt_BR.properties do WEB e não do próprio JAR. Como faço para contornar essa situação, fazer com que o MessageProp traga o Messages_pt_BR.properties do seu próprio módulo e não do WEB?

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags classpath classloader java-ee properties injeção-de-dependências ou faça a sua própria pergunta.