Mavenポリグロット
1概要
Maven Polyglot
は、POMモデルを任意の言語で記述できるようにするMavenコア拡張機能のセットです。これには、XML以外の多くのスクリプトとマークアップ言語が含まれます。
-
Maven polyglotの主な目的は、XMLがもはやゴーゴー言語ではなくなったため、XMLから逃れることです。
このチュートリアルでは、まずMavenのコア拡張の概念とMaven Polyglotプロジェクトを理解することから始めます。
それでは、POMモデルを有名な__pom.xmlではなくJSONファイルから構築できるようにするMavenのコア拡張を作成する方法を説明します。
2 Mavenコアエクステンションローディングメカニズム
-
Mavenコアエクステンションは、Mavenの初期化時およびMavenプロジェクトのビルド開始前にロードされたプラグインです。これらのプラグインは、コアを変更せずにMavenの動作を変更することを可能にします。
たとえば、起動時にロードされたプラグインはMavenのデフォルトの動作をオーバーライドし、
pom.xml
以外のファイルからPOMモデルを読み取ることができます。
技術的には、** Mavenコアエクステンションは
extensions.xml
ファイルで宣言されたMaven成果物です。
${projectDirectory}/.mvn/extensions.xml
これが拡張機能の例です。
<?xml version="1.0" encoding="UTF-8"?>
<extensions>
<extension>
<groupId>com.baeldung.maven.polyglot</groupId>
<artifactId>maven-polyglot-json-extension</artifactId>
<version>1.0-SNAPSHOT</version>
</extension>
</extensions>
最後に、このメカニズムにはMaven 3.3.1以降が必要であることに注意する必要があります。
3メイヴンポリグロット
-
Maven Polyglotはコアエクステンションのコレクションです** これらのそれぞれがスクリプトまたはマークアップ言語からPOMモデルを読むことを担当します。
Maven Polyglotは、以下の言語用の拡張機能を提供します。
+-----------+-------------------+--------------------------------------+
| Language | Artifact Id | Accepted POM files |
+-----------+-------------------+--------------------------------------+
| Atom | polyglot-atom | pom.atom |
| Clojure | polyglot-clojure | pom.clj |
| Groovy | polyglot-groovy | pom.groovy, pom.gy |
| Java | polyglot-java | pom.java |
| Kotlin | polyglot-kotlin | pom.kts |
| Ruby | polyglot-ruby | pom.rb, Mavenfile, Jarfile, Gemfile |
| Scala | polyglot-scala | pom.scala |
| XML | polyglot-xml | pom.xml |
| YAML | polyglot-yaml | pom.yaml, pom.yml |
+-----------+-------------------+--------------------------------------+
次のセクションでは、最初に、上記のサポートされている言語の1つを使用してMavenプロジェクトを構築する方法について説明します。
次に、JSONベースのPOMをサポートするための拡張機能を書きます。
4 Maven Polyglot Extension
を使う
XMLとは異なる言語に基づいてMavenプロジェクトを構築する1つの選択肢は、Polyglotプロジェクトによって提供される成果物の1つを使用することです。
この例では、**
pom.yaml
設定ファイルを使ってMavenプロジェクトを作成します。
最初のステップは、Mavenのコア拡張ファイルを作成することです。
${projectDirectory}/.mvn/extensions.xml
次に、以下の内容を追加します。
<?xml version="1.0" encoding="UTF-8"?>
<extensions>
<extension>
<groupId>io.takari.polyglot</groupId>
<artifactId>polyglot-yaml</artifactId>
<version>0.3.1</version>
</extension>
</extensions>
上記の言語に従って
artifactId
を選択した言語に合わせて調整し、https://search.maven.org/search?q=io.takari.polyglot[new version]が利用可能かどうかを確認してください。
最後のステップは、プロジェクトのメタデータを
YAML
ファイルに提供することです。
modelVersion: 4.0.0
groupId: com.baeldung.maven.polyglot
artifactId: maven-polyglot-yml-app
version: 1.0-SNAPSHOT
name: 'YAML Demo'
properties: {maven.compiler.source: 1.8, maven.compiler.target: 1.8}
これで、通常どおりビルドを実行できます。たとえば、次のコマンドを呼び出すことができます。
mvn clean install
5ポリグロット翻訳プラグインの使用
サポートされている言語の1つに基づいてプロジェクトを取得するもう1つの選択肢は、
https://search.maven.org/search?q
= a:polyglot-translate-plugin[polyglot-translate-plugin].
を使用することです。
これは、伝統的な__pom.xmlを使って既存のMavenプロジェクトから始めることができることを意味します。
それから、
私たちは翻訳プラグインを使って
既存の
pom.xml
プロジェクトを希望するポリグロットに変換することができます。
mvn io.takari.polyglot:polyglot-translate-plugin:translate -Dinput=pom.xml -Doutput=pom.yml
6. カスタム拡張機能を書く
JSONはMaven Polyglotプロジェクトによって提供される言語の1つではないので、
JSONファイルからプロジェクトメタデータを読み取ることを可能にする単純な拡張子を実装します
。
私たちの拡張はMavenのデフォルト実装をオーバーライドするMaven
ModelProcessor
APIのカスタム実装を提供します。
これを実現するには、POMファイルの検索方法およびメタデータの読み取り方法とMaven
Model
APIへの変換方法の動作を変更します。
6.1. Mavenの依存関係
次の依存関係を持つMavenプロジェクトを作成することから始めます。
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.5.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
ここでは、コアエクステンションを実装するため、https://search.maven.org/search?q=g:org.apache.maven%20AND%20a:maven-core[maven-core]依存関係を使用します。
Jackson
依存関係は、JSONファイルを逆シリアル化するために使用されます。
そしてMavenがPlexus Dependency Injectionコンテナを使用しているので、
私たちの実装がPlexusコンポーネントであることが必要です
。したがって、Plexusメタデータを生成するためにこのプラグインが必要です。
<plugin>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-metadata</artifactId>
<version>1.7.1</version>
<executions>
<execution>
<goals>
<goal>generate-metadata</goal>
</goals>
</execution>
</executions>
</plugin>
6.2. カスタム
ModelProcessor
実装
Mavenは
ModelBuilder.build()
メソッドを呼び出すことによってPOMモデルを構築します。このメソッドは
ModelProcessor.read()
メソッドに委譲します。
Mavenは
DefaultModelProcessor
実装を提供しています。これはデフォルトでルートディレクトリにあるか、またはパラメータコマンドとして指定された
pom.xml
ファイルからPOMモデルを読み込みます。
-
その結果、デフォルトの動作をオーバーライドするカスタム
ModelProcessor
実装を提供します。これがPOMモデルファイルの場所と読み方です。**
それでは、
CustomModelProcessor
実装を作成し、それをPlexusコンポーネントとしてマークすることから始めましょう:
@Component(role = ModelProcessor.class)
public class CustomModelProcessor implements ModelProcessor {
@Override
public File locatePom(File projectDirectory) {
return null;
}
@Override
public Model read(
InputStream input,
Map<String, ?> options) throws IOException, ModelParseException {
return null;
}
//...
}
-
@ Component
アノテーションは、実装がDIコンテナ(Plexus)によるインジェクションのために利用可能になるようにします。
次に、**
locatePom()
メソッドの実装を提供します。
このメソッドは、Mavenがプロジェクトのメタデータを読み取るファイルを返します。
そのため、
pom.json
ファイルが存在する場合はそれを返します。それ以外の場合は、通常は
pom.xml
を返します。
@Override
public File locatePom(File projectDirectory) {
File pomFile = new File(projectDirectory, "pom.json");
if (!pomFile.exists()) {
pomFile = new File(projectDirectory, "pom.xml");
}
return pomFile;
}
次のステップは、このファイルを読み、それをMavenモデルに変換することです。これはread()メソッドによって実現されます。
@Requirement
private ModelReader modelReader;
@Override
public Model read(InputStream input, Map<String, ?> options)
throws IOException, ModelParseException {
FileModelSource source = getFileFromOptions(options);
try (InputStream is = input) {
//JSON FILE ==> Jackson
if (isJsonFile(source)) {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(input, Model.class);
} else {
//XML FILE ==> DefaultModelReader
return modelReader.read(input, options);
}
}
return model;
}
この例では、ファイルがJSONファイルであるかどうかを確認し、Jacksonを使用してそれをMaven
Model.
に逆シリアル化します。それ以外の場合は、通常のXMLファイルであり、Maven __DefaultModelReaderによって読み込まれます。
拡張機能を構築する必要があります。これで使用できるようになります。
mvn clean install
6.3. 拡張機能を使う
拡張機能の使い方を示すために、Spring Boot Webプロジェクトを使います。
まず、Mavenプロジェクトを作成し、__pom.xmlを削除します。
次に、上で実装した拡張機能を__ $ \ {projectDirectory}/。mvn/extensions.xmlに追加します。
<?xml version="1.0" encoding="UTF-8"?>
<extensions>
<extension>
<groupId>com.baeldung.maven.polyglot</groupId>
<artifactId>maven-polyglot-json-extension</artifactId>
<version>1.0-SNAPSHOT</version>
</extension>
</extensions>
そして最後に、次の内容で
pom.json
を作成します。
{
"modelVersion": "4.0.0",
"groupId": "com.baeldung.maven.polyglot",
"artifactId": "maven-polyglot-json-app",
"version": "1.0.1",
"name": "Json Maven Polyglot",
"parent": {
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-starter-parent",
"version": "2.0.5.RELEASE",
"relativePath": null
},
"properties": {
"project.build.sourceEncoding": "UTF-8",
"project.reporting.outputEncoding": "UTF-8",
"maven.compiler.source": "1.8",
"maven.compiler.target": "1.8",
"java.version": "1.8"
},
"dependencies":[ {
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-starter-web"
}
],
"build": {
"plugins":[ {
"groupId": "org.springframework.boot",
"artifactId": "spring-boot-maven-plugin"
}
] }
}
次のコマンドでプロジェクトを実行できます。
mvn spring-boot:run
7. 結論
この記事では、Maven Polyglotプロジェクトを通じてデフォルトのMavenの動作を変更する方法を説明しました。この目標を達成するために、コアコンポーネントのロードを簡素化する新しいMaven 3.3.1機能を使用しました。
コードとすべてのサンプルはいつものように見つけることができます。