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機能を使用しました。

コードとすべてのサンプルはいつものように見つけることができます。