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の処理が行われたソースコードが出力されます。