번들간의 의존관계
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로 되어있는지는 모르겠다.
참고자료 :
'개발 > OSGI' 카테고리의 다른 글
3. 번들로 번들을 찾아서 제거하기 (0) | 2020.02.07 |
---|---|
2. 번들을 실행하고 멈춰 보자. (0) | 2020.02.07 |
0. OSGi 환경구축 (단독 실행 방법) (0) | 2020.02.07 |
0-1. 이클립스를 이용해 최대한 간단하게(최소한의 번들만 실행해서) OSGI 환경 구축하기 (0) | 2020.02.07 |