2014-10-31 7 views
1

사용자로부터 여러 Maven 종속성 목록을 가져 와서 포함 된 응용 프로그램으로 해결하고로드합니다. 다음 단계는 다음과 같습니다Maven 의존성을 기반으로 포함 된 응용 프로그램을 프로그래밍 방식으로 빌드하고 실행하십시오.

  1. 는 오드 모든 의존성이 오드와 (DONE)
  2. 해결 클래스 경로 (DONE)
  3. 는 위의 번들 (DONE) 모든 메이븐 의존성
  4. 해결의 목록을 수집 분리 된 "컨테이너"(충돌 가능성이있는 다른 Maven 의존성이 사용될 수 있도록).
  5. 다른 목록과 반복하십시오.

일부 컨텍스트 제공 : 다른 버전의 라이브러리 세트에 의존하는 다른 (자연어 처리) 파이프 라인을 실행하려면 위의 UIMA 컨텍스트에서 위의 내용을 사용하고 싶습니다. 내 목표는 RESTful 방식으로 호출 할 수있는 (Maven) 의존성과 파이프 라인을 정의하는 주석 서버를 만드는 것이다. 파이프 라인 (및 해당 종속성)은 클래스 패스 충돌을 피하기 위해 포함 된 클래스 경로 환경에서 각각 실행해야합니다.

OSGi는 갈 길이 있습니까? 클래스 패스 (: = 해결 된 jar 목록)를 기반으로 OSGi 번들을 빌드하고 배포 할 수 있습니까? 모두 프로그래밍 방식으로? 필자는 Maven 종속성 (UIMA 구성 요소입니다.)을 제어 할 수 없으므로 OSGi 메타 데이터를 추가 할 방법이 없습니다.

답변

2

maven-assembly-plugin과 maven 프로필을 함께 사용하면이 문제를 해결할 수 있습니까?

프로필별로 종속성을 다르게 필터링 할 수 있습니다. 프로파일 별 어셈블리 설명자 문서를 사용하고 전쟁에 배치 할 사용자 지정 매니페스트를 생성 할 수 있습니다. J2EE Web Application (war) 어셈블리를 설명하고 있습니다. 서블릿 컨테이너 내부의 방화벽이있는 클래스 로더에서 실행되므로 동일한 소스를 기반으로 한 무리를 생성 할 수 있습니다 (웹 응용 프로그램 컨텍스트와 WEB- INF/lib (프로필 기준)

예를 들어, 같은 Tomcat 서버에 이들을 저장하면 갈 준비가 된 것입니다.

HTH, 당신은 Apache Stanbol를 사용할 수처럼 많은 소리

+0

감사합니다. @nrapopor, 좋은 생각 같아요. 서블릿 컨테이너 내부의 "방화벽으로 연결된"클래스 로더에 대해 자세히 설명해 주시겠습니까? UIMA가 Class.forName() 호출을 사용한다는 것을 알고 있습니다 - 작동합니까? 글쎄, 나는 단지 보려고 노력할 것 같다. 다시 한 번 감사드립니다. – Renaud

1

jar 목록을 포함하는 번들을 만들 수 있습니다. 모든 것을 묶음의 고유 한 클래스 경로에 넣고 해당 번들을 OSGi 컨테이너에 배포 할 수 있습니다. BundleActivator (기본 번들 Java와 같은 해당 번들의 진입 점)를 작성해야 할 수도 있습니다.

그런 번들이 여러 개 있다고하고, 각 번들을 별도의 컨테이너에 배포하려는 것을 올바르게 이해하고 있습니까? 그렇다면 어떤 종류의 REST 라이브러리를 사용하여 각 번들마다 REST 엔드 포인트를 제공하거나 OSGi 원격 서비스를 사용하여 다른 컨테이너에서 발견 할 수있는 서비스를 게시 할 수있다.

이것이 의미하는 것이 확실하지 않으므로 OSGi가 올바른 방법인지 잘 모르겠습니다. 설명에서 두 서비스를 사용하지 않습니다 (OSGi를 사용하는 중요한 이유는 응용 프로그램의 각 부분을 서로 분리 시킴) 또는 구성 요소에 대해 다른 번들을 만들지 않으려는 것입니다 (OSGi를 사용하는 또 다른 중요한 이유). 현재 "마이크로 서비스"라고 불리는 건축 스타일을 거의 묘사하고 있습니다. 조금 더 자세히 설명해 주시겠습니까?

+0

감사합니다. Marcel. 번들은 몇 가지 REST 엔드 포인트 만 공개 할 것이고 다른 서비스는 공개하지 않을 것이다. – Renaud

1

. 콘텐츠의 의미 론적 향상에 초점을 맞춘 프레임 워크이지만 콘텐츠와 관련된 모든 웹 기반 작업 흐름에 사용할 수 있습니다. 파이프 라인을 정의하여 데이터를 처리 및/또는 저장할 수 있습니다. Apache Tika 및 OpenNLP를 사용하는 NLP 용 구성 요소가 있습니다. 내가 아는 한 UIMA도 통합 할 수 있습니다. RESTful 서비스를 사용하며 OSGI를 기반으로합니다. Stanbol이 사용 사례에 맞지 않는 당신은 자신의 응용 프로그램을 출시해야하는 경우


, 나는 OSGI는 아직 갈 길을 생각합니다.

사용 사례에 따라 컨테이너에 번들을 배포하거나 OSGI 프레임 워크를 작성한 번들을로드하는 작은 런처 앱에 간단히 임베드 할 수 있습니다.

많은 Maven 아티팩트에는 이미 OSGI 메타 데이터가 포함되어 있습니다. 대개의 경우 maven-dependency-plugin을 사용하여 번들 디렉토리로 복사 한 다음 OSGI 번들로 직접로드 할 수 있습니다.

비 OSGI 의존성은 필요로하는 번들에 포함될 수 있습니다. maven 아티팩트 id와 버전에 기반한 메타 데이터를 추가하고 종속물을 번들로 재 패키징하기 위해 매니페스트를 수정하기 위해 몇 가지 메이븐 플러그인을 설정할 수 있어야합니다 (Maven pom 버전 이후로는 항상 작동하지 않습니다. 패키지의 버전이 항상 동일하지는 않습니다).

사용자 코드 및 필요한 종속성은 maven-bundle-plugin을 사용하여 번들로 묶을 수 있습니다. 그것은 당신을위한 매니 페스트를 생성 할 수 있습니다.

REST 인터페이스의 경우 일반적으로 JAX-RS (Jersey 또는 Apache CXF DOSGI)를 권장하지만 해당 프레임 워크와의 프로그래밍 방식을 아직 사용하지 않았습니다.

1

사용 사례에 따라 Java ServiceLoader API을 살펴 보시기 바랍니다. ServiceLoader API를 사용하면 인터페이스를 정의하고 자체 독립 JAR에서 해당 인터페이스의 구현을로드 할 수 있습니다. 다른 라이브러리를 자신의 jar 파일로 빌드하고 인터페이스를 통해 필요한 메소드를 노출하고 Java 프로그램에서 독립적으로로드 할 수 있습니다. ServiceLoader는 사용할 수있는 다양한 구현을 나열합니다.

문서에서 : 일부 프로토콜에 대한 인코더/디코더 쌍 세트를 나타 내기위한 com.example.CodecSet 서비스 유형이 있다고 가정합니다. 이 경우 두 개의 추상 메소드와 추상 클래스입니다 : 공급자가 지정된 인코딩을 지원하지 않는 경우

public abstract Encoder getEncoder(String encodingName); 
public abstract Decoder getDecoder(String encodingName); 

각 방법은 적절한 오브젝트를 돌려줍니다. 일반적인 공급자는 둘 이상의 인코딩을 지원합니다. com.example.impl 인 경우.StandardCodecs는 CodecSet 서비스의 구현은 다음의 jar 파일도라는 이름의 파일이 포함되어 있습니다

META-INF/services/com.example.CodecSet 

이 파일은 한 줄이 포함

com.example.impl.StandardCodecs  # Standard codecs 

CodecSet 클래스가 생성 및 초기화에 하나의 서비스 인스턴스를 저장 :

private static ServiceLoader<CodecSet> codecSetLoader 
     = ServiceLoader.load(CodecSet.class); 

은 반복되는 공지 가능한 있습니다 provi 통해 정적 공장 메소드를 정의하는 소정의 인코딩 이름 인코더를 찾으려면 ders는 적절한 인코더를 찾았거나 공급자가 부족한 경우에만 반환됩니다.

public static Encoder getEncoder(String encodingName) { 
     for (CodecSet cp : codecSetLoader) { 
       Encoder enc = cp.getEncoder(encodingName); 
       if (enc != null) 
         return enc; 
     } 
     return null; 
} 

getDecoder 메서드도 마찬가지로 정의됩니다.