1.7. Camel Spring Boot에 패치 적용
새로운 patch-maven-plugin 메커니즘을 사용하면 Red Hat Camel Spring Boot 애플리케이션에 패치를 적용할 수 있습니다. 이 메커니즘을 사용하면 다른 Red Hat 애플리케이션 BOMS에서 제공하는 개별 버전(예: camel-spring-boot-bom )을 변경할 수 있습니다.
patch-maven-plugin 은 Camel on Spring Boot BOM에 나열된 종속성 버전을 애플리케이션에 적용하려는 패치 메타데이터에 지정된 버전으로 업데이트하는 것입니다.
patch-maven-plugin은 다음 작업을 수행합니다.
- 현재 Red Hat 애플리케이션 BOM과 관련된 패치 메타데이터를 검색합니다.
- 버전 변경 사항을 BOM에서 가져온 <dependencyManagement>에 적용합니다.
patch-maven-plugin 이 메타데이터를 가져온 후 플러그인이 선언된 프로젝트의 모든 관리 및 직접 종속 항목을 반복하고 CVE/patch 메타데이터를 사용하여 종속성 버전(동일한 경우)을 대체합니다. 버전이 교체되면 Maven 빌드가 계속되고 표준 Maven 프로젝트 단계를 통해 진행됩니다.
절차
다음 절차에서는 패치를 애플리케이션에 적용하는 방법을 설명합니다.
프로젝트의
pom.xml파일에patch-maven-plugin을 추가합니다.patch-maven-plugin버전은 Spring Boot BOM의 Camel 버전과 동일해야 합니다.<build> <plugins> <<plugin> <groupId>com.redhat.camel.springboot.platform</groupId> <artifactId>patch-maven-plugin</artifactId> <version>${camel-spring-boot-version}</version> <extensions>true</extensions> </plugin> </plugins> </build>mvn clean deploy,mvn validate,mvn dependency:tree명령을 실행하는 경우 플러그인은 프로젝트 모듈을 통해 모듈이 Red Hat Camel Spring Boot BOM을 사용하는지 확인합니다. 다음은 지원되는 BOM입니다.-
com.redhat.camel.springboot.platform:camel-spring-boot-bom: Camel Spring Boot BOM
-
플러그인이 위의 BOM을 찾지 못하면 플러그인은 다음 메시지를 표시합니다.
$ mvn clean install [INFO] Scanning for projects... [INFO] ========== Red Hat Maven patching ========== [INFO] [PATCH] No project in the reactor uses Camel on Spring Boot product BOM. Skipping patch processing. [INFO] [PATCH] Done in 7ms =================================================올바른 BOM을 사용하면 패치 메타데이터를 찾을 수 있지만 패치가 없습니다.
$ mvn clean install [INFO] Scanning for projects... [INFO] ========== Red Hat Maven patching ========== [INFO] [PATCH] Reading patch metadata and artifacts from 2 project repositories [INFO] [PATCH] - redhat-ga-repository: http://maven.repository.redhat.com/ga/ [INFO] [PATCH] - central: https://repo.maven.apache.org/maven2 Downloading from redhat-ga-repository: http://maven.repository.redhat.com/ga/com/redhat/camel/springboot/platform/redhat-camel-spring-boot-patch-metadata/maven-metadata.xml Downloading from central: https://repo.maven.apache.org/maven2/com/redhat/camel/springboot/platform/redhat-camel-spring-boot-patch-metadata/maven-metadata.xml [INFO] [PATCH] Resolved patch descriptor: /path/to/.m2/repository/com/redhat/camel/springboot/platform/redhat-camel-spring-boot-patch-metadata/3.18.3.redhat-00035/redhat-camel-spring-boot-patch-metadata-3.18.3.redhat-00035.xml [INFO] [PATCH] Patch metadata found for com.redhat.camel.springboot.platform/camel-spring-boot-bom/[3.18) [INFO] [PATCH] Done in 938ms =================================================patch-maven-plugin은 이 Maven 메타데이터를 가져오려고 합니다.Camel Spring Boot BOM을 사용하는 프로젝트의 경우
com.redhat.camel.springboot.platform:redhat-camel-spring-boot-patch-metadata/maven-metadata.xml이 해결되었습니다. 이 XML 데이터는com.redhat.camel.springboot.platform:redhat-camel-spring-boot-patch-metadata:RELEASE조정을 사용한 아티팩트의 메타데이터입니다.Maven에서 생성한 메타데이터의 예
<?xml version="1.0" encoding="UTF-8"?> <metadata> <groupId>com.redhat.camel.springboot.platform</groupId> <artifactId>redhat-camel-spring-boot-patch-metadata</artifactId> <versioning> <release>3.18.3.redhat-00035</release> <versions> <version>3.18.3.redhat-00035</version> </versions> <lastUpdated>20230322103858</lastUpdated> </versioning> </metadata>
-
patch-maven-plugin은 메타데이터를 구문 분석하여 현재 프로젝트에 적용되는 버전을 선택합니다. 이 작업은 특정 버전의 Spring Boot BOM에서 Camel을 사용하는 Maven 프로젝트에만 적용할 수 있습니다. 버전 범위 이상과 일치하는 메타데이터만 적용되며 최신 버전의 메타데이터만 가져옵니다. patch-maven-plugin은 이전 단계에서 발견된groupId,artifactId및버전으로식별된 패치 메타데이터를 다운로드하는 원격 Maven 리포지토리 목록을 수집합니다. 이러한 Maven 리포지토리는 활성 프로필의 프로젝트의 <repositories> 요소와settings.xml파일의 리포지토리에도 나열됩니다.$ mvn clean install [INFO] Scanning for projects... [INFO] ========== Red Hat Maven patching ========== [INFO] [PATCH] Reading patch metadata and artifacts from 2 project repositories [INFO] [PATCH] - MRRC-GA: https://maven.repository.redhat.com/ga [INFO] [PATCH] - central: https://repo.maven.apache.org/maven2메타데이터가 원격 리포지토리, 로컬 리포지토리 또는 ZIP 파일에서 제공되는지 여부에 관계없이
patch-maven-plugin으로 분석됩니다. 가져온 메타데이터에는 CVE 목록이 포함되어 있으며 각 CVE에 대해 지정된 CVE에 대한 수정 사항이 포함된 버전과 함께 영향을 받는 Maven 아티팩트 목록이 있습니다. 예를 들면 다음과 같습니다.<?xml version="1.0" encoding="UTF-8" ?> <<metadata xmlns="urn:redhat:patch-metadata:1"> <product-bom groupId="com.redhat.camel.springboot.platform" artifactId="camel-spring-boot-bom" versions="[3.18)" /> <cves> </cves> <fixes> <fix id="HF0-1" description="logback-classic (Example) - Version Bump"> <affects groupId="ch.qos.logback" artifactId="logback-classic" versions="[1.0,1.3.0)" fix="1.3.0" /> </fix> </fixes> </metadata>마지막으로 현재 프로젝트의 모든 관리 종속 항목을 반복할 때 패치 메타데이터에 지정된 수정 사항 목록이 참조됩니다. 일치하는 이러한 종속 항목(및 관리되는 종속 항목)은 수정된 버전으로 변경됩니다. 예를 들면 다음과 같습니다.
$ mvn dependency:tree [INFO] Scanning for projects... [INFO] ========== Red Hat Maven patching ========== [INFO] [PATCH] Reading patch metadata and artifacts from 3 project repositories [INFO] [PATCH] - redhat-ga-repository: http://maven.repository.redhat.com/ga/ [INFO] [PATCH] - local: file:///path/to/.m2/repository [INFO] [PATCH] - central: https://repo.maven.apache.org/maven2 [INFO] [PATCH] Resolved patch descriptor:/path/to/.m2/repository/com/redhat/camel/springboot/platform/redhat-camel-spring-boot-patch-metadata/3.18.3.redhat-00035/redhat-camel-spring-boot-patch-metadata-3.20.1.redhat-00043.xml [INFO] [PATCH] Patch metadata found for com.redhat.camel.springboot.platform/camel-spring-boot-bom/[3.20,3.21) [INFO] [PATCH] - patch contains 1 patch fix [INFO] [PATCH] Processing managed dependencies to apply patch fixes... [INFO] [PATCH] - HF0-1: logback-classic (Example) - Version Bump [INFO] [PATCH] Applying change ch.qos.logback/logback-classic/[1.0,1.3.0) -> 1.3.0 [INFO] [PATCH] Project com.test:yaml-routes [INFO] [PATCH] - managed dependency: ch.qos.logback/logback-classic/1.2.11 -> 1.3.0 [INFO] [PATCH] Done in 39ms =================================================
패치 건너뛰기
프로젝트에 특정 패치를 적용하지 않으려면 patch-maven-plugin 은 건너뛰기 옵션을 제공합니다. 프로젝트의 pom.xml 파일에 patch-maven-plugin 을 이미 추가했으며 버전을 변경하지 않으려면 다음 방법 중 하나를 사용하여 패치를 건너뛸 수 있습니다.
-
다음과 같이 프로젝트의
pom.xml파일에 skip 옵션을 추가합니다.
<build>
<plugins>
<plugin>
<groupId>com.redhat.camel.springboot.platform</groupId>
<artifactId>patch-maven-plugin</artifactId>
<version>${camel-spring-boot-version}</version>
<extensions>true</extensions>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
-
또는 다음과 같이
mvn명령을 실행할 때-DskipPatch옵션을 사용합니다.
$ mvn clean install -DskipPatch
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------------< com.example:test-csb >-------------------------
[INFO] Building A Camel Spring Boot Route 1.0-SNAPSHOT
...
위 출력에 표시된 대로 patch-maven-plugin 이 호출되지 않아 패치가 애플리케이션에 적용되지 않았습니다.