1. 소개

Maven은 프로젝트 빌드에 도움이되는 다양한 플러그인을 제공합니다. 그러나 이러한 플러그인이 충분하지 않아 자체 개발해야하는 경우가있을 수 있습니다.

다행히 Maven 은이 프로세스에 도움이되는 몇 가지 유용한 도구를 제공합니다.

이 예제에서는 매우 실용적이며 처음부터 Maven 플러그인을 만드는 방법을 단계별로 보여줄 것입니다.

또한 프로젝트에서 사용하는 방법과 이에 대한 문서를 만드는 방법도 보여줍니다.

2. 플러그인 생성

이 사용방법(예제)에서는 프로젝트에 포함 된 의존성 수를 계산하는 counter-maven-plugin 이라는 플러그인을 개발할 것입니다. 플러그인 이름 을 선택할 때 Maven이 권장 하는 플러그인 이름 지정 규칙 을 따르는 것이 매우 중요합니다 .

이제 우리가 무엇을 개발할 것인지 알았으니 다음으로해야 할 일은 Maven 프로젝트를 만드는 것입니다. 에서 의 pom.xml 우리는 정의 할 것이다 의 groupId , artifactId를 하고 버전 우리의 플러그인을 :

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.baeldung</groupId>
    <artifactId>counter-maven-plugin</artifactId>
    <packaging>maven-plugin</packaging>
    <version>0.0.1-SNAPSHOT</version>
 
    <name>counter-maven-plugin Maven Mojo</name>
    <url>http://maven.apache.org</url>
 
    <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>
</project>

패키징을 maven-plugin으로 설정했습니다 .

이 경우 프로젝트를 수동으로 만들었지 만 maven-archetype-mojo를 사용하여 만들 수도 있습니다 .

mvn archetype:generate 
  -DgroupId=com.baeldung 
  -DartifactId=counter-maven-plugin 
  -Dversion=0.0.1-SNAPSHOT 
  -DarchetypeGroupId=org.apache.maven.archetypes 
  -DarchetypeArtifactId=maven-archetype-mojo

이 작업을 수행 할 때 최신 버전을 사용하도록 의존성의 기본 버전을 업데이트해야합니다.

3. 모조 만들기

이제 첫 번째 모조를 만들 차례입니다. Mojo는 플러그인이 실행할 목표를 나타내는 Java 클래스입니다 . 플러그인에는 하나 이상의 모조가 포함됩니다.

우리의 mojo는 프로젝트의 의존성 수를 계산할 책임이 있습니다.

3.1. 의존성 추가

mojo를 만들기 전에 pom.xml에 몇 가지 의존성을 추가해야합니다 .

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.6.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-project</artifactId>
        <version>2.2.1</version>
    </dependency>
</dependencies>

받는다는 - 플러그인-API의 의존성이 필요하고 우리의 모조를 만드는 데 필요한 클래스와 인터페이스를 포함합니다 . 받는다는 - 플러그인 - 어노테이션 의존성은 우리의 클래스에 어노테이션을 사용하는 것이 편리합니다. 받는다는 프로젝트의 의존성은 우리가 플러그인을 포함하고있는 프로젝트에 대한 정보에 액세스 할 수 있습니다.

3.2. Mojo 클래스 만들기

이제 모조를 만들 준비가되었습니다!

mojo는 Mojo 인터페이스 를 구현해야합니다 . 우리의 경우에는 AbstractMojo 에서 확장 하므로 execute 메소드 만 구현하면 됩니다.

@Mojo(name = "dependency-counter", defaultPhase = LifecyclePhase.COMPILE)
public class DependencyCounterMojo extends AbstractMojo {
    // ...
}

보시다시피 dependency-counter 는 목표의 이름입니다. 반면 에 기본적으로 컴파일 단계에 첨부했기 때문에이 목표를 사용할 때 반드시 단계를 지정할 필요는 없습니다.

프로젝트 정보에 액세스하려면 MavenProject 를 매개 변수로 추가해야합니다 .

@Parameter(defaultValue = "${project}", required = true, readonly = true)
MavenProject project;

이 객체는 컨텍스트가 생성 될 때 Maven에 의해 주입됩니다.

이 시점에서 우리는 execute 메소드를 구현하고 프로젝트의 의존성 수를 계산할 수 있습니다.

public void execute() throws MojoExecutionException, MojoFailureException {
    List<Dependency> dependencies = project.getDependencies();
    long numDependencies = dependencies.stream().count();          
    getLog().info("Number of dependencies: " + numDependencies);
}

의 getLog () 메소드는 메이븐 로그에 대한 액세스를 제공한다. AbstractMojo는 이미 수명주기를 처리합니다.

3.3. 매개 변수 추가

이전에 추가 한 매개 변수는 읽기 전용이며 사용자가 구성 할 수 없습니다. 또한 Maven에 의해 주입되었으므로 일종의 특별하다고 말할 수 있습니다.

이 섹션에서는 사용자가 계산하려는 의존성의 범위를 지정할 수있는 매개 변수를 추가합니다.

따라서 mojo에서 범위 매개 변수를 생성 해 보겠습니다 .

@Parameter(property = "scope")
String scope;

속성 속성 만 설정했습니다 . 명령 줄이나 pom 속성을 통해이 속성을 설정할 수 있습니다. 나머지 속성의 경우 기본값으로 괜찮습니다.

이제이 매개 변수를 사용하고 계산할 때 의존성을 필터링 하도록 execute 메소드를 수정 합니다.

public void execute() throws MojoExecutionException, MojoFailureException {
    List<Dependency> dependencies = project.getDependencies();
    long numDependencies = dependencies.stream()
      .filter(d -> (scope == null || scope.isEmpty()) || scope.equals(d.getScope()))
      .count();          
    getLog().info("Number of dependencies: " + numDependencies);
}

보다 고급 유형의 매개 변수는 공식 문서에 설명되어 있습니다 .

4. 플러그인 테스트

플러그인 개발이 끝났습니다. 작동하는지 테스트 해 봅시다!

우선, 로컬 저장소에 플러그인을 설치해야합니다.

mvn clean install

다음 섹션에서는 먼저 명령 줄에서 플러그인을 실행하는 방법을 살펴 보겠습니다. 그런 다음 Maven 프로젝트에서 사용하는 방법도 다룹니다.

4.1. 플러그인 실행

정규화 된 이름을 지정하여 명령 줄에서 플러그인의 목표를 실행할 수 있습니다.

mvn groupId:artifactId:version:goal

우리의 경우 다음과 같습니다.

mvn com.baeldung:counter-maven-plugin:0.0.1-SNAPSHOT:dependency-counter

그러나이 예제의 시작 부분에서 언급 한 플러그인 명명 규칙을 따랐다면 Maven은 플러그인 접두사 를 확인하고 명령을 단축 할 수 있습니다.

mvn counter:dependency-counter

이 명령은 최신 버전의 플러그인을 사용하고 있습니다. 또한, Maven도이 그룹에서 검색 있도록 settings.xmlpluginGroupsgroupId추가 해야 합니다 .

<pluginGroups>
    <pluginGroup>com.baeldung</pluginGroup>
</pluginGroups>

명령의 출력을 확인하면 플러그인이 플러그인의 pom.xml 에서 의존성 수를 계산했음을 알 수 있습니다 .

[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------< com.baeldung:counter-maven-plugin >------------------
[INFO] Building counter-maven-plugin Maven Mojo 0.0.1-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO] 
[INFO] --- counter-maven-plugin:0.0.1-SNAPSHOT:dependency-counter (default-cli) @ counter-maven-plugin ---
[INFO] Number of dependencies: 3
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.529 s
[INFO] Finished at: 2019-11-30T20:43:41+01:00
[INFO] ------------------------------------------------------------------------

명령 줄 속성을 통해 범위 매개 변수를 설정할 수도 있습니다.

mvn counter:dependency-counter -Dscope=test

을 주목하는 범위 이름은 우리가 정의하는 하나입니다 속성  모조에 우리의 매개 변수의 속성은.

4.2. 프로젝트에서 플러그인 사용

이제 프로젝트에서 플러그인을 사용하여 테스트 해 봅시다!

플러그인이 계산할 몇 가지 의존성이있는 매우 간단한 Maven 프로젝트를 만들 것입니다.

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.baeldung</groupId>
    <artifactId>example</artifactId>
    <packaging>pom</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.11</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

마지막으로 플러그인을 빌드에 추가합니다. 의존성 카운터 목표 를 실행하려면 명시 적으로 설정해야합니다 .

<build>
    <plugins>
        <plugin>
            <groupId>com.baeldung</groupId>
            <artifactId>counter-maven-plugin</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <executions>
                <execution>
                    <goals>
                        <goal>dependency-counter</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <scope>test</scope>
            </configuration>
        </plugin>
    </plugins>
</build>

구성 노드 에서 범위 매개 변수를 지정했습니다 . 또한 mojo가 기본적으로 컴파일 단계에 연결되어 있기 때문에 단계를 지정하지 않았습니다 .

이제 플러그인을 실행하기 위해 컴파일 단계를 실행하면됩니다.

mvn clean compile

그리고 플러그인은 테스트 의존성 수를 출력합니다 .

[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------< com.baeldung:example >------------------------
[INFO] Building example 0.0.1-SNAPSHOT
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ example ---
[INFO] 
[INFO] --- counter-maven-plugin:0.0.1-SNAPSHOT:dependency-counter (default) @ example ---
[INFO] Number of dependencies: 1
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.627 s
[INFO] Finished at: 2019-11-25T18:57:22+01:00
[INFO] ------------------------------------------------------------------------

이 예제에서는 플러그인에 대한 단위 또는 통합 테스트를 작성하는 방법을 다루지 않지만 Maven은이 를 수행하는 몇 가지 메커니즘제공 합니다.

5. 문서 추가

Maven 플러그인을 만들 때 다른 사람들이 쉽게 사용할 수 있도록 문서를 생성하는 것이 중요합니다 .

maven-plugin-plugin 을 사용하여이 문서를 생성하는 방법을 간략하게 설명합니다 .

maven-plugin-plugin 은 이미 프로젝트에 포함되어 있지만 최신 버전을 사용하도록 업데이트 할 예정입니다.

또한 maven-site-plugin에 대해서도 동일하게 수행합니다 .

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.6.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.8.2</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

그런 다음 Mojojavadoc추가했는지 확인 하고 플러그인 pom.xml메타 데이터를 추가해야 합니다.

<organization>
    <name>Baeldung</name>
    <url>https://www.baeldung.com/</url>
</organization>

그런 다음 pom.xml 에보고 섹션을 추가해야합니다 .

<reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-plugin-plugin</artifactId>
            <reportSets>
                <reportSet>
                    <reports>
                        <report>report</report>
                    </reports>
                </reportSet>
            </reportSets>
        </plugin>
    </plugins>
</reporting>

마지막으로 maven site 명령으로 문서를 생성합니다.

mvn site

대상 폴더 내에서 모든 HTML 파일이 생성 된 사이트 디렉토리를 찾을 수 있습니다 . 플러그인 - info.html은 플러그인 설명서를 포함하는 하나입니다 :

문서에 추가 할 수있는 더 많은 옵션은 Maven 플러그인 문서 사용방법(예제) 에서 찾을 수 있습니다 .

6. 결론

이 사용방법(예제)에서는 Maven 플러그인을 만드는 방법을 보여주었습니다. 먼저 간단한 플러그인을 구현하여 일반적인 Maven 플러그인 프로젝트 구조를 확인했습니다. 그런 다음 Maven이 플러그인 개발을 돕기 위해 제공하는 몇 가지 도구에 대해 설명했습니다.

더 명확하게하기 위해 간단하게 유지했지만 동시에 더 강력한 플러그인을 만드는 방법에 대한 필요한 정보와 함께 유용한 링크를 제공했습니다.

항상 그렇듯이 예제의 전체 소스 코드는 GitHub에서 사용할 수  있습니다 .