2012-07-03 2 views
0

이 항아리에서 .class 파일을 검색 할 수있는 모든 jar 경로를 가져오고 싶습니다. App 메인 폴더 아래에서 모든 jar 파일을 검색하는 기능을 작성했지만 문제가 발생했습니다. 일부 jar 번들은 존재하지만 OSGi에서 사용하지 않고 이전 버전입니다. xxxx_1.0.0.jar과 xxxx_1.2.0.jar는 모두 존재하지만 OSGi는 1.2.0 만 사용합니다. 메인 폴더에서 검색하면 결과 목록에 표시됩니다.OSGi에서 사용하는 모든 jar 경로를 얻는 방법은 무엇입니까?

그래서 OSGi에서 사용하는 모든 jar 파일을 가져 오는 방법이 있습니까? 그런 다음 사용하지 않은 jar 파일을 필터링 할 수 있습니다. 감사

추가됨 : 나는 모든 번들 절대 URL을 얻기 위해이 방법을 사용하려고했으나 실패 : 출력이 반복 다음의

StringBuffer sb = new StringBuffer(); 
Bundle[] bundles = com.ibm.director.services.storage.debugtool.Activator.context.getBundles(); 
for (Bundle bundle : bundles) { 
    java.net.URL url = bundle.getClass().getProtectionDomain().getCodeSource().getLocation(); 
    sb.append("File:" + url.getFile() + ", Path:" + url.getPath() + "\n"); 
} 

그러나 백 번 :

File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar 
File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar, 
File:.... 

사용 된 번들 수 : 588, 올바른 것일 수 있으며 API에서 절대 번들 경로를 가져올 수 있지만 모두 동일한 이유는 무엇입니까? 어떻게하면 실제 경로를 얻을 수 있습니까?

+0

달성하고자하는 것을 설명해 주시겠습니까? 클래스 파일에서 무엇을 검색하고 싶습니까? 그 이유는 무엇입니까? –

+0

@Christian Schneider classname이 사용자가 입력 한 런타임 .class를 디 컴파일하려고합니다. 구현 방법은 OSGi 환경에서 모든 항아리를 모으고이 클래스를 검색하는 것입니다. 실제로 xxx_1.2.0과 xxx_1.0.0 모두이 파일을 포함하지만 xxx_1.2.0 만 사용됩니다. 나는 단지 사용 된 것을 디 컴파일하려고한다. – JerryCai

+0

언젠가 전에 비슷한 질문을 한 것을 기억합니다. OSGi에서 동일한 클래스 이름이 다른 번들에서 나올 수 있으므로 다른 버전을 동시에 사용할 수 있습니다. 따라서 클래스의 소스를 알고 싶으면 클래스를 보는 번들/클래스 로더를 지정해야합니다. 거기에서 클래스가로드 된 항아리 패키지 배선에서 찾을 수 있습니다. –

답변

3

BundleContext#getBundles()은 모든 번들을 제공합니다. 그런 다음 기호 이름과 버전을 비교할 수 있습니다. 그러나 xxxx_1.0.0.jar와 xxxx_1.2.0.jar가 모두있어 xxx_1.0.0.jar이 사용되지 않았다는 것을 의미하지는 않습니다. xxx_1.0.0.jar이 필요한 다른 번들이있을 수 있습니다. 마찬가지로 번들이 시작되지 않았다고해서 나중에 시작되지는 않는다는 것을 의미하지는 않습니다. 아니요은 OSGi 해결 프로그램을 다시 구현하려고합니다. 저장소를 정리하려면 p2에서 GC 응용 프로그램과 같은 저장소 공급 업체가 제공 한 응용 프로그램을 사용하는 것이 좋습니다.

+0

동의 함. 나는 당신이 해결하려고하는 문제가 이미 해결되었거나 잘못된 문제라고 생각합니다. –

+0

@Philippe Marschall, 내 추가 정보와 질문을 확인해 주시겠습니까? 고맙습니다. – JerryCai

+0

당신이 Equinox를 사용하고있는 것을 보았습니다.이 경우에는 [p2 가비지 컬렉터 응용 프로그램] (http://wiki.eclipse.org/Equinox/p2/FAQ) –

2

생각해 번들 ... 단지 bundle.getResource 할 (. clazz.getName()을 (대신, '/') + '.' "클래스를.")

당신이 다시 컴파일하기 전에 번들을 보면 : "OSGI-OPT/src /"+ clazz.getName(). replace ('.', '/') + ". java", 실제 소스 코드가있을 수 있습니다.

+0

을 권장합니다. 모든 병을 검색하는 것보다 더 신뢰할 수있을뿐만 아니라 여러 버전으로 존재할 수있는 클래스의 경우 훨씬 더 효율적입니다. –

관련 문제