7.2. Red Hat Fuse 애플리케이션에 패치 적용
patch-maven-plugin 의 목적은 Red Hat Fuse BOM에 나열된 종속 항목의 버전을 애플리케이션에 적용하려는 패치의 패치 메타데이터에 지정된 버전으로 업데이트하는 것입니다.
절차
다음 절차에서는 애플리케이션에 패치를 적용하는 방법을 설명합니다.
프로젝트의
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>
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
-
위의 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
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
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>
-
Fuse Karaf BOM을 사용하는 프로젝트의 경우
-
patch-maven-plugin
은 현재 프로젝트에 적용할 수 있는 버전을 선택하기 위해 메타데이터를 구문 분석합니다. 이는 버전이 7.8.xxx 인 Fuse BOM을 사용하는 Maven 프로젝트에서만 가능합니다. 버전 범위 7.8, 7.9 이상과 일치하는 메타데이터만 적용할 수 있으며 최신 버전의 메타데이터만 가져옵니다. patch-maven-plugin
은 이전 단계에서 발견된groupId
,artifactId
및version
으로 식별된 패치 메타데이터를 다운로드할 때 사용할 원격 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 ...
선택적으로 오프라인 리포지토리를 사용하려는 경우
-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 ...
메타데이터가 원격 리포지토리, 로컬 리포지토리 또는 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>
마지막으로 현재 프로젝트의 모든 관리 종속 항목을 반복할 때 패치 메타데이터에 지정된 수정 사항 목록을 참조합니다. 일치하는 이러한 종속 항목(및 관리되는 종속 항목)은 수정된 버전으로 변경됩니다. 예를 들면 다음과 같습니다.
$ 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
이 호출되지 않아 패치가 애플리케이션에 적용되지 않습니다.