2010-06-25 2 views
1

Java에서 동적으로 일부 속성을 정의 할 수 있습니까? 지금은 속성 파일을 사용하고 있지만 설치 전에 이러한 속성을 변경해야하므로 jar (또는 설치) 파일 외부의 파일에 이러한 속성을 설정해야합니다.방법 : Java에서 동적으로 정의 된 속성

이러한 속성은 내 IBatis 연결을 정의합니다.

+1

문제를 명확히하십시오. 등록 정보 파일은 항아리 안에있을 필요가 없습니다. 왜 파일 시스템에 저장하지 않으시겠습니까? – erickson

답변

2

.properties를 계속 사용하고 파일을 리소스로로드하십시오.

클래스 경로에 있으면 찾을 수 있습니다.

내가 사용하기에 훨씬 쉬운 이유는 리소스 번들이 있기 때문입니다. Some.class.loadResource(...) 또는 내가 무엇을 할 기본적으로 동일한 않는의 ResourceBundle을 사용하는 것입니다 :

파일이 당신이 할 수있는 클래스 경로에있는 경우

편집이 가진 자원으로 중 하나를로드. 예를 들어

내가있는 경우 : 클래스 경로에있는 경우

import java.util.ResourceBundle; 

public class ResourceBundleTest { 
    public static void main(String [] args) { 
     ResourceBundle bundle = ResourceBundle.getBundle("connection"); 
     for(String key: bundle.keySet()){ 
      System.out.printf("bundle[%s]=%s%n",key, bundle.getString(key)); 
     } 
    } 
} 

내가 그 파일을로드 할 수 있습니다. 이 건물은 내 클래스 경로에 디렉토리를 추가하지 않고 "일부/중첩/DIR"

$ls -l some/nested/dir/ 
total 8 
-rw-r--r-- 1 oscarreyes staff 35 Jun 25 12:06 connection.properties 
$cat some/nested/dir/connection.properties 
name=Oscar 
lastName=Reyes 
age=0x1F 

내가 그것을 실행하는 경우에, 밖에 실 거예요 작업 :

$java ResourceBundleTest 
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name connection, locale es_ES 
    at java.ut...ceBundle.java:1427) 
    at java.ut...urceBundle.java:1250) 
    at java.ut...ceBundle.java:705) 
    at Resourc...st.java:6) 

하지만 난에 디렉토리를 추가하면 내 클래스 경로를 사용하면 파일을 쉽게 찾을 수 있습니다. 유사한 방식으로

$java -cp some/nested/dir/:. ResourceBundleTest 
bundle[lastName]=Reyes 
bundle[age]=0x1F 
bundle[name]=Oscar 
$ 

, 당신은 당신은 당신의 클래스 경로에 포함해야하는 .jar 파일을 가지고 있고, 당신이 원하는 목적지 파일을 당신의 .properties 파일을 넣을 수 있습니다.

import java.util.Properties; 

public class LoadProperties { 
    public static void main(String [] args) throws java.io.IOException { 
     Properties properties = new Properties(); 
     properties.load(LoadProperties.class.getResourceAsStream("connection.properties")); 
     properties.list(System.out); 
    } 
} 

을하지만 어떤 이유로 나는 자원 번들을 선호 :

등가 사용하여 속성이 될 것입니다.

+0

안녕하세요, 도움 주셔서 감사합니다.하지만 내 질문을 이해하지 못한다고 생각합니다. 나는 당신이 말한 것처럼하고 있습니다. 문제는 속성의 값이 변경되고이 값을 jar 파일 내부에서 설정할 수 없다는 것입니다. 그들은 쉽게 바꿀 필요가 있습니다. 그거 분명해? – Victor

+0

대부분 내가 말한 것을 이해하지 못했을 것입니다 : P 클래스 경로 (클래스 외부에있을 수 있음)에 있으면로드됩니다. – OscarRyz

+0

@Victor : 당신이 현상 "classpath"를 이해하지 못한다고 생각합니다. :) 기본적으로해야 할 일은 런타임 클래스 패스가 다루는 경로 중 하나에 파일을 저장하는 것입니다. 파일의 경로를 런타임 클래스 경로에 추가합니다. 이렇게하면 Java 코드가 classpath 자원으로 계속 액세스 할 수 있습니다. – BalusC

0

속성 파일이 정상적으로 클래스 경로에 포함하면 jar 파일 외부에 살 수 있습니다.

환경 설정 API를 사용하면 운영체제의 표준을 유지할 수 있지만 플랫폼에 따라 구성에 따라 위치가 다를 수 있으므로 배치가 복잡해질 수 있습니다 플랫폼 종속 설치가 필요합니다.

+0

iBatis가'Preferences'를 지원하지 않는다고 생각합니다. – BalusC

0

예, 특성 파일을 사용하는 것이 일반적입니다. 또한 일반적인 방법은 각 환경에 대해 별도의 속성 파일을 갖는 것이고, 빌드 프로세스는 대상에 따라 올바른 것을 선택합니다. 파일을 classpath에 보관하고 클래스 로더를 사용하면 파일을 찾을 수 있습니다.

1

파일을 런타임 클래스 경로에 포함되는 경로 중 하나에 넣거나 파일 경로를 (기본) 런타임 클래스 경로에 추가하기 만하면됩니다. 이렇게하면 Java 코드가 classpath 자원으로 계속 액세스 할 수 있습니다.

당신은 java -jar 명령을 사용하여 JAR 파일을 실행할 때 또는 파일을 doubleclicking함으로써 -cp 또는 -classpath 인수 심지어 %CLASSPATH% 환경 변수는 무시됩니다. JAR 파일의 기본 클래스 경로를 Class-Path 항목으로 META-INF/MANIFEST.MF 파일에 정의 할 수 있습니다.

예.

Class-Path: . 

도트 .는 JAR 파일이 현재 앉아있는 경로가 런타임 클래스 경로에 포함된다는 것을 의미한다. 따라서 JAR 파일과 동일한 폴더에 특성 파일을 넣으면 작동합니다. 폴더 /var/foo 런타임 클래스 경로에서 가져온 것입니다

Class-Path: /var/foo 

이 방법 :

또한 절대 디스크 파일 시스템 경로를 지정할 수 있습니다. 따라서 해당 폴더에 특성 파일을 넣으면 작동합니다.

관련 문제