2009-06-03 5 views
1

현재 EclipseStarter 클래스의 기능을 사용하여 일부 번들을 실행하려고합니다. Eclipse에서 직접 프로그램을 실행하면 OSGi 서비스 번들이로드되고 다른 번들을 설치하고 시작할 수 있습니다.EclipseStarter 클래스에서 OSGi 환경을 사용할 수 있도록 OSGi 환경을 구성하는 방법은 무엇입니까?

Java 프로그램을 실행 가능한 jar 파일로 내보내고 명령 줄에서 실행하면 환경에서 OSGi 서비스 번들 대신 "시스템 번들 [0]"이라는 번들을로드합니다. 새 번들을 설치하려고 할 때마다 Nullpointer-Exception이 발생합니다.

jar 파일에서 OSGi 환경을 사용하려면 프레임 워크 속성 내에 몇 가지 특수 구성을 설정해야합니까?

frameworkProperties.put("osgi.clean", "true"); 
frameworkProperties.put("osgi.console", "true"); 

업데이트 : 현재 나는 단지 다음과 같은 두 가지 값을 설정하고있어

나는 내 문제는 사용되는 자바 클래스 패스 함께 할 수있는 뭔가가있을 것 같아요.

osgi> ss 

Framework is launched. 

id  State  Bundle 
0  ACTIVE  org.eclipse.osgi_3.4.3.R34x_v20081215-1030 

을하지만 난 단지 jar 파일을 실행하면 나는 다음과 같은 오류 로그를 받고 있어요 : :이

java -classpath /home/markus/org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar:test.jar 
Starter.Starter 

모두 같은 클래스 패스에 프레임 워크 - 번들을 추가 할 경우 잘 작동

[email protected]:~/configuration$ cat 1244201504478.log 
!SESSION 2009-06-05 13:31:44.895 ----------------------------------------------- 
eclipse.buildId=unknown 
java.version=1.6.0_13 
java.vendor=Sun Microsystems Inc. 
BootLoader constants: OS=linux, ARCH=x86, WS=gtk, NL=de_DE 
Command-line arguments: -clean -console 

!ENTRY org.eclipse.osgi 4 0 2009-06-05 13:31:44.897 
!MESSAGE An unexpected runtime error has occurred. 
!STACK 0 
java.lang.NullPointerException 
     at org.eclipse.osgi.internal.baseadaptor.BaseStorage.readStateData(BaseStorage.java:743) 
     at org.eclipse.osgi.internal.baseadaptor.BaseStorage.getStateManager(BaseStorage.java:698) 
     at org.eclipse.osgi.baseadaptor.BaseAdaptor.getState(BaseAdaptor.java:390) 
     at org.eclipse.core.runtime.adaptor.EclipseStarter$1.bundleChanged(EclipseStarter.java:307) 
     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:1234) 
     at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:211) 
     at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:141) 
     at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1518) 
     at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1469) 
     at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:281) 
     at org.eclipse.osgi.framework.internal.core.StartLevelManager.launch(StartLevelManager.java:247) 
     at org.eclipse.osgi.framework.internal.core.SystemBundle.resume(SystemBundle.java:201) 
     at org.eclipse.osgi.framework.internal.core.Framework.launch(Framework.java:644) 
     at org.eclipse.osgi.framework.internal.core.OSGi.launch(OSGi.java:51) 
     at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:313) 
     at CanEmulator.OSGiFramework.run(OSGiFramework.java:119) 
     at java.lang.Thread.run(Thread.java:619) 

!ENTRY System Bundle 4 0 2009-06-05 13:31:44.898 
!MESSAGE 
!STACK 0 
java.lang.NullPointerException 
     at org.eclipse.osgi.internal.baseadaptor.BaseStorage.readStateData(BaseStorage.java:743) 
     at org.eclipse.osgi.internal.baseadaptor.BaseStorage.getStateManager(BaseStorage.java:698) 
     at org.eclipse.osgi.baseadaptor.BaseAdaptor.getState(BaseAdaptor.java:390) 
     at org.eclipse.core.runtime.adaptor.EclipseStarter$1.bundleChanged(EclipseStarter.java:307) 
     at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:1234) 
     at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:211) 
     at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:141) 
     at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1518) 
     at org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1469) 
     at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:281) 
     at org.eclipse.osgi.framework.internal.core.StartLevelManager.launch(StartLevelManager.java:247) 
     at org.eclipse.osgi.framework.internal.core.SystemBundle.resume(SystemBundle.java:201) 
     at org.eclipse.osgi.framework.internal.core.Framework.launch(Framework.java:644) 
     at org.eclipse.osgi.framework.internal.core.OSGi.launch(OSGi.java:51) 
     at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:313) 
     at CanEmulator.OSGiFramework.run(OSGiFramework.java:119) 
     at java.lang.Thread.run(Thread.java:619) 

현재 Eclipse 프로젝트에서 외부 라이브러리로 framework-jar-file을 사용하고 있습니다. 난 ... 실행 파일에 내 프로젝트를 내보낼 때 일도 잘못 것을

BR,

마르쿠스 생각

+1

응용 프로그램에 OSGi 프레임 워크가 포함되어 있습니까? 또는 다른 프레임 워크 인스턴스 내부에서 실행되도록 설계된 번들입니까? 어떤 OSGi 프레임 워크를 사용하고 있습니까? – Cogsy

+0

저는 최신 Equinox OSGi 프레임 워크 인 org.eclipse.osgi_3.4를 사용하고 있습니다.3.R34x_v20081215-1030.jar – Markus

답변

3

나는 또한 다음과 같은 속성

osgi.noShutdown=true 

osgi.configuration.area= (path) 
osgi.baseConfiguration.area= (path) 
osgi.sharedConfiguration.area= (path) 
osgi.instance.area= (path) 
osgi.user.area= (path) 

에게 첫 번째를 추가 Equinox에게 멈추지 말라고 말합니다. 이 기능은 Eclipse 애플리케이션을 작성하지 않을 경우 필요합니다. 다른 파일은 다양한 파일이 있어야하는 경로입니다. 콘솔을 사용하고 싶다면

osgi.console= 

값이 필요하지 않습니다. 전화 번호를 입력하면 콘솔을 볼 수있는 텔넷 포트가됩니다.

이제 번들의 경우 시스템 번들이 항상 표시됩니다. 그것은 OSGi 자체입니다. 추가 번들을 추가하려면 해당 번들을 설치해야합니다. 다음을 사용하여 콘솔을 통해 그것들을 설치하거나 설정을 통해 할 수 있습니다 당신은 프로그래밍 방식이 EclipseStarter에서 얻을 수있는 시스템 번들 인스턴스를 사용하여 번들을 설치할 수 있습니다

osgi.bundles= (comman delim list of bundle paths) 

.

이들이 작동하지 않으면 스택 추적 또는 osgi 로그 파일을 업로드하십시오 (작업 디렉토리 또는 "osgi.configuration.area"에서 osgi 로그 파일을 찾을 수 있습니다). 이름이 순전히 숫자 인 파일입니다.

+1

안녕하세요! 이러한 매개 변수를 추가 한 후 프레임 워크가 전혀 시작되지 않습니다. jar 파일에서 지금 실행하면 java.lang.NullPointerException이 발생합니다. 따라서 osgi 로그 파일은 없습니다. – Markus