หน้าเว็บ

วันพุธที่ 17 กันยายน พ.ศ. 2557

การสร้าง maven plugin ขึ้นมาใช้งานเอง

        มาเขียน 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

ไม่มีความคิดเห็น:

แสดงความคิดเห็น