Pergunta

Eu preciso ler arquivos de propriedades que está enterrado na minha estrutura de pacotes em com.al.common.email.templates.

Eu tentei tudo e eu não consigo entender.

No final, o meu código será executado em um contêiner de servlet, mas eu não quero depender do recipiente para nada. I escrever casos de teste JUnit e ele precisa de trabalho em ambos.

Foi útil?

Solução

Ao carregar as propriedades de uma classe na com.al.common.email.templates pacote que você pode usar

Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();

(Incluir todo o tratamento de exceção necessário).

Se sua classe não está nesse pacote, você precisa adquirir o InputStream ligeiramente diferente:

InputStream in = 
 getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");

Os caminhos relativos (aqueles sem um líder '/') em getResource() / getResourceAsStream() significa que o recurso serão pesquisadas em relação ao directório que representa o pacote é a classe em.

Usando java.lang.String.class.getResource("foo.txt") iria procurar o (inexistente) /java/lang/String/foo.txt arquivo no classpath.

Usando um caminho absoluto (que começa com '/') significa que o pacote atual é ignorada.

Outras dicas

Para adicionar a resposta de Joachim Sauer, se você precisar fazer isso em um contexto estático, você pode fazer algo como o seguinte:

static {
  Properties prop = new Properties();
  InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
  prop.load(in);
  in.close()
}

(manipulação de exceção elidida, como antes.)

Os dois casos seguintes referem-se a carregar um arquivo de propriedades a partir de um exemplo de classe chamado TestLoadProperties.

Caso 1: Carregando o arquivo de propriedades usando ClassLoader

InputStream inputStream = TestLoadProperties.class.getClassLoader()
                          .getResourceAsStream("A.config");
properties.load(inputStream);

Neste caso, o arquivo de propriedades deve estar no diretório root/src para o carregamento bem sucedido.

Caso 2: Carregando o arquivo de propriedades sem usar ClassLoader

InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);

Neste caso, o arquivo de propriedades deve estar no mesmo diretório que o arquivo TestLoadProperties.class para o carregamento bem sucedido.

Nota: TestLoadProperties.java e TestLoadProperties.class são dois arquivos diferentes. O primeiro, arquivo .java, é normalmente encontrado no diretório src/ de um projeto, enquanto o último, arquivo .class, é normalmente encontrado em seu diretório bin/.

public class Test{  
  static {
    loadProperties();
}
   static Properties prop;
   private static void loadProperties() {
    prop = new Properties();
    InputStream in = Test.class
            .getResourceAsStream("test.properties");
    try {
        prop.load(in);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
public class ReadPropertyDemo {
    public static void main(String[] args) {
        Properties properties = new Properties();

        try {
            properties.load(new FileInputStream(
                    "com/technicalkeeda/demo/application.properties"));
            System.out.println("Domain :- " + properties.getProperty("domain"));
            System.out.println("Website Age :- "
                    + properties.getProperty("website_age"));
            System.out.println("Founder :- " + properties.getProperty("founder"));

            // Display all the values in the form of key value
            for (String key : properties.stringPropertyNames()) {
                String value = properties.getProperty(key);
                System.out.println("Key:- " + key + "Value:- " + value);
            }

        } catch (IOException e) {
            System.out.println("Exception Occurred" + e.getMessage());
        }

    }
}

Assumindo que o seu usando o Propriedades classe, através da sua método de carga , e eu acho que você está usando o ClassLoader getResourceAsStream para obter o fluxo de entrada.

Como você está passando o nome, parece que deveria ser desta forma: /com/al/common/email/templates/foo.properties

Eu consegui resolver este problema com esta chamada

Properties props = PropertiesUtil.loadProperties("whatever.properties");

extra, você tem que colocar seu arquivo whatever.properties em recursos / src / / main

Ninguém menciona a solução semelhante, mas ainda mais simples do que acima sem a necessidade de lidar com o pacote da classe. Assumindo myfile.properties está no classpath.

        Properties properties = new Properties();
        InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
        properties.load(in);
        in.close();

Aproveite

usar o código abaixo, por favor:

    Properties p = new Properties(); 
    StringBuffer path = new StringBuffer("com/al/common/email/templates/");
    path.append("foo.properties");
    InputStream fs = getClass().getClassLoader()
                                    .getResourceAsStream(path.toString());

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top