5.3. 번들로 웹 서비스 패키징

5.3.1. 개요

이 섹션에서는 Apache CXF 애플리케이션의 기존 Maven 프로젝트를 수정하여 프로젝트에서 Red Hat Fuse OSGi 컨테이너에 배포에 적합한 OSGi 번들을 생성하는 방법을 설명합니다. Maven 프로젝트를 변환하려면 프로젝트의 POM 파일과 프로젝트의 블루프린트 파일( META-INF/spring에 배치됨)을 수정해야 합니다.

5.3.2. POM 파일을 수정하여 번들을 생성

번들을 생성하도록 Maven POM 파일을 구성하려면 기본적으로 POM의 패키지 유형을 번들로 변경하고 POM 번들 플러그인을 POM에 추가하는 두 가지 변경 사항이 있습니다. 자세한 내용은 5.1절. “번들 프로젝트 생성”의 내용을 참조하십시오.

5.3.3. 필수 가져오기 패키지

애플리케이션이 Apache CXF 구성 요소를 사용하려면 해당 패키지를 애플리케이션의 번들로 가져와야 합니다. Apache CXF의 종속성이 복잡하기 때문에 Maven 번들 플러그인 또는 bnd 툴을 사용하여 필요한 가져오기를 자동으로 결정할 수 없습니다. 명시적으로 선언해야 합니다.

다음 패키지를 번들로 가져와야 합니다.

javax.jws
javax.wsdl
javax.xml.bind
javax.xml.bind.annotation
javax.xml.namespace
javax.xml.ws
org.apache.cxf.bus
org.apache.cxf.bus.spring
org.apache.cxf.bus.resource
org.apache.cxf.configuration.spring
org.apache.cxf.resource
org.apache.cxf.jaxws
org.springframework.beans.factory.config

5.3.4. 샘플 Maven 번들 플러그인 지침

예 5.1. “필수 가져오기 패키지 구성” 필수 패키지를 가져오기 위해 POM에서 Maven 번들 플러그인을 구성하는 방법을 보여줍니다. 필수 가져오기 패키지는 Import-Package 요소 내에 쉼표로 구분된 목록으로 표시됩니다. 와일드카드인 * 의 모양을 목록의 마지막 요소로 기록해 둡니다. 와일드카드를 사용하면 현재 번들의 Java 소스 파일을 스캔하여 가져올 추가 패키지를 검색할 수 있습니다.

예 5.1. 필수 가져오기 패키지 구성

<project ... >
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        ...
                        <Import-Package>
                            javax.jws,
                            javax.wsdl,
                            javax.xml.bind,
                            javax.xml.bind.annotation,
                            javax.xml.namespace,
                            javax.xml.ws,
                            org.apache.cxf.bus,
                            org.apache.cxf.bus.spring,
                            org.apache.cxf.bus.resource,
                            org.apache.cxf.configuration.spring,
                            org.apache.cxf.resource,
                            org.apache.cxf.jaxws,
                            org.springframework.beans.factory.config,
                            *
                        </Import-Package>
                        ...
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
    ...
</project>

5.3.5. 코드 생성 플러그인 추가

웹 서비스 프로젝트에서는 일반적으로 코드를 생성해야 합니다. Apache CXF는 Cryostat-WS 프런트 엔드에 대한 두 개의 Maven 플러그인을 제공하므로 코드 생성 단계를 빌드에 통합할 수 있습니다. 플러그인의 선택은 다음과 같이 Java 우선 접근 방식 또는 WSDL 우선 접근 방식을 사용하여 서비스를 개발하는지 여부에 따라 달라집니다.

  • Java 우선 접근 방식- cxf-java2ws-plugin 플러그인을 사용합니다.
  • WSDL 우선 접근 방식- cxf-codegen-plugin 플러그인을 사용합니다.

5.3.6. OSGi 구성 속성

OSGi 구성 관리 서비스는 구성 설정을 OSGi 번들에 전달하는 메커니즘을 정의합니다. 구성에 이 서비스를 사용할 필요는 없지만 일반적으로 번들 애플리케이션을 구성하는 가장 편리한 방법입니다. 블루프린트는 OSGi 구성을 지원하여 OSGi 구성 관리 서비스에서 가져온 값을 사용하여 블루프린트 파일의 변수를 대체할 수 있습니다.

OSGi 구성 속성을 사용하는 방법에 대한 자세한 내용은 5.3.7절. “번들 플러그인 구성”9.6절. “기능에 OSGi 구성 추가” 을 참조하십시오.

5.3.7. 번들 플러그인 구성

5.3.7.1. 개요

번들 플러그인에는 작동하는 데 정보가 거의 필요하지 않습니다. 모든 필수 속성은 기본 설정을 사용하여 유효한 OSGi 번들을 생성합니다.

기본값만 사용하여 유효한 번들을 생성할 수 있지만 일부 값을 수정해야 합니다. 플러그인의 instructions 요소 내에 대부분의 속성을 지정할 수 있습니다.

5.3.7.2. 구성 속성

일반적으로 사용되는 일부 구성 속성은 다음과 같습니다.

5.3.7.3. 번들의 심볼릭 이름 설정

기본적으로 번들 플러그인은 Bundle-SymbolicName 속성 값을 groupId + "." + artifactId 로 설정합니다.

  • groupId 에 섹션이 하나만 있는 경우 클래스가 포함된 첫 번째 패키지 이름이 반환됩니다.

    예를 들어, Id 그룹이 commons-logging:commons-logging 인 경우 번들의 심볼릭 이름은 org.apache.commons.logging 입니다.

  • artifactIdgroupId 의 마지막 섹션과 동일한 경우 groupId 가 사용됩니다.

    예를 들어 POM에서 그룹 ID와 아티팩트 ID를 org.apache.maven:maven 로 지정하는 경우 번들의 심볼릭 이름은 org.apache.maven 입니다.

  • artifactIdgroupId 의 마지막 섹션으로 시작되면 해당 부분이 제거됩니다.

    예를 들어 POM에서 그룹 ID 및 아티팩트 ID를 org.apache.maven:maven-core 로 지정하는 경우 번들의 심볼릭 이름은 org.apache.maven.core 입니다.

번들의 심볼릭 이름에 고유한 값을 지정하려면 예 5.2. “번들의 심볼릭 이름 설정” 과 같이 플러그인의 instructions 요소에 Bundle-SymbolicName 자식을 추가합니다.

예 5.2. 번들의 심볼릭 이름 설정

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <configuration>
   <instructions>
     <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
     ...
    </instructions>
  </configuration>
</plugin>

5.3.7.4. 번들 이름 설정

기본적으로 번들의 이름은 ${project.name} 로 설정됩니다.

번들 이름에 대한 자체 값을 지정하려면 예 5.3. “번들 이름 설정” 과 같이 플러그인의 instructions 요소에 Bundle-Name 자식을 추가합니다.

예 5.3. 번들 이름 설정

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <configuration>
   <instructions>
     <Bundle-Name>JoeFred</Bundle-Name>
     ...
    </instructions>
  </configuration>
</plugin>

5.3.7.5. 번들 버전 설정

기본적으로 번들의 버전은 ${project.version} 로 설정됩니다. 모든 대시(-)는 점(.)으로 교체되고 숫자는 최대 4자리로 채워집니다. 예를 들어 4.2-SNAPSHOT4.2.0.SNAPSHOT 이 됩니다.

번들 버전에 대한 자체 값을 지정하려면 예 5.4. “번들 버전 설정” 과 같이 플러그인의 instructions 요소에 Bundle-Version 자식을 추가합니다.

예 5.4. 번들 버전 설정

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <configuration>
   <instructions>
     <Bundle-Version>1.0.3.1</Bundle-Version>
     ...
    </instructions>
  </configuration>
</plugin>

5.3.7.6. 내보낸 패키지 지정

기본적으로 OSGi 매니페스트의 Export-Package 목록은 기본 패키지 . impl 또는 .internal 을 포함하는 패키지를 제외하고 로컬 Java 소스 코드의 모든 패키지( src/main/java아래)로 채워집니다.

중요

플러그인 구성에서 Private-Package 요소를 사용하고 내보낼 패키지 목록을 지정하지 않는 경우 기본 동작에는 번들의 Private-Package 요소에 나열된 패키지만 포함됩니다. 패키지를 내보내지 않습니다.

기본 동작으로 인해 패키지가 매우 크고 비공개로 유지해야 하는 패키지를 내보낼 수 있습니다. 내보낸 패키지 목록을 변경하려면 플러그인의 instructions 요소에 Export-Package 자식을 추가할 수 있습니다.

Export-Package 요소는 번들에 포함할 패키지 목록을 지정하고 내보낼 패키지 목록을 지정합니다. 패키지 이름은 * 와일드카드 기호를 사용하여 지정할 수 있습니다. 예를 들어 com.fuse.demo.* 항목에는 com.fuse.demo 로 시작하는 프로젝트의 클래스 경로에 있는 모든 패키지가 포함되어 있습니다.

제외할 패키지를 지정할 수 있습니다 ! ! 항목을 접두사로 지정합니다. 예를 들어 !com.fuse.demo.private 항목은 com.fuse.demo.private 패키지를 제외합니다.

패키지를 제외할 때 목록의 항목 순서가 중요합니다. 목록은 처음부터 순서대로 처리되며 후속 일치하지 않는 항목은 무시됩니다.

예를 들어 com.fuse.demo 패키지를 제외하고 com.fuse.demo .demo 로 시작하는 모든 패키지를 포함하려면 다음을 사용하여 패키지를 나열합니다.

!com.fuse.demo.private,com.fuse.demo.*

그러나 com.fuse.demo.*,!com.fuse.demo.private 을 사용하여 패키지를 나열하면 com.fuse.demo.private 이 첫 번째 패턴과 일치하므로 번들에 포함됩니다.

5.3.7.7. 개인 패키지 지정

패키지를 내보내지 않고 번들에 포함할 패키지 목록을 지정하려면 번들 플러그인 구성에 Private-Package 명령을 추가할 수 있습니다. 기본적으로 Private-Package 명령을 지정하지 않으면 로컬 Java 소스의 모든 패키지가 번들에 포함됩니다.

중요

패키지가 Private-Package 요소 및 Export-Package 요소의 항목과 일치하는 경우 Export-Package 요소가 우선합니다. 패키지가 번들에 추가되어 내보내집니다.

Private-Package 요소는 번들에 포함할 패키지 목록을 지정하는 Export-Package 요소와 유사하게 작동합니다. 번들 플러그인은 목록을 사용하여 번들에 포함할 프로젝트의 클래스 경로의 모든 클래스를 찾습니다. 이러한 패키지는 번들에 패키지되지만 내보내지 않습니다( Export-Package 명령으로도 선택하지 않는 한).

예 5.5. “번들에 개인 패키지 포함” 번들에 개인 패키지를 포함하는 구성 표시

예 5.5. 번들에 개인 패키지 포함

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <configuration>
   <instructions>
     <Private-Package>org.apache.cxf.wsdlFirst.impl</Private-Package>
     ...
    </instructions>
  </configuration>
</plugin>

5.3.7.8. 가져온 패키지 지정

기본적으로 번들 플러그인은 OSGi 매니페스트의 Import-Package 속성을 번들 콘텐츠에서 참조하는 모든 패키지 목록으로 채웁니다.

기본 동작은 일반적으로 대부분의 프로젝트에 충분하지만 목록에 자동으로 추가되지 않는 패키지를 가져오려는 인스턴스를 찾을 수 있습니다. 기본 동작으로 인해 원하지 않는 패키지를 가져올 수도 있습니다.

번들에서 가져올 패키지 목록을 지정하려면 플러그인의 instructions 요소에 Import-Package 자식을 추가합니다. 패키지 목록의 구문은 Export-Package 요소 및 Private-Package 요소와 동일합니다.

중요

Import-Package 요소를 사용하면 플러그인에서 번들의 콘텐츠를 자동으로 검사하여 필요한 가져오기가 있는지 확인하지 않습니다. 번들 내용이 스캔되었는지 확인하려면 패키지 목록의 마지막 항목으로 * 를 배치해야 합니다.

예 5.6. “번들로 가져온 패키지 지정” 번들로 가져온 패키지를 지정하기 위한 구성 표시

예 5.6. 번들로 가져온 패키지 지정

<plugin>
  <groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
  <configuration>
   <instructions>
     <Import-Package>javax.jws, javax.wsdl, org.apache.cxf.bus, org.apache.cxf.bus.spring, org.apache.cxf.bus.resource, org.apache.cxf.configuration.spring, org.apache.cxf.resource, org.springframework.beans.factory.config, * </Import-Package>
     ...
   </instructions>
  </configuration>
</plugin>

5.3.7.9. 더 많은 정보

번들 플러그인 구성에 대한 자세한 내용은 다음을 참조하십시오.

5.3.8. OSGI configAdmin 파일 이름 지정 규칙

PID 문자열(symbolic-name 구문)은 OSGI 사양의 하이픈을 허용합니다. 그러나 하이픈은 Apache Felix.fileinstallconfig:edit 쉘 명령으로 해석되어 "관리 서비스" 및 "관리 서비스 팩토리"를 구분합니다. 따라서 PID 문자열에서 하이픈을 사용하지 않는 것이 좋습니다.

참고

구성 파일 이름은 PID 및 팩토리 PID와 관련이 있습니다.