มาเขียน maven plugin ใช้งานเองกันดีกว่าครับ เราใช้ของชาวบ้านมาเยอะล่ะ ^^
ปัญหา
เนื่องจากผมต้องการเครื่องมือที่เอาไว้เข้ารหัส ลดขนาด resource file หรือการทำ obfuscate ผมเลยค้นหาข้อมูลใน google อยู่สักพักนึง แล้วก็ได้ลองใช้ maven plugin ที่คนอื่นๆ เขียนขึนมา ปรากฎว่า มันยังไม่ค่อยตรงตามความต้องการของผมสักเท่าไหร่ (ผมลองใช้ไปประมาณ 5 plugins) ไม่ได้ดั่งใจสักอัน เลยตัดสินใจว่าถ้างั้น เขียน plugin ขึ้นมาใช้งานเองดีกว่า ก็เลยเป็นที่มาของบทความนี้ครับ
สร้าง plugin
1. สร้าง maven project เลือกเป็น Java Application
2. กำหนด artifactId ให้มีรูปแบบเป็น <yourplugin>-maven-plugin เช่น uglifyjs-maven-plugin
3. ที่ pom.xml เปลี่ยน <packaging> จาก jar ไปเป็น maven-plugin
4. เพิ่ม dependencies
... ... ... <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>3.2.3</version> </dependency> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> <version>3.2</version> <type>jar</type> </dependency> .... ... ...5. เพิ่ม plugin
... ... ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> <version>3.3</version> <configuration> <!-- see http://jira.codehaus.org/browse/MNG-5346 --> <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> </configuration> <executions> <execution> <id>mojo-descriptor</id> <goals> <goal>descriptor</goal> </goals> </execution> </executions> </plugin> ... ... ...pom.xml
<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.pamarin.learning</groupId> <artifactId>uglifyjs-maven-plugin</artifactId> <version>1.0-SNAPSHORT</version> <packaging>maven-plugin</packaging> <name>uglifyjs-maven-plugin</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>3.2.3</version> </dependency> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> <version>3.2</version> <type>jar</type> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> <version>3.3</version> <configuration> <!-- see http://jira.codehaus.org/browse/MNG-5346 --> <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> </configuration> <executions> <execution> <id>mojo-descriptor</id> <goals> <goal>descriptor</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>6. เขียน Mojo หรือ java class เพื่อ execute ชุดคำสั่งที่เราต้องการให้ทำ
ExecutorMojo.java
package com.pamarin.learning.mavenplugins; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; /** * @author redcrow */ @Mojo(name = "executor") public class ExecutorMojo extends AbstractMojo { @Parameter(property = "name", defaultValue = "redcrow") private String name; public void execute() throws MojoExecutionException, MojoFailureException { System.out.println("execute plugin " + name); } }7. clean and build project
การเรียกใช้
สำหรับ maven project ที่ต้องการจะใช้ plugin นี้ ให้เรา add plugin เข้าไปใน project (pom.xml) ดังนี้
... ... ... <plugin> <groupId>com.pamarin.learning</groupId> <artifactId>uglifyjs-maven-plugin</artifactId> <version>1.0-SNAPSHORT</version> <executions> <execution> <id>pamarin</id> <phase>compile</phase> <goals> <goal>executor</goal> </goals> <configuration> <name>pamarin</name> </configuration> </execution> </executions> </plugin> ... ... ...
- 1 maven plugin สามาถ execute ได้หลาย mojo ซึ่งก็คือการ config ใน <executions> นั่นเอง
- id แล้วแต่เราจะตั้งครับ
- phase เป็น life cycle ของ plugin ซึ่งประกอบไปด้วย
- compile - เกิดตอน compile java code --> .class
- test - เกิดตอน run unit test เสร็จ
- package - เกิดตอน build project ไปเป็น jar file (.jar)
- install - เกิดตอน install plugin ไปไว้ใน local repository หรือ .m2 ใน home directory ของ user
- deploy -เกิดตอน deploy jar ไปยัง remote repository
- gold คือชื่อใน @Mojo ที่เราตั้งไว้ @Mojo(name = "goal_name") ว่าจะให้ run mojo ตัวไหน
- configuration ก็จะเป็นพวก parameter ที่ส่งเข้าไปใน mojo ครับ ซึ่งในที่นี้คือ <name>
เมื่อเราทำการ clean and build project ที่เรียกใช้งาน plugin
method execute ก็จะถูกเรียกตาม phase ที่เราได้กำหนดไว้
ศึกษาเพิ่มเติมได้ที่ http://maven.apache.org/guides/plugin/guide-java-plugin-development.html
ไม่มีความคิดเห็น:
แสดงความคิดเห็น