2013-08-05 2 views
3

내 응용 프로그램의 OSGi 번들에 포함 된 등록 정보 파일은 ontologymapping.properties입니다. 이제이 속성 파일의 내용을 읽고 싶습니다.OSGi 번들에서 등록 정보 파일을 사용하는 방법

public void startObservationAdapter(BundleContext context) { 
    String filename = context.getProperty("ontologymapping.properties"); 
    try { 
     File file = new File(filename); 
     InputStream in = new FileInputStream(file); 
     ontologymapping.load(in); 
     in.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

ontologymapping이 속성 인스턴스 : 몇 가지 예제 코드에서 나는 번들의 시작 방법이 뭔가를 발견했다. 이 코드를 실행하면 JVM에서 파일을 찾을 수 없습니다. 그 이유는 파일이 BundleContext에 포함되어 있지 않기 때문입니다. 어떻게하면됩니까? 또는 속성 파일의 내용을 읽는 다른 방법은 무엇입니까? 번들은 선언적이 아니며 선언적 인 다른 번들의 API 번들입니다.

+2

context.getProperty는 사용자가 생각하는대로 수행하지 않습니다. 또한 : 어떤 번들은 "ontologymapping.properties"파일이고 어떤 번들은이 코드를 가지고 있습니까? 그런데 왜 http://www.osgi.org/javadoc/r4v42/org/osgi/service/cm/ConfigurationAdmin.html? –

답변

2

해결했습니다. ontologymapper.properties가 추상 클래스가 정의 된 번들에 위치한다는 것이 문제였습니다. 그 추상 클래스에서 확장 클래스의 start 메소드가 구현되었고 그 start 메소드에서 context.getBundle()을 호출했습니다. 이것은 추상 클래스를 가진 번들이 아니라 구현 클래스의 번들을 리턴하는 것으로 보인다. 그래서 클래스를 구현하는 번들에 특성 파일을 배치하면 문제가 해결되었습니다.

2

bundle.getResource ('mypropfile.properties')를 사용하여 등록 정보 파일의 URL을 얻을 수 있습니다. 여기서 bundle은 등록 정보 파일을 포함합니다. URL을 기반으로 파일의 inputStream (resourceURL.openStream)을 얻을 수 있습니다. inputstream을 properties.load 함수에 전달할 수 있습니다.

OSGi 특정 코드를 사용하고 싶지 않거나 클래스 로더로 재생할 수있는 속성 파일이 포함 된 번들의 번들 객체를 가져올 수없는 경우. MyClass가 속성 파일과 동일한 번들에 있다고 상상해보십시오. 이 경우 다음 코드 스 니펫도 작동합니다.

Properties myProps = new Properties(); 
InputStream is = null; 
try { 
    is = MyClass.class.getResourceAsStream("ontologymapping.properties"); 
    myProps.load(is); 
} finally { 
    is.close(); 
} 
+0

고마워, 나는 그것을하는 OSGi 방식을 선호한다. 지금 실행할 때 여전히 속성 파일을 찾지 못합니다. 나는 여전히 NullPointerException을 얻는다. 특성 파일은이 코드가 작성된 번들 자체에 있습니다. 파일을 어딘가에 자원으로 등록해야합니까? – PieterDB

+1

아니요. bundle.getResource를 사용하여 번들의 모든 파일에 액세스 할 수 있습니다. 귀하의 코드에서 context.getBundle()을 호출하면 getResource ("ontologymapping.properties")는 속성 파일을 가리키는 URL을 돌려 주어야하며 해당 URL로 InputStream을 열 수 있어야합니다. 파일이 있고 컨텍스트가 번들을 가리키고 있다고 확신하는 경우 "/ontologymapping.properties"와 같은 슬래시로 리소스 경로를 시작해야합니다. 번들이 설치된 상태에 불과하지만 문제가 있다고 생각하지는 않습니다. –

+0

메소드 호출'context.getBundle(). getResource ("ontologymapping.properties")'는'null'을 반환하고 파일이 디렉토리에 있고, "/"를 사용하려했지만 둘 다 작동하지 않았다. 'context.getBundle()'이 내 번들을 반환하는지 확인하시오. – PieterDB

4

나는 몇 개의 선이 교차했다고 생각합니다. context.getProperty (..)는 System.getProperty (...)와 비슷하며 실제로 컨텍스트에서 System.getProperties()의 대부분을 찾습니다. 따라서 귀하의 경우 코드가이를 수행하는 것처럼 보일 때 VM -D 명령 행 옵션 -Dontologymapping.properties = "myfile.properties"를 사용하여 시스템 특성에 파일 이름을 넣을 수 있습니다. 이렇게하면 코드가 작동합니다.

그러나이 코드 유형의 문제는 이제 파일 시스템에서 파일을 읽어야하는 번들이 있다는 것입니다. 구별하는 세 가지 경우가 있습니다

  1. ontologymapping.properties는
  2. ontologymapping.properties 사용자 특정 작다는 사용자가 특정 대형 (즉, 속성은 당신을 위해 코드 싼 GUI입니다)
  3. ontologymapping.properties입니다 프로그래머가 데이터를 저장하는 편리한 방법 일뿐입니다.

경우 1의 경우 구성 유형을 메타 유형으로 볼 수 있습니다. 이를 통해 멋진 구성 GUI로 앱을 만들 수 있습니다. bnd DS 어노테이션을 사용하면 Apache Felix Webconsole에서 코드가 너무 작아서 정말 멋진 GUI를 얻을 수 있습니다.

경우 2의 경우 위 코드가 유효합니다. 당신은 고고 쉘을 추가하고 명령을 만들어 사람들이 그것을 읽고 업데이트 할 수 있다고 생각할 수 있습니다.

마지막 사례 인 # 3에서는 해당 속성을 번들 내에 저장하고 Myclass.class.getResourceAsStream ("/ ontology.properties")을 사용하여 읽어야합니다. bnd (도구)에서는 Include-Resource: ontolology.properties으로 번들에 표시되어 읽을 준비가됩니다.

+0

입니다. 제 3의 경우는 제가 필요한 것입니다. 그러나, 나는 당신이 bnd (tools)와 무슨 뜻인지 이해하지 못합니까? MANIFEST.MF에'Include-Resource : ontologymapping.properties'를 넣어야한다는 것을 의미합니까? – PieterDB

+0

bnd (tools) : bnd는 'bnd'파일에서 매니페스트를 만드는 라이브러리입니다. 이것은 Apache Felix Maven 번들 플러그인과 bndtools라는 Eclipse IDE에서 사용됩니다. http://bndtools.org/ 번들을 만드는 가장 좋은 방법입니다. bnd를 사용하지 않으려면 ontologymapping.properties 파일이 자원에 있는지 확인해야합니다. maven 또는 jar 명령을 통해. –

관련 문제