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.xml 의 pluginGroups 에 groupId 를 추가 해야 합니다 .
<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>
그런 다음 Mojo 에 javadoc 을 추가했는지 확인 하고 플러그인 의 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이 플러그인 개발을 돕기 위해 제공하는 몇 가지 도구에 대해 설명했습니다.
더 명확하게하기 위해 간단하게 유지했지만 동시에 더 강력한 플러그인을 만드는 방법에 대한 필요한 정보와 함께 유용한 링크를 제공했습니다.