2013-01-22 2 views
0

ResourceBundle에서 Properties (클래스)로 전환하는 방법은 무엇입니까?ResourceBundle에서 Properties (클래스)로 전환하는 방법은 무엇입니까?

2 개의 Java 프로젝트 (코어 & 웹)로 분할 된 앱이 있습니다. 코어 모듈의 Java 서비스는 웹 모듈에있는 .properties 파일에서 값을 읽어야합니다. ResourceBundle을 사용할 때 예상대로 작동합니다.

몇 가지 이유로 ResourceBundle이 캐시되고 ResourceBundle.Control에 캐시가 없기 때문에 Properties 클래스로 전환하고 싶습니다. 불행히도 나는 작동 할 수 없습니다. 특히 어떤 상대 경로가 올바른지 알아낼 수 없기 때문에 가능합니다.

디 컴파일 된 ResourceBundle 클래스 (기타)를 읽고 일부 ClassLoader에서 getResource() 사용을 확인했습니다. FileInputStream을 직접 사용하는 대신 ServiceImpl.class 또는 ResourceBundle.class에서 getResource() 또는 단순히 getResourceAsStream()을 테스트했지만 성공하지 못했습니다 ...

누구나이 작업 방법을 알 수 있습니까? 감사!

app-web 
    src/main/resources 
     /properties 
      app-info.properties 
+0

관련 : http://stackoverflow.com/questions/2308188/getresourceasstream-vs-fileinputstream/2308388#2308388 – BalusC

답변

2

당신은 적절한으로 getResource() 또는 getResourceAsStream()을 사용해야합니다

app-core 
    src/main/java 
     com.my.company.impl.ServiceImpl 

      public void someRun() { 
       String myProperty = null; 
       myProperty = getPropertyRB("foo.bar.key"); // I get what I want 
       myProperty = getPropertyP("foo.bar.key"); // not here... 
      } 

      private String getPropertyRB(String key) { 
       ResourceBundle bundle = ResourceBundle.getBundle("properties/app-info"); 
       String property = null; 
       try { 
        property = bundle.getString(key); 
       } catch (MissingResourceException mre) { 
        // ... 
       } 
       return property; 
      } 

      private String getPropertyP(String key) { 
       Properties properties = new Properties(); 

       InputStream inputStream = new FileInputStream("properties/app-info.properties"); // Seems like the path isn't the good one 
       properties.load(inputStream); 
       // ... didn't include all the try/catch stuff 

       return properties.getProperty(key); 
      } 

이 등록 정보 파일있는 웹 모듈입니다 :

는 서비스 내 응용 프로그램의 핵심 속성 값을 받고있다 경로 및 클래스 로더.

입력 스트림 inputStream = getClass(). getClassLoader(). getResourceAsStream ("properties/app-info.properties");

파일이 있는지 확인 app-info.properties 이름, 및 (문맥이 일치 할 때)하지만 getResourceAsStream()에 의해 ResourceBundle에 의해 발견 될 수 app-info_en.properties 좋아하지 뭔가되어 있는지 확인합니다.

2

파일 시스템에서 속성을 읽으려고해서는 안됩니다. 대신 리소스 스트림에서로드 할 속성을 가져 오는 메서드를 변경하십시오. 의사 코드 :

private String getPropertyP(final String key) { 
    final Properties properties = new Properties(); 

    final InputStream inputStream = Thread.currentThread().getContextClassLoader() 
     .getResourceAsStream("properties/app-info.properties"); 
    properties.load(inputStream); 

    return properties.getProperty(key); 
} 
+0

이 솔루션은 너무 (그것을 테스트) 작동하지만 나는 깔끔 다른 하나를 선호 나에게 스레드 물건없이. – maxxyme