1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MavenのPOMをXMLを使わずに記述する

Last updated at Posted at 2019-11-26

JJUG CCC 2019 fallの発表資料に目を通している中で、Mavenのpom.xmlをXMLを使わずに記述できるという発表があったので、サンプルコードを用意して実際に触ってみたいと思います。元の発表はこちらを参照してください。

polyglot-maven

XMLを使わずにPOMを設定するためにpolyglot-mavenというMavenのextensionを利用していきます。Maven3.3.1以上をサポートしています。
polyglot-mavenは、POMをXMLの他にも、Java, Kotlin, Clojure, Ruby, Groovy, Scala, Atom, YAMLで記述することができます。
今回はPOMをYAMLで記述するケースを紹介しますが、各文法で記述されたサンプルコードが公開されているので、他の文法が気になる方は参照してください。

やってみる

サンプルコード

今回は、サンプルコードとして以下のpom.xmlをpolyglot-mavenを使ってpom.yamlに変換していきたいと思います。
https://github.com/dais39/sample-polyglot-maven

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.dais39</groupId>
    <artifactId>sample-poliglot-maven</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>

extensions.xmlを作成

プロジェクトルートに.mvnディレクトリを作成して、その配下にextensions.xmlを作成します。

$ mkdir .mvn
$ vim .mvn/extensions.xml

extensions.xmlのartifactIdには変換したい文法に応じたartifactIdを設定します。今回はYAMLに変換したいため、polyglot-yamlを設定します。他の文法についてはこちらを参照ください。

extensions.xml
<?xml version="1.0" encoding="UTF-8"?>
<extensions>
    <extension>
        <groupId>io.takari.polyglot</groupId>
        <artifactId>polyglot-yaml</artifactId>
        <version>0.4.4</version>
    </extension>
</extensions>

pom.xmlを変換

プロジェクトルートで以下のコマンドを実行すると、pom.yamlが自動で生成されます。
-Doutput=pom.yamlは変換先の文法に合わせた拡張子を各自設定するようにしてください。

$ mvn io.takari.polyglot:polyglot-translate-plugin:translate -Dinput=pom.xml -Doutput=pom.yaml
pom.yaml
modelEncoding: UTF-8
modelVersion: 4.0.0
groupId: com.dais39
artifactId: sample-poliglot-maven
version: 1.0-SNAPSHOT
packaging: jar

properties: {project.build.sourceEncoding: UTF-8}

以下のように-Dinput-Doutputの値を逆に設定すれば、pom.yamlからpom.xmlに戻すこともできます。

$ mvn io.takari.polyglot:polyglot-translate-plugin:translate -Dinput=pom.yaml -Doutput=pom.xml

動作確認

pom.yamlを指定してmvnコマンドを実行すると、問題なくbuildが完了することを確認できます。

-> % mvn package -f pom.yaml

// 省略 

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.796 s
[INFO] Finished at: 2019-11-26T10:08:50+09:00
[INFO] ------------------------------------------------------------------------

参考

おまけ

Ruby

pom.rb
project 'sample-poliglot-maven' do

  model_version '4.0.0'
  id 'com.dais39:sample-poliglot-maven:1.0-SNAPSHOT'
  packaging 'jar'

  properties( 'project.build.sourceEncoding' => 'UTF-8' )

end

Java

pom.java
public class pom extends org.sonatype.maven.polyglot.java.dsl.ModelFactory {
    public void project() {
        modelVersion = "4.0.0";
        groupId = "com.dais39";
        artifactId = "sample-poliglot-maven";
        packaging = "jar";
        version = "1.0-SNAPSHOT";
        properties(
            property("project.build.sourceEncoding", "UTF-8")
        );
    }
}

Kotlin

pom.kts
project("com.dais39:sample-poliglot-maven:1.0-SNAPSHOT:jar") {

    properties {
        "project.build.sourceEncoding" to "UTF-8"
    }
}
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?