종속성 버전을 확인하는 Maven 플러그인

안녕하세요 여러분! 이 게시물에서는 Maven 프로젝트에서 종속성 버전을 확인해야 하는 이유와 확인 방법을 보여드리겠습니다.

문제



얼마 전에 나는 무슨 일이 일어나고 있는지 이해하기 위해 몇 시간을 보내야 하는 버그를 직장에서 얻었습니다. 그리고 마침내 내가 놀란 원인을 깨달았을 때 버그는 maven 프로젝트의 일부 종속성에 대한 동적 변경 버전이 있었기 때문입니다. 이 종속성에는 LATEST 버전이 있습니다.

그리고 저는 생각했습니다. 왜 우리는 그러한 문제를 확인할 수 있는 ci 파이프라인 단계가 없습니까? 그리고 그런 도구에 대해 들어본 적도 없는 이유는 무엇입니까?

그래서 그 순간 나는 동적으로 변경되는 종속성 버전이 있는 경우 빌드를 실패하도록 maven 플러그인을 찾거나 만들기로 결정했습니다. LATEST , RELEASE 또는 [1.5,)
그러한 경우는 언제 발생할 수 있습니까? 우연히. 또는 코드를 복사하여 붙여넣으십시오. 물론 코드 리뷰에서 감지해야 합니다. 그러나 빠른 개발 단계에서는 쉽게 놓칠 수 있습니다.

이렇게 역동적으로 변하는 버전이 도움이 될 수 있는 상황을 상상할 수 없습니다. 가지고 있다면 의견에 공유하십시오.

왜 메이븐인가?



Java 프로젝트를 빌드하는 데 maven만 있는 것은 아닙니다. Gradle은 대량 채택을 진행 중입니다. 그리고 Maven에 비해 Gradle로 정말 쉽게 만들 수 있는 것들이 있습니다. 그러나 maven은 여전히 ​​가장 인기있는 것입니다. 특히 크고 오래된 엔터프라이즈 회사에 적합합니다. 그리고 이 문제가 발생했을 때 우리는 프로젝트에 maven을 사용했습니다. 그래서 maven을 사용하여 해결하는 방법을 보여주고 있습니다.

연구



기존 플러그인을 검색하기 시작했습니다. 그리고 놀랍게도 나는 그것들을 찾지 못했습니다.
내가 원했던 것과 가장 가까운 것은 requireUpperBoundDeps 규칙이었습니다.

그러나 <version>LATEST</version>는 이 플러그인 규칙을 확인하는 데 문제가 되지 않습니다. 플러그인은 종속성이 최신 버전인지 확인합니다.
1.5 버전의 종속성을 사용할 수 있고 이 플러그인으로 mvn install를 실행하면 프로젝트가 성공적으로 빌드됩니다. 하지만 1.4를 명시적으로 설정하면 빌드가 실패합니다.

그래서 그것은 내가 달성하고 싶었던 것이 아닙니다.

또한 내가 찾던 플러그인을 제외하고 정확히 찾았습니다. requirePluginVersions 규칙입니다.

아이디어



아이디어는 간단합니다. 일치하는 잘못된 종속성 버전에 대한 정규식을 사용합시다. 그리고 우리는 모든 종속성의 버전을 확인합니다. 정규식과 일치하면 예외를 발생시켜 빌드에 실패합니다.

구현



이 아이디어를 구현하기 위해 처음부터 maven 플러그인을 만들 수 있습니다. Maven은 maven-core 라이브러리에서 만들 수 있습니다. 만드는 방법에 대한 좋은 자습서를 찾을 수 있습니다here.

그러나 정규식으로 간단한 문자열을 확인하는 훨씬 더 많은 작업이 있습니다. 더 간단한 방법이 있습니까?

대답은 '예'입니다. 사용자 지정 규칙을 추가할 수 있는 maven 시행자 플러그인이 있습니다.

이를 수행하는 방법에 대한 지침을 찾을 수 있습니다here.

다음 코드만으로도 충분합니다.

MavenProject mavenProject = EnforcerRuleUtils.getMavenProject(helper);
List<Dependency> dependencies = mavenProject.getDependencies();

for (Dependency d : dependencies) {
    String version = d.getVersion();
    boolean isRestrictedVersion = restrictedVersionRegexes.stream().anyMatch(p -> p.matcher(version).find());
    if (isRestrictedVersion || restrictedVersionStrings.contains(version)) {
        throw new EnforcerRuleException(String.format("Dependency %s has restricted version %s.", d, version));
    }
}


사용은 표면 플러그인과 관련이 있습니다. 이 기능을 사용하기 위해 특정 종속성 및 사용자 지정 규칙을 추가할 수 있습니다.

다음과 같습니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>3.0.0</version>
    <dependencies>
        <dependency>
            <groupId>io.github.DaniilRoman</groupId>
            <artifactId>dependency_restricted_version_checker</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>enforce</id>
            <configuration>
                <rules>
                    <myCustomRule implementation="io.github.daniilroman.versionchecker.RestrictDependencyVersionRule">
                        <enabled>true</enabled>
                    </myCustomRule>
                </rules>
            </configuration>
            <goals>
                <goal>enforce</goal>
            </goals>
        </execution>
    </executions>
</plugin>


그리고 그게 다야. 이제 mvn install를 실행하면 이 사용자 정의 규칙을 실행하는 시행자 플러그인이 실행됩니다.

결과적으로 주니어 개발자가 그러한 위험한 변경을 추가하면

예를 들어:

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>RELEASE</version>
    <scope>compile</scope>
</dependency>


코드 검토 단계에서 이것을 놓치게 됩니다. 이러한 검사기는 코드베이스를 보호하는 데 도움이 됩니다.

요약



이 기사에서는 종속성 버전 확인이 도움이 되는 이유를 설명했습니다. 시행자 플러그인을 사용하여 Maven에 구현하는 방법과 프로젝트에 추가하는 방법.

오늘은 여기까지입니다. 계속 지켜봐주시고 코드를 확인하는 것을 잊지 마세요.

추신 GitHub에서 전체 코드를 찾을 수 있습니다.

좋은 웹페이지 즐겨찾기