전: Osgi 실전 중 질문

10371 단어 osgi
osgi에 대해 초보적인 이해를 한 후에 코드를 써서 도망갈 준비를 하고 한번 해보려고 합니다. 먼저 BluedavyOSGI 실전를 다운로드했습니다. 안에 직접 실행할 수 있는 코드가 있고 run을 두 번 클릭했습니다.bat 운행 정상, 어둡고 상쾌!'OSGI 실전'에서 사용자 로그인 검증 모듈을 연습하기 시작했는데 한 줄 한 줄 코드를 두드렸다. 첫 번째 변화는 프로젝트 간 상호 인용이 Build path에 프로젝트 인용을 추가할 수 없다는 것이다. 이것은MANIFEST로 바뀌었다.MF에 Import-Package를 추가하는 것은 학습 과정에서 많은 문제에 부딪혔습니다. 기록하여 저와 같은 문제에 부딪히면 시행착오를 줄일 수 있습니다.저는 eclipse를 씁니다.4 jdk1.6 
1. Import-Package 시 org.eclipse.equinox.servlet.api 이 가방은 죽어라 찾을 수 없습니다.eclipse3.4 이미 존재하지 않습니다.javax를 직접 가져옵니다.servlet_2.4.0.v200806031604.jar이면 돼요. javax가 추가되지 않았다면.서브렛에 INSTALLED UserValidatorWebBundle1.0.0 강제 시동은 다음과 같은 이상 org를 던집니다.osgi.framework.BundleException: The bundle could not be resolved. Reason: Missing Constraint: Require-Bundle: javax.servlet; bundle-version="2.4.0"
2. Equinox OSGI Declarative 서비스를 사용하려면 다운로드eclipse-equinox-SDK-3.4.2.zip가 필요합니다. Declarative 서비스가 Eclipse의 기본 패키지에 포함되지 않았기 때문에 Eclipse의 사이트에서 다운로드를 받아야 합니다. 다운로드 패키지의plugins와features를 eclipse에 복사해서 org를 다시 시작해야 합니다.eclipse.equinox.ds_1.0.0.v20080427-0830.jar는 실행할 때 사용하는 bundleorg입니다.eclipse.equinox.ds가 org를 사용했습니다.eclipse.equinox.util_1.0.0.v20080414.jar는 모두 config에 있어야 합니다.ini에 추가 및 시작
3. 모든 것이 정상적으로 작동하는 것 같은데log에는 다음과 같은 이상java가 있습니다.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).org를 시작해야 합니다.eclipse.osgi.util_3.1.300.v20080303.jar 이 bundle
4. http://localhost/demo/page/login.htm 이 페이지에 접근할 수 없으면 org.eclipse.equinox.http_1.0.200.v20080421-2006.jar가 시작되지 않았습니다. htm가 접근할 수 있는지 http://localhost/demo/login 접근할 수 없습니다.eclipse.equinox.http.servlet_1.0.100.v20080427-0830.jar이 시작되지 않았습니다
사용자 로그인 인증 모듈에서 시작할 Bundleid State Bundle0 ACTIVE org를 요약합니다.eclipse.osgi_3.4.2.R34x_v20080826-12301 ACTIVE      ConfigFileValidatorBundle_1.0.02 ACTIVE      DBValidatorBundle_1.0.04 ACTIVE      UserValidatorBundle_1.0.05 ACTIVE      LDAPValidatorBundle_1.0.09 ACTIVE      UserValidatorWebBundle_1.0.010 ACTIVE      org.eclipse.equinox.util_1.0.0.v2008041411 ACTIVE      org.eclipse.equinox.ds_1.0.0.v20080427-083012 ACTIVE      javax.servlet_2.4.0.v20080603160413 ACTIVE      org.eclipse.osgi.services_3.1.200.v2007120314 ACTIVE      org.eclipse.equinox.http.servlet_1.0.100.v20080427-083015 ACTIVE      org.eclipse.equinox.http_1.0.200.v20080421-200617 ACTIVE      org.eclipse.osgi.util_3.1.300.v20080303
Bundle이 부족하면 직접 인터넷에서 내려오시면 됩니다. 그리고 Plug-ins and Fragments를 가져오는 방식으로 Bundle를 가져오면 인용할 수 있습니다. 그래서 깊은 것으로 생각하지 말고 실행할 때 "Add Required Bundles"를 사용하세요. 이것은 저희가 사용할 Bundles를 가입하는 데 큰 도움이 됩니다.
첫 번째 예(원본의classic)에서 코드 등록 방식으로 서비스를 등록한다. 즉, 서비스 인터페이스를 실현하는 모든 bundle의Activator에서 자신의 서비스를 지정한 서비스 이름으로 등록한다. 예를 들어
Java 코드
  • package org.riawork.demo.user.validator;  
  • /* 
  •  * RIAWork.org 
  •  *  
  •  * OSGI Opendoc Demo 
  •  */  
  • import org.osgi.framework.BundleActivator;  
  • import org.osgi.framework.BundleContext;  
  • import org.osgi.framework.ServiceRegistration;  
  • import org.riawork.demo.service.user.Validator;  
  • import org.riawork.demo.service.user.impl.ConfigFileValidatorImpl;  
  • /** 
  • * desc: ConfigFile Bundle Activator, 기존 방식으로 서비스 등록 완료
  •  * 
  •  * @author jerry 
  •  */  
  • public class Activator implements BundleActivator {  
  •   
  •     // --------------------------------------------Instance Variables  
  •       
  •     private ServiceRegistration serviceReg=null;  
  •       
  •     // --------------------------------------------Public Method  
  •       
  •     /* (non-Javadoc) 
  •      * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) 
  •      */  
  • //Validator를 실현하는 Bunble은Activator에서 자신의 새로운 실현을Validator에 등록합니다.class.getName () 이름으로 Validator.class.getName () 이라는 이름의 서비스가 여러 개 있습니다
  •     public void start(BundleContext context) throws Exception {  
  •         serviceReg=context.registerService(Validator.class.getName(), new ConfigFileValidatorImpl(), null);  
  •     }  
  •   
  •     /* (non-Javadoc) 
  •      * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) 
  •      */  
  •     public void stop(BundleContext context) throws Exception {  
  •         if(serviceReg!=null)  
  •             serviceReg.unregister();  
  •     }  
  •   
  • }  
  • package org.riawork.demo.user.validator;
    
    /*
    
     * RIAWork.org
    
     * 
    
     * OSGI Opendoc Demo
    
     */
    
    import org.osgi.framework.BundleActivator;
    
    import org.osgi.framework.BundleContext;
    
    import org.osgi.framework.ServiceRegistration;
    
    import org.riawork.demo.service.user.Validator;
    
    import org.riawork.demo.service.user.impl.ConfigFileValidatorImpl;
    
    /**
    
     * desc: ConfigFileBundle Activator,              
    
     *
    
     * @author jerry
    
     */
    
    public class Activator implements BundleActivator {
    
    
    
    	// --------------------------------------------Instance Variables
    
    	
    
    	private ServiceRegistration serviceReg=null;
    
    	
    
    	// --------------------------------------------Public Method
    
    	
    
    	/* (non-Javadoc)
    
    	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
    
    	 */
    
    	//  Validator Bunble   Activator            Validator.class.getName()  ,  Validator.class.getName()          
    
    	public void start(BundleContext context) throws Exception {
    
    		serviceReg=context.registerService(Validator.class.getName(), new ConfigFileValidatorImpl(), null);
    
    	}
    
    
    
    	/* (non-Javadoc)
    
    	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
    
    	 */
    
    	public void stop(BundleContext context) throws Exception {
    
    		if(serviceReg!=null)
    
    			serviceReg.unregister();
    
    	}
    
    
    
    }

    두 번째 예(원본의 ds)는 프로필에 설명된 방식으로 bundle의 서비스를 발표한다. 즉,ConfigFileValidatorBundle,DBValidatorBundle,LDAPValidatorBundle 이 세 가지 UserValidatorBundle 인터페이스를 실현하는 bundle에는Activator가 그들의 실현 서비스를 등록하지 않고 MANIFEST에 등록한다.MF 프로필에 Service-Component 가입: OSGI-INF/component.프로젝트 디렉터리에 성명된 OSGI-INF/component를 발표합니다.xml 프로필 서비스입니다.
    포장할 때 문서에 따라 하면 안 돼요. 포장할 때 org.eclipse.osgi의jar 패키지와run.bat는 하나의 디렉터리에 configuration 디렉터리 (config.ini 파일 저장) 와 bundles 디렉터리 (자신이 포장한 bundle와 그들이 실행하는 의존적인 bundle 저장) 를 재구성하고, 문서의 config를 복사하는 것을 주의해야 한다.config에 대한 ini 내용.ini 파일은 실행할 수 없습니다. 중국어 문자가 있을 수 있습니다.
    내가 이곳에서 운행할 수 있는 것은 다음과 같다.
    Xml 코드
  • osgi.noShutdown=true  
  • # 현재 시스템에서 실행 중인 Bundle은 다음
  • 에 Bundle의 시작 순서를 지정할 수 있습니다.
  • # StartLevel Service 섹션에서 자세히 설명
  • #Unable to acquire application Services는 피하십시오. Ensure that the org.eclipse.core.runtime 오류
  • eclipse.ignoreApp=true  
  •   
  • #osgi.bundles=reference\:file\:bundles/ConfigFileValidatorBundle_1.0.0.jar@start,reference\:file\:bundles/DBValidatorBundle_1.0.0.jar@start,reference\:file\:bundles/LDAPValidatorBundle_1.0.0.jar@start,reference\:file\:bundles/org.eclipse.equinox.http_1.0.301.R35x_v20090728.jar@start,reference\:file\:bundles/javax.servlet_2.5.0.v200806031605.jar@start,reference\:file\:bundles/org.eclipse.osgi.services_3.2.0.v20090520-1800.jar@start,reference\:file\:bundles/UserValidatorBundle_1.0.0.jar@start, reference\:file\:bundles/UserValidatorWebBundle_1.0.0.jar@start  
  • osgi.bundles=plugins/ConfigFileValidatorBundle_1.0.0.jar@start,\  
  •           plugins/DBValidatorBundle_1.0.0.jar@start,\  
  •         plugins/LDAPValidatorBundle_1.0.0.jar@start,\  
  •         plugins/org.eclipse.equinox.http_1.0.301.R35x_v20090728.jar@start,\  
  •         plugins/javax.servlet_2.5.0.v200806031605.jar@start,\  
  •         plugins/org.eclipse.osgi.services_3.2.0.v20090520-1800.jar@start,\  
  •         plugins/UserValidatorBundle_1.0.0.jar@start,\  
  •         plugins/UserValidatorWebBundle_1.0.0.jar@start,\  
  •         plugins/org.eclipse.equinox.ds_1.1.1.R35x_v20090806.jar@start,\  
  •         plugins/org.eclipse.equinox.util_1.0.100.v20090520-1800.jar@start  
  •   
  •   
  • osgi.bundles.defaultStartLevel=4  
  • osgi.noShutdown=true
    
    #          Bundle,       Bundle      ,    
    
    # StartLevel Service         
    
    #  Unable to acquire application service. Ensure that the org.eclipse.core.runtime  
    
    eclipse.ignoreApp=true
    
    
    
    #osgi.bundles=reference\:file\:bundles/ConfigFileValidatorBundle_1.0.0.jar@start,reference\:file\:bundles/DBValidatorBundle_1.0.0.jar@start,reference\:file\:bundles/LDAPValidatorBundle_1.0.0.jar@start,reference\:file\:bundles/org.eclipse.equinox.http_1.0.301.R35x_v20090728.jar@start,reference\:file\:bundles/javax.servlet_2.5.0.v200806031605.jar@start,reference\:file\:bundles/org.eclipse.osgi.services_3.2.0.v20090520-1800.jar@start,reference\:file\:bundles/UserValidatorBundle_1.0.0.jar@start, reference\:file\:bundles/UserValidatorWebBundle_1.0.0.jar@start
    
    osgi.bundles=plugins/ConfigFileValidatorBundle_1.0.0.jar@start,\
    
    	      plugins/DBValidatorBundle_1.0.0.jar@start,\
    
    		plugins/LDAPValidatorBundle_1.0.0.jar@start,\
    
    		plugins/org.eclipse.equinox.http_1.0.301.R35x_v20090728.jar@start,\
    
    		plugins/javax.servlet_2.5.0.v200806031605.jar@start,\
    
    		plugins/org.eclipse.osgi.services_3.2.0.v20090520-1800.jar@start,\
    
    		plugins/UserValidatorBundle_1.0.0.jar@start,\
    
    		plugins/UserValidatorWebBundle_1.0.0.jar@start,\
    
    		plugins/org.eclipse.equinox.ds_1.1.1.R35x_v20090806.jar@start,\
    
    		plugins/org.eclipse.equinox.util_1.0.100.v20090520-1800.jar@start
    
    
    
    
    
    osgi.bundles.defaultStartLevel=4

    여기에 ds의 bundle를 넣는 것을 잊지 마십시오. 그렇지 않으면 서비스-Component: OSGI-INF/component를 사용하십시오.xml 설정은 작동하지 않습니다. 서비스를 발표할 수 없습니다. ds의bundle로 스캔하여 해당하는 서비스를 발견하고 관리에 추가했기 때문입니다.

    좋은 웹페이지 즐겨찾기