7.2. Red Hat Fuse 애플리케이션에 패치 적용

patch-maven-plugin 의 목적은 Red Hat Fuse BOM에 나열된 종속 항목의 버전을 애플리케이션에 적용하려는 패치의 패치 메타데이터에 지정된 버전으로 업데이트하는 것입니다.

절차

다음 절차에서는 애플리케이션에 패치를 적용하는 방법을 설명합니다.

  1. 프로젝트의 pom.xml 파일에 patch-maven-plugin 을 추가합니다. patch-maven-plugin 의 버전은 Fuse BOM의 버전과 동일해야 합니다.

    <build>
        <plugins>
            <plugin>
                <groupId>org.jboss.redhat-fuse</groupId>
                <artifactId>patch-maven-plugin</artifactId>
                <version>${version.org.jboss-redhat-fuse}</version>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>
  2. mvn clean deploy 또는 mvn validate 또는 mvn dependency:tree 명령 중 하나를 실행하면, 플러그인은 프로젝트 모듈을 통해 Red Hat Fuse BOMs 중 하나를 사용하는지 확인합니다. 지원되는 BOM은 다음 두 가지로 간주됩니다.

    • org.jboss.redhat-fuse:fuse-karaf-bom: Fuse Karaf BOM
    • org.jboss.redhat-fuse:fuse-springboot-bom: Fuse Spring Boot BOM
  3. 위의 BOM을 찾을 수 없는 경우 플러그인은 다음 메시지를 표시합니다.

    $ mvn clean install
    [INFO] Scanning for projects...
    [INFO]
    
    ========== Red Hat Fuse Maven patching ==========
    
    [INFO] [PATCH] No project in the reactor uses Fuse Karaf or Fuse Spring Boot BOM. Skipping patch processing.
    [INFO] [PATCH] Done in 3ms
  4. Fuse BOM이 둘 다 발견되면 다음 경고와 함께 patch-maven-plugin 이 중지됩니다.

    $ mvn clean install
    [INFO] Scanning for projects...
    [INFO]
    
    ========== Red Hat Fuse Maven patching ==========
    
    [WARNING] [PATCH] Reactor uses both Fuse Karaf and Fuse Spring Boot BOMs. Please use only one. Skipping patch processing.
    [INFO] [PATCH] Done in 3ms
  5. patch-maven-plugin 은 다음 Maven 메타데이터 값 중 하나를 가져옵니다.

    • Fuse Karaf BOM을 사용하는 프로젝트의 경우 org.jboss.redhat-fuse/fuse-karaf-patch-metadata/maven-metadata.xml 이 해결되었습니다. org.jboss.redhat-fuse:fuse-karaf-patch-metadata:RELEASE 좌표를 사용하여 아티팩트의 메타데이터입니다.
    • Fuse Spring Boot BOM 프로젝트를 사용하는 프로젝트의 경우 org.jboss.redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml 이 확인됩니다. org.jboss.redhat-fuse:fuse-springboot-patch-metadata:RELEASE 좌표를 사용하여 아티팩트의 메타데이터입니다.

      Maven에서 생성한 메타데이터의 예

      <?xml version="1.0" encoding="UTF-8"?>
      <metadata>
        <groupId>org.jboss.redhat-fuse</groupId>
        <artifactId>fuse-springboot-patch-metadata</artifactId>
        <versioning>
          <release>7.8.1.fuse-sb2-781025</release>
          <versions>
            <version>7.8.0.fuse-sb2-780025</version>
            <version>7.7.0.fuse-sb2-770010</version>
            <version>7.7.0.fuse-770010</version>
            <version>7.8.1.fuse-sb2-781025</version>
          </versions>
          <lastUpdated>20201023131724</lastUpdated>
        </versioning>
      </metadata>

  6. patch-maven-plugin 은 현재 프로젝트에 적용할 수 있는 버전을 선택하기 위해 메타데이터를 구문 분석합니다. 이는 버전이 7.8.xxx 인 Fuse BOM을 사용하는 Maven 프로젝트에서만 가능합니다. 버전 범위 7.8, 7.9 이상과 일치하는 메타데이터만 적용할 수 있으며 최신 버전의 메타데이터만 가져옵니다.
  7. patch-maven-plugin 은 이전 단계에서 발견된 groupId,artifactIdversion 으로 식별된 패치 메타데이터를 다운로드할 때 사용할 원격 Maven 리포지토리 목록을 수집합니다. 이러한 Maven 리포지토리는 활성 프로필의 프로젝트의 < repositories > 요소와 settings.xml 파일의 리포지토리에도 나열됩니다.

    $ mvn clean install
    [INFO] Scanning for projects...
    [INFO]
    
    ========== Red Hat Fuse Maven patching ==========
    
    [INFO] [PATCH] Reading patch metadata and artifacts from 2 project repositories
    [INFO] [PATCH]  - local-nexus: http://everfree.forest:8081/repository/maven-releases/
    [INFO] [PATCH]  - central: https://repo.maven.apache.org/maven2
    Downloading from local-nexus: http://everfree.forest:8081/repository/maven-releases/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml
    ...
  8. 선택적으로 오프라인 리포지토리를 사용하려는 경우 -Dpatch 옵션을 사용하여 jboss-fuse/redhat-fuse 프로젝트의 fuse-karaf/fuse-patch-repository 또는 fuse-springboot/fuse-springboot-patch-repository 모듈에서 생성하는 ZIP 파일을 지정할 수 있습니다. 이러한 ZIP 파일은 Maven 리포지토리 구조와 동일한 내부 구조를 갖습니다. 예를 들면 다음과 같습니다.

    $ mvn clean install -Dpatch=../../../test/resources/patch-3.zip
    [INFO] Scanning for projects...
    [INFO]
    
    ========== Red Hat Fuse Maven patching ==========
    
    [INFO] [PATCH] Reading metadata and artifacts from /data/sources/github.com/jboss-fuse/redhat-fuse/fuse-tools/patch-maven-plugin/src/test/resources/patch-3.zip
    Downloading from fuse-patch: zip:file:/tmp/patch-3.zip-1742974214598205745/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml
    Downloaded from fuse-patch: zip:file:/tmp/patch-3.zip-1742974214598205745/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml (406 B at 16 kB/s)
    Downloading from fuse-patch: zip:file:/tmp/patch-3.zip-1742974214598205745/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/7.8.0.fuse-sb2-781023/fuse-springboot-patch-metadata-7.8.0.fuse-sb2-781023.xml
    Downloaded from fuse-patch: zip:file:/tmp/patch-3.zip-1742974214598205745/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/7.8.0.fuse-sb2-781023/fuse-springboot-patch-metadata-7.8.0.fuse-sb2-781023.xml (926 B at 309 kB/s)
    [INFO] [PATCH] Resolved patch descriptor: /home/user/.m2/repository/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/7.8.0.fuse-sb2-781023/fuse-springboot-patch-metadata-7.8.0.fuse-sb2-781023.xml
    ...
  9. 메타데이터가 원격 리포지토리, 로컬 리포지토리 또는 ZIP 파일에서 제공되는지 여부에 따라 patch-maven-plugin 에 의해 분석됩니다. 가져온 메타데이터에는 CVE 목록이 포함되어 있으며 각 CVE에 대해 수정 사항이 포함된 버전과 함께 영향을 받는 Maven 아티팩트 목록(글러러 패턴 및 버전 범위에 의해 지정됨)이 있습니다. 예를 들면 다음과 같습니다.

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <metadata xmlns="urn:redhat:fuse:patch-metadata:1">
        <product-bom groupId="org.jboss.redhat-fuse" artifactId="fuse-springboot-bom" versions="[7.8,7.9)" />
        <cves>
            <cve id="CVE-2020-xyz" description="Jetty can be configured to listen on port 8080"
                    cve-link="https://nvd.nist.gov/vuln/detail/CVE-2020-xyz"
                    bz-link="https://bugzilla.redhat.com/show_bug.cgi?id=42">
                <affects groupId="org.eclipse.jetty" artifactId="jetty-*" versions="[9.4,9.4.32)" fix="9.4.32.v20200930" />
                <affects groupId="org.eclipse.jetty.http2" artifactId="http2-*" versions="[9.4,9.4.32)" fix="9.4.32.v20200930" />
            </cve>
        </cves>
        <fixes />
    </metadata>
  10. 마지막으로 현재 프로젝트의 모든 관리 종속 항목을 반복할 때 패치 메타데이터에 지정된 수정 사항 목록을 참조합니다. 일치하는 이러한 종속 항목(및 관리되는 종속 항목)은 수정된 버전으로 변경됩니다. 예를 들면 다음과 같습니다.

    $ mvn clean install -U
    [INFO] Scanning for projects...
    [INFO
    
    ========== Red Hat Fuse Maven patching ==========
    
    [INFO] [PATCH] Reading patch metadata and artifacts from 2 project repositories
    [INFO] [PATCH]  - local-nexus: http://everfree.forest:8081/repository/maven-releases/
    [INFO] [PATCH]  - central: https://repo.maven.apache.org/maven2
    Downloading from local-nexus: http://everfree.forest:8081/repository/maven-releases/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml
    Downloading from central: https://repo.maven.apache.org/maven2/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml
    Downloaded from local-nexus: http://everfree.forest:8081/repository/maven-releases/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/maven-metadata.xml (363 B at 4.3 kB/s)
    [INFO] [PATCH] Resolved patch descriptor: /home/user/.m2/repository/org/jboss/redhat-fuse/fuse-springboot-patch-metadata/7.8.0.fuse-sb2-780032/fuse-springboot-patch-metadata-7.8.0.fuse-sb2-780032.xml
    [INFO] [PATCH] Patch metadata found for org.jboss.redhat-fuse/fuse-springboot-bom/[7.8,7.9)
    [INFO] [PATCH]  - patch contains 1 CVE fix
    [INFO] [PATCH] Processing managed dependencies to apply CVE fixes... (https://nvd.nist.gov/vuln/detail/CVE-2020-xyz, https://bugzilla.redhat.com/show_bug.cgi?id=42_
    [INFO] [PATCH] - CVE-2020-xyz: Jetty can be configured to expose itself on port 8080
    [INFO] [PATCH]   Applying change org.eclipse.jetty/jetty-*/[9.4,9.4.32) -> 9.4.32.v20200930
    [INFO] [PATCH]    - managed dependency: org.eclipse.jetty/jetty-alpn-client/9.4.30.v20200611 -> 9.4.32.v20200930
    ...
    [INFO] [PATCH]    - managed dependency: org.eclipse.jetty/jetty-openid/9.4.30.v20200611 -> 9.4.32.v20200930
    [INFO] [PATCH]   Applying change org.eclipse.jetty.http2/http2-*/[9.4,9.4.32) -> 9.4.32.v20200930
    [INFO] [PATCH]    - managed dependency: org.eclipse.jetty.http2/http2-client/9.4.30.v20200611 -> 9.4.32.v20200930
    ...
    [INFO] [PATCH] Done in 635ms
    
    =================================================

패치 건너뛰기

프로젝트에 특정 패치를 적용하지 않으려면 patch-maven-plugin 에서 skip 옵션을 제공합니다. 이미 patch-maven-plugin 을 프로젝트의 pom.xml 파일에 추가했으며 버전을 변경할 필요가 없다고 가정하면 다음 방법 중 하나를 사용하여 패치를 건너뛸 수 있습니다.

  • 다음과 같이 프로젝트의 pom.xml 파일에 skip 옵션을 추가합니다.
<build>
    <plugins>
        <plugin>
            <groupId>org.jboss.redhat-fuse</groupId>
            <artifactId>patch-maven-plugin</artifactId>
            <version>${version.org.jboss-redhat-fuse}</version>
            <extensions>true</extensions>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>
</build>
  • 또는 다음과 같이 mvn 명령을 실행할 때 -DskipPatch 옵션을 사용합니다.
$ mvn dependency:tree -DskipPatch
[INFO] Scanning for projects...
[INFO]
[INFO] ------< org.jboss.redhat-fuse:cve-dependency-management-module1 >-------
[INFO] Building cve-dependency-management-module1 7.8.0.fuse-sb2-780033
[INFO] --------------------------------[ jar ]---------------------------------
...

위 출력에 표시된 것처럼 patch-maven-plugin 이 호출되지 않아 패치가 애플리케이션에 적용되지 않습니다.