覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Lombok - delombok

Lombokを利用すると各種アノテーションを付与するだけでJavaのお決まりのコード(ボイラープレートコード)を削減することができます。

Lombokを使用している場合に、実際に生成されるコードを確認したい場合などがあります。 そのような際にはdelombokの機能を利用して、実際にビルド時に生成されるコードを出力することが可能です。

以下ではdelombokをコマンドラインで実行する方法とMavenと連携する方法について記載します。

本エントリでは、以下のクラス定義が行われた User.java が存在しているものとして実行例を記載しています。

package sample.web.app;

import lombok.Value;

@Value
public class User {
    private String name;
    private int age;
}


コマンドラインで実行する

delombokをコマンドラインで実行する場合は、lombok.jarのみ必要となります。
基本的にLombokのアノテーションを利用した開発を行っている場合はlombok.jarは手元にあるはずなので特別な用意無しで実行できます。

コマンドラインで実行する場合は、delombok対象のディレクトリを指定するパターンと、ソースコードを1つ指定するパターンに大別されます。


ディレクトリ指定の場合

以下のコマンドを実行することで、対象ディレクトリ内のjavaプログラムにdelombokが実行され、出力先ディレクトリに実行結果のファイルが出力されます。

java -jar lombok.jar delombok -f pretty {delombok対象のディレクトリのパス} -d {出力先のディレクトリのパス}


■実行例

java -jar lombok.jar delombok -f pretty src -d delombok-src

■出力結果

delombok-srcディレクトリ内にdelombokを行ったUser.javaが出力されます。
User.javaは以下の内容になっています。

package sample.web.app;

public final class User {
    private final String name;
    private final int age;

    @java.beans.ConstructorProperties({"name", "age"})
    public User(final String name, final int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    @Override
    public boolean equals(final Object o) {
        if (o == this) return true;
        if (!(o instanceof User)) return false;
        final User other = (User) o;
        final Object this$name = this.getName();
        final Object other$name = other.getName();
        if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;
        if (this.getAge() != other.getAge()) return false;
        return true;
    }

    @Override
    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        final Object $name = this.getName();
        result = result * PRIME + ($name == null ? 43 : $name.hashCode());
        result = result * PRIME + this.getAge();
        return result;
    }

    @Override
    public String toString() {
        return "User(name=" + this.getName() + ", age=" + this.getAge() + ")";
    }
}


ソースコード指定の場合

以下コマンドを実行することで対象のjavaプログラムに対するdelombokの結果がコンソールに出力されます

java -jar lombok.jar delombok -p {delombok対象のjavaファイル}


■実行例

java -jar lombok.jar delombok -f pretty -p User.java

■実行結果(コンソールへの出力結果)

package sample.web.app;

public final class User {
    private final String name;
    private final int age;

    @java.beans.ConstructorProperties({"name", "age"})
    public User(final String name, final int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    @Override
    public boolean equals(final Object o) {
        if (o == this) return true;
        if (!(o instanceof User)) return false;
        final User other = (User) o;
        final Object this$name = this.getName();
        final Object other$name = other.getName();
        if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;
        if (this.getAge() != other.getAge()) return false;
        return true;
    }

    @Override
    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        final Object $name = this.getName();
        result = result * PRIME + ($name == null ? 43 : $name.hashCode());
        result = result * PRIME + this.getAge();
        return result;
    }

    @Override
    public String toString() {
        return "User(name=" + this.getName() + ", age=" + this.getAge() + ")";
    }
}


Mavenで利用する

delomokをMavenと連動して実行するにはMaven Lombok Pluginを利用します。
Plugin利用のため、pom.xmlに以下を追記します

<build>
    <sourceDirectory>target/generated-sources/delombok</sourceDirectory>
    <plugins>
        <plugin>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.16.10.0</version>
            <executions>
                <execution>
                    <id>delombok</id>
                    <phase>generate-sources</phase>
                    <goals>
                         <goal>delombok</goal>
                    </goals>
                    <configuration>
                        <addOutputDirectory>false</addOutputDirectory>
                        <sourceDirectory>src/main/java</sourceDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>


delombokの処理を行うには、Mavenでのビルド(mvn compileやmvn install等)を実行します。
(実行時のコンソール出力結果例です)

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building demo 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- lombok-maven-plugin:1.16.10.0:delombok (delombok) @ web-app ---
[INFO] Delombok complete.
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ web-app ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ web-app ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to C:\Users\yukiv\IdeaProjects\demo-app\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.814s
[INFO] Finished at: Sun Nov 13 19:49:26 JST 2016
[INFO] Final Memory: 30M/227M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0


実行後以下の通りtargetディレクトリ配下にgenerate-sources/delombokディレクトリが生成されて、そこにdelombokの処理が行われたソースコードが出力されます。

f:id:nini_y:20161113202537p:plain



関連エントリ