2012-09-05 3 views
11

응용 프로그램의 구성 파일을 읽는 가장 좋은 방법은 무엇입니까? Tomcat 서버의 어떤 폴더가 "클래스 경로"에 있는지.tomcat에서 속성 읽기

내 설정 파일을 TOMCAT_HOME\conf에 두려고했지만 내 서블릿에서 읽을 수 없습니다.

this.getClass().getClassLoader().getResourceAsStream("/app.properties"); 

나는이 문제가되지 않습니다 생각 많은 특성 아마 10 ~ 15가 없습니다 :

이를 사용하여 시도 (app.properties의 conf에있는 파일이 있습니다). 나는 jboss를 사용할 때 이것이 많은 문제가되지 않았 음을 기억합니다.

내 앱에서는 context.xml에 DB 연결 스프링도 지정해 둡니다. 어떻게 든 내 속성을 지정할 수 있습니까? 아니면이 바람둥이와 어떻게 작동합니까?

내 전쟁/내전에서 분리 된 속성을 유지하고 싶습니다. 이 요청에 대한

업데이트

이유는 당신이 또한 바람둥이에 datasource를 구성 할 수 있습니다 알고 내 응용 프로그램은 지금까지

답변

18

은 여러 가지가 있지만 그것은 당신의 필요에 따라 달라집니다

당신이 클래스 로더 이후 (this.getClass().getClassLoader().getResourceAsStream(...)에로는 java.io.File 객체를 사용하여 액세스해야합니다 $TOMCAT_HOME/conf 디렉토리에서 속성 파일을로드하려면 그냥 할 수있다 (WEB-INF/classes, WEB-INF/lib 또는 $TOMCAT_HOME/lib 아래) 클래스 경로에서 파일 (및 클래스를)로드

가장 쉬운 예를 것 톰캣의 config 디렉토리에서 파일을로드 :.

File configDir = new File(System.getProperty("catalina.base"), "conf"); 
File configFile = new File(configDir, "myconfig.properties"); 
InputStream stream = new FileInputStream(configFile); 
Properties props = new Properties(); 
props.load(stream); 

이 방법을 사용하면 코드가 Tomcat에 종속된다는 것을 알 수 있습니다 (로드 메커니즘은 Tomcat의 시스템 속성이 사용 가능하다는 사실에 달려 있습니다). 이것은 전혀을 추천하지 않으므로 속성 파일을 클래스 경로의 폴더로 이동하면 시도한 방식으로로드 할 수 있어야하고 응용 프로그램을 모든 컨테이너에 배포 할 수 있어야합니다.

그리고 JNDI 리소스로 속성을 구성 할 수 있지만 액세스하기가 너무 번거롭습니다.

+0

이것은 응용 프로그램 속성이 있어야하는 위치가 아닙니다. –

+3

나는 그가 그에게 달려 있기를 원한다면 그에게 달려있다. 그에게 얻을 수있는 단서와 클래스 패스로 옮길 것을 권고했다. –

+0

이제 괜찮아. –

0

(어떤 위치에) 배치 될 위치를 모르겠어요 때문이다. DataSource in Tomcat

이 후 datasource을 응용 프로그램에서 사용할 수 있습니다.

+0

감사합니다. 나는 데이터 소스를 필요로하지 않는다. 나는 이미 그 부분을 구성했다. 추가 속성이 필요하다. –

+0

그럼 내가하는 일은 아무렇지 않다. 추출 된 파일의 tomcat 디렉토리 구조에 응용 프로그램이 배포되는 위치와 상관없이 app.properties가 deployable과 함께 적절하게 제공되면 문제가 발생하지 않습니다. –

1

파일을 웹 응용 프로그램의 WEB-INF/classes에 넣으십시오. 이것은 기본 클래스 경로 디렉토리입니다. conf (Tomcat 내부 용인 경우에만 해당).

0

비록 PITA 일 수도 있지만 배포 위치를 모르는 기능 일 수 있습니다. 당신은 그 사실에 너 자신을 "결합 할"수 없다!

나머지 Java 스택에 따라 가장 좋은 방법은 일반적으로 Tomcat과 관계가 없습니다.당신은 스프링을 사용하는 경우, 예를 들어 말할 수있다 : 자바 구성, 또 다른 예를 사용하여

new ClassPathResource("**/myFile.properties") 

또는 경우 :

@PropertySource("classpath:META-INF/MyWeb.properties") 

일반 자바에서 당신이 말할 수 :

InputStream stream = loader.getResourceAsStream(resourceName); 

곳 로더는 ClassLoader의 인스턴스입니다.

1

특정 구성 파일의 위치를 ​​나타내는 것이 아니라 se JNDI 바인딩 구성을 사용하여 응용 프로그램이 구성 데이터 및 Java EE 표준에만 의존하도록합니다. 당신은 당신의 재산 파일에 구성 항목의 중간 번호가있는 경우 다음 그들에게 Environment Entries을 고려하고 응용 프로그램에서 JNDI를 통해 그들에게 접근,

  1. : 나는 두 가지 옵션을 볼 수 있습니다.

  2. 또는 속성을 별도의 속성 파일에 유지하려는 경우 속성을 나타내는 bean, 속성 파일을 사용하여 bean을 초기화하는 팩토리를 만들고 JNDI에 연결하십시오. Resource Definition입니다.
    그런 다음 앱을 다시 시작하거나 다양한 구성 소스 또는 유사한 요구 사항간에 전환 할 필요없이 속성 파일을 정기적으로 다시 읽을 수도 있습니다. 이 구성 콩 (또는 옵션 1을 사용하는 경우 각 ENV. 항목에 대한 참조)를 참조 web.xml을의에

이 구성을 사용하여 웹 응용 프로그램의 각

Resource Reference을 포함해야합니다.

0

아파치 - 톰캣-7.0.78 \ conf 폴더에서 .properties 파일을 추가합니다 응답에 대한

File configDir = new File(System.getProperty("catalina.base"), "conf"); 
File configFile = new File(configDir, "dashboardiframes.properties"); 
InputStream stream = new FileInputStream(configFile);Properties properties = new Properties(); 
properties.load(stream);