1.1 รายการปลั๊กอินที่จะสร้างใน Maven

ชุดประกอบใน Maven สามารถกำหนดค่าได้อย่างยืดหยุ่นมาก นักพัฒนา Maven ได้สร้างปลั๊กอินพิเศษมากมาย ซึ่งคุณสามารถกำหนดค่าบิลด์ต่างๆ ได้อย่างยืดหยุ่น ความนิยมสูงสุดของพวกเขาแสดงไว้ในตารางด้านล่าง:

เสียบเข้าไป คำอธิบาย
1 ปลั๊กอินคอมไพเลอร์ Maven จัดการการคอมไพล์ Java
2 ปลั๊กอิน maven-resources ควบคุมการรวมทรัพยากรในแอสเซมบลี
3 ปลั๊กอินซอร์ส Maven ควบคุมว่าซอร์สโค้ดจะรวมอยู่ในแอสเซมบลีหรือไม่
4 maven-dependency-plugin ควบคุมกระบวนการคัดลอกไลบรารีอ้างอิง
5 ปลั๊กอิน maven-jar ปลั๊กอินสำหรับสร้างไฟล์ jar สุดท้าย
6 ปลั๊กอินสงคราม Maven ปลั๊กอินสำหรับสร้างไฟล์สงครามครั้งสุดท้าย
7 ปลั๊กอิน maven-surefire จัดการการทดสอบการทำงาน
8 buildnumber-maven-ปลั๊กอิน สร้างหมายเลขบิลด์

ปลั๊กอินแต่ละตัวมีความน่าสนใจในแบบของตัวเอง แต่เราจะต้องวิเคราะห์ทั้งหมด เริ่มจากสิ่งสำคัญ - ปลั๊กอินการจัดการการรวบรวม

1.2 ปลั๊กอินการคอมไพล์ maven-compiler-plugin

ปลั๊กอินยอดนิยมที่ให้คุณควบคุมเวอร์ชันของคอมไพเลอร์และใช้ในเกือบทุกโครงการคือmaven-compiler-plugin. มีการตั้งค่าเริ่มต้น แต่ในเกือบทุกโครงการจำเป็นต้องตั้งค่าใหม่อีกครั้ง

ในเวอร์ชันที่ง่ายที่สุดในปลั๊กอินคุณต้องระบุเวอร์ชันของซอร์สโค้ด Java และเวอร์ชันของเครื่อง Java ที่ใช้ประกอบ:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <source>1.11</source>
        <target>1.13</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

ในตัวอย่างด้านบน เราตั้งค่าตัวเลือกคอมไพเลอร์ Java สามตัวเลือก: sourceและtargetencoding

พารามิเตอร์sourceอนุญาตให้เราตั้งค่าเวอร์ชัน Java สำหรับแหล่งที่มาของเรา พารามิเตอร์targetคือเวอร์ชันของเครื่อง Java ที่คุณต้องการคอมไพล์คลาส หากไม่ได้ระบุโค้ดหรือเวอร์ชันเครื่อง Java ค่าดีฟอลต์คือ 1.3

สุดท้าย พารามิเตอร์encodingอนุญาตให้คุณระบุการเข้ารหัสของไฟล์ Java เราUTF-8ระบุ ตอนนี้แหล่งที่มาเกือบทั้งหมดถูกเก็บไว้ในUTF-8. แต่ถ้าไม่ได้ระบุพารามิเตอร์นี้ ระบบจะเลือกการเข้ารหัสปัจจุบันของระบบปฏิบัติการ สำหรับ Windows นี่คือการเข้ารหัสWindows-1251.

นอกจากนี้ยังมีบางกรณีที่คอมพิวเตอร์รุ่นติดตั้ง Java หลายรุ่น: เพื่อสร้างโมดูลและ/หรือโครงการที่แตกต่างกัน ในกรณีนี้JAVA_HOMEตัวแปรสามารถระบุเส้นทางไปยังเส้นทางใดเส้นทางหนึ่งเท่านั้น

นอกจากนี้ยังมีการใช้งานเครื่อง Java ที่แตกต่างกัน: OpenJDK, OracleJDK, Amazon JDK และยิ่งโครงการมีขนาดใหญ่เท่าใด โครงสร้างก็ยิ่งซับซ้อนมากขึ้นเท่านั้น แต่คุณสามารถกำหนดพาธไปยังคอมไพเลอร์ javac สำหรับปลั๊กอินได้อย่างชัดเจนโดยใช้แท็ก . มันถูกเพิ่มเข้ามาเพื่อโอกาสนี้โดยเฉพาะ

ปลั๊กอินmaven-compiler-pluginมีสองเป้าหมาย:

  • compiler:compile– การรวบรวมแหล่งที่มา โดยค่าเริ่มต้นจะเชื่อมโยงกับเฟสการคอมไพล์
  • compiler:testCompile– การรวบรวมการทดสอบ โดยค่าเริ่มต้นจะเชื่อมโยงกับเฟสการทดสอบการคอมไพล์

คุณยังสามารถระบุรายการอาร์กิวเมนต์ที่จะส่งผ่านไปยังคอมไพเลอร์ javac ในบรรทัดรับคำสั่ง:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <compilerArgs>
            <arg>-verbose</arg>
            <arg>-Xlint:all,-options,-path<arg>
        </compilerArgs>
    </configuration>
</plugin>

1.3 ปลั๊กอินสำหรับสร้างไฟล์ jar maven-jar-plugin

หากคุณต้องการสร้างไลบรารี่ jar ของคุณเองด้วย Maven คุณจะต้องใช้ปลั๊กอิน maven-jar ปลั๊กอินนี้ทำสิ่งที่มีประโยชน์มากมาย

ตัวอย่างของปลั๊กอินดังกล่าว:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <includes>
            <include>**/properties/*</include>
        </includes>
        <archive>
           <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
        </archive>
    </configuration>
</plugin>

ขั้นแรก สามารถใช้เพื่อระบุว่าไฟล์ใดจะเข้าไลบรารีและไฟล์ใดจะไม่เข้า เมื่อใช้แท็กใน<include>ส่วน<includes>คุณสามารถระบุรายการไดเร็กทอรีที่ต้องการเพิ่มเนื้อหาลงในไลบรารี

ประการที่สอง แต่ละ jar ต้องมีรายการ ( ไฟล์ MANIFEST.MF ) ปลั๊กอินจะวางไว้ในตำแหน่งที่ถูกต้องในไลบรารีคุณเพียงแค่ต้องระบุเส้นทางที่จะใช้ แท็กใช้สำหรับสิ่ง<manifestFile>นี้

สุดท้าย ปลั๊กอินสามารถสร้างรายการด้วยตัวเอง ในการดำเนินการนี้ แทนที่จะใช้แท็ก<manifestFile>คุณต้องเพิ่มแท็ก<manifest>และระบุข้อมูลสำหรับรายการในอนาคตในนั้น ตัวอย่าง:

<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.codegym.MainApplication</mainClass>
        </manifest>
    </archive>
</configuration>

แท็ก<addClasspath>ระบุว่าจะเพิ่มในรายการหรือCLASSPATHไม่

แท็ก<classpathPrefix>อนุญาตให้คุณเพิ่มคำนำหน้า (ในตัวอย่าง lib) ก่อนทรัพยากรแต่ละรายการ การระบุคำนำหน้าใน<classpathPrefix>ทำให้คุณสามารถวางการอ้างอิงในโฟลเดอร์แยกต่างหากได้

ได้ คุณสามารถวางไลบรารีไว้ในไลบรารีอื่นได้ และมีความประหลาดใจมากมายรอคุณอยู่เมื่อคุณต้องการส่งพาธไปยังไฟล์คุณสมบัติซึ่งอยู่ในไลบรารี jar ซึ่งอยู่ในไลบรารี jar

สุดท้าย แท็ก<mainClass>ชี้ไปที่คลาสปฏิบัติการหลัก “ คลาสปฏิบัติการหลักคืออะไร? ", - คุณถาม. และสิ่งที่สำคัญคือเครื่อง Java สามารถเรียกใช้โปรแกรมที่ระบุได้ไม่เพียง แต่โดยคลาส Java เท่านั้น แต่ยังรวมถึงไฟล์ jar ด้วย และในกรณีนี้จำเป็นต้องมีคลาสเริ่มต้นหลัก

1.4 ปลั๊กอินสร้างหมายเลข buildnumber-maven-plugin

บ่อยครั้ง ไลบรารี่ของ jar และไฟล์ war จะมีข้อมูลชื่อโปรเจ็กต์และเวอร์ชัน รวมถึงเวอร์ชันของแอสเซมบลี วิธีนี้ไม่เพียงแต่มีประโยชน์สำหรับการจัดการการขึ้นต่อกันเท่านั้น แต่ยังทำให้การทดสอบง่ายขึ้นอีกด้วย: เป็นที่ชัดเจนในเวอร์ชันของไลบรารีที่มีการแก้ไขข้อผิดพลาดและเพิ่มข้อผิดพลาดนั้น

บ่อยครั้งที่งานนี้ได้รับการแก้ไขเช่นนี้ - พวกเขาสร้างไฟล์พิเศษapplication.propertiesที่มีข้อมูลที่จำเป็นทั้งหมดและรวมไว้ในชุดประกอบ คุณยังสามารถกำหนดค่าสคริปต์บิลด์เพื่อให้ข้อมูลจากไฟล์นี้ย้ายไปยังMANIFEST.MFฯลฯ

แต่สิ่งที่น่าสนใจที่สุดคือ Maven มีปลั๊กอินพิเศษที่สามารถสร้างไฟล์ application.properties ได้ ในการทำเช่นนี้คุณต้องสร้างไฟล์ดังกล่าวและเติมด้วยเทมเพลตข้อมูลพิเศษ ตัวอย่าง:

# application.properties
app.name=${pom.name}
app.version=${pom.version}
app.build=${buildNumber}

ค่าของพารามิเตอร์ทั้งสามจะถูกแทนที่ในขั้นตอนการสร้าง

พารามิเตอร์pom.nameและpom.versionจะนำมาโดยตรงpom.xmlจาก และเพื่อสร้างหมายเลขบิลด์เฉพาะใน Maven มีปลั๊กอินพิเศษbuildnumber-maven-plugin- ดูตัวอย่างด้านล่าง:

<packaging>war</packaging>
<version>1.0</version>
<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.2</version>
        <executions>
            <execution>
                <phase>validate</phase>
                <goals>
                    <goal>create</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <revisionOnScmFailure>true</revisionOnScmFailure>
            <format>{0}-{1,date,yyyyMMdd}</format>
            <items>
                 <item>${project.version}</item>
                 <item>timestamp</item>
            </items>
        </configuration>
    </plugin>
</plugins>

ในตัวอย่างข้างต้น มีสามสิ่งที่สำคัญเกิดขึ้น ขั้นแรกให้ระบุปลั๊กอินสำหรับการตั้งค่าเวอร์ชันแอสเซมบลี ประการที่สอง มีการระบุว่าจะทำงานในช่วงตรวจสอบความถูกต้อง (เฟสแรกสุด)และสร้างหมายเลขบิลด์${buildNumber}-

และประการที่สามจะมีการระบุรูปแบบของหมายเลขแอสเซมบลีนี้ซึ่งติดกาวเข้าด้วยกันจากหลายส่วน . นี่คือเวอร์ชันของโครงการproject.versionและเวลาปัจจุบันที่กำหนดโดยเทมเพลต รูปแบบเทมเพลตระบุโดยคลาสMessageFormatJava