번들간의 의존관계
 
 
Part 3 : 번들갂의 의존관계 EclipseZone  Getting Started with OSGi 문서를 베이스로 진행 했다.
 
 
OSGI는 번들들의 집합으로 동작한다. 번들은 곧 모듈인데..
거대한 프로그램을 구성하다보면 모듈은 다른 모듈에 의존하게 될 수 밖에 없다.
 
그럼 어떤 모듈이 실행 될 때 무슨 무슨 모듈이 필요 하고.. 없으면 실행이 안되게 하는 방법은 무었일까..
 
만약 그냥 실행이 된다면, 동작 도중 ClassNotFoundException 메시지를 뿜고 프로그램이 뻗어 버릴 것이다.
 
 
OSGI는 이에 대한 해결책을 제시한다.
 
 
movie 번들을 하나 생성하자.
src Movie.java 파일에 다음과 같이 입력하자.
 
 
package movie;
 
public class Movie {
private final String title;
private final String director;
 
public Movie(String title, String director) {
this.title = title;
this.director = director;
}
 
public String getTitle() {
return title;
}
 
public String getDirector() {
return director;
}
}
 
 
MANIFEST.MF는 다음과 같이 작성 한다..
 
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Movie Interface
Bundle-SymbolicName: MoviesInterface
Bundle-Version: 1.0.0.qualifier
Export-Package: movie;version="1.0.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 
 
여기서 중요한 부분은 Export-Package인데..
movie는 패키지 이름이고, version은 임의로 지정하면 된다.
 
그리고 Export-Package 부분을 선언 해야만. 다른 번들에서 import할 수 있다.
 

다음은 BasicMovieFinderImpl 번들 하나를 생성 하자.
 
 
src 밑에 BasicMovieFinderImpl.java에 다음과 같이 입력하자.
 
 
import movie.*;
 
public class BasicMovieFinderImpl implements MovieFinder {
 
private static final Movie[] MOVIES = new Movie[] {
new Movie("The Godfather", "Francis Ford Coppola"),
new Movie("Spirited Away", "Hayao Miyazaki")
};

public Movie[] findAll() { return MOVIES; }

}
 
 
 
MANIFEST.MF에는 다음과 같이 입력하자.
 
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: BasicMovieFinderImpl
Bundle-SymbolicName: BasicMovieFinderImpl
Bundle-Version: 1.0.0.qualifier
Import-Package: movie;version="1.0.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 
 
여기서 중요한 것은 Import-Package: movie;version="1.0.0" 이것이다.
 
만약 Import-Package: movie;version="1.0.0"를 입력 하지 않으면
 
위에 소스에서 import movie.* 이부분이 에러가 난다.
 
패키지 이름 그리고 버전을 입력하면 된다.
 
 
그리고 프로젝트에 커서를 올리고 마우스 오른쪽클릭해고 Run configurations를 실행한다.

그리고 Moviesinterface의 체크 박스를 해제한다.
 
 

 
 
이것은 전체 프로젝트 실행시 MoviesInterface 번들은 실행 안 하겠다는 것이다.
 
그리고 Run을 누른다.
 
 

 
그러면 위와 같은 팝업창이 하나 뜨는데..
 
나는 OSGI 환경을 구성하면서 이 장면을 수십번 봤다..
도대체 무슨 의미 인지 알지 못했는데.. 드디어 의문이 해소 됐다..
 BasicMoviesFinderlmpl movie 패키지와 의존 관계인데.. 그놈이 없다는 것이다.
movie는 아까 해제한 MoviesInterface 이놈이다..
아무튼 그냥 continue 해보자
 
실행후 콘솔창에 ss를 입력하면
 
259 ACTIVE org.w3c.dom.smil_1.0.1.v200903091627
260 ACTIVE org.w3c.dom.svg_1.1.0.v201011041433
270 INSTALLED BasicMovieFinderImpl_1.0.0.qualifier
 
와 같은 것을 볼수 있는데..
 
BasicMovieFinderImpl_1.0.0.qualifier 이놈이 install은 되었는데..
RESOLVED상태는 아니다.. RESOLVED 상태가 되어야만 start를 할수 있다.
 
이런 의존관계가 문제가 있으면 다시 잘 풀어봐 라는 명령어가
refresh인데.. refresh [번들아이디] 입력 하면 된다..
 
refresh 270 해보자.
그리고 ss해보자
 
그래도 INSTALLED상태이다.
 
문제가 뭔지 알아보기위해
diag 270 입력 해보자
 
 
BasicMovieFinderImpl [270]
Unresolved requirement: Import-Package: movie; version="1.0.0“
라고 뜬다.
 
이건 아까 팝업창에 뜨던 메시지다.
아무튼 아는게 힘이라고.. 이제 이 에러는 쉽게 잡을수 있다.
 
자 이제 MoviesInterface install 해보자
 
install file:///C:/OpenHABProject/equinox-master/ws/movie
 
그리고 ss눌러보자..
 
270 INSTALLED BasicMovieFinderImpl_1.0.0.qualifier
271 INSTALLED MoviesInterface_1.0.0.qualifier
 
둘다 인스톨만 된 상태이다.
 
이제 refresh 270 해보자
 
그럼
 
270 ACTIVE BasicMovieFinderImpl_1.0.0.qualifier
271 RESOLVED MoviesInterface_1.0.0.qualifier
 
하나는 ACTIVE 하나는 RESOLVED로 바뀐 것을 확인 할 수 있다.
 
근데 문서에 보면 270 RESOLVED로 되어있어야하는데..  ACTIVE로 되어있는지는 모르겠다.



참고자료 :

파트3 - 번들간의 의존관계.pdf

+ Recent posts