1.1 Danh sách các plugin để xây dựng trong Maven

Việc lắp ráp trong Maven có thể được cấu hình rất linh hoạt. Các nhà phát triển Maven đã đặc biệt tạo ra hàng chục plugin mà bạn có thể định cấu hình các bản dựng khác nhau một cách linh hoạt bằng cách sử dụng chúng. Phổ biến nhất trong số họ được hiển thị trong bảng dưới đây:

cắm vào Sự miêu tả
1 maven-trình biên dịch-plugin Quản lý biên dịch Java
2 maven-resource-plugin Kiểm soát việc bao gồm các tài nguyên trong một assembly
3 plugin nguồn maven Kiểm soát xem mã nguồn có được bao gồm trong một hợp ngữ hay không
4 maven-phụ thuộc-plugin Kiểm soát quá trình sao chép các thư viện phụ thuộc
5 maven-jar-plugin Plugin để tạo tệp jar cuối cùng
6 plugin chiến tranh maven Plugin để tạo tập tin chiến tranh cuối cùng
7 maven-surefire-plugin Quản lý chạy thử nghiệm
số 8 buildnumber-maven-plugin Tạo số bản dựng

Mỗi plugin đều thú vị theo cách riêng của nó, nhưng chúng tôi sẽ phải phân tích tất cả chúng. Hãy bắt đầu với điều chính - plugin quản lý biên dịch.

1.2 Trình biên dịch plugin maven-trình biên dịch-plugin

Plugin phổ biến nhất cho phép bạn kiểm soát phiên bản của trình biên dịch và được sử dụng trong hầu hết các dự án là plugin maven-compiler-plugin. Nó có các cài đặt mặc định, nhưng trong hầu hết mọi dự án, chúng cần được đặt lại.

Trong phiên bản đơn giản nhất, trong phần bổ trợ, bạn cần chỉ định phiên bản của mã nguồn Java và phiên bản của máy Java mà quá trình lắp ráp được thực hiện:

<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>

Trong ví dụ trên, chúng tôi đặt ba tùy chọn trình biên dịch Java: source, targetencoding.

Tham số sourcecho phép chúng tôi đặt phiên bản Java cho các nguồn của chúng tôi. Tham số targetlà phiên bản của máy Java mà bạn muốn biên dịch các lớp. Nếu không có mã hoặc phiên bản máy Java nào được chỉ định, thì mặc định là 1.3

Cuối cùng, tham số encodingcho phép bạn chỉ định mã hóa các tệp Java. Chúng tôi chỉ định UTF-8. Bây giờ hầu hết tất cả các nguồn đều được lưu trữ ở định dạng UTF-8. Nhưng nếu tham số này không được chỉ định, thì mã hóa hiện tại của hệ điều hành sẽ được chọn. Đối với Windows, đây là mã hóa Windows-1251.

Cũng có những trường hợp khi máy tính xây dựng được cài đặt nhiều phiên bản Java: để xây dựng các mô-đun khác nhau và/hoặc các dự án khác nhau. Trong trường hợp này, JAVA_HOMEchỉ có thể chỉ định đường dẫn đến một trong số chúng trong biến.

Ngoài ra, có các triển khai khác nhau của máy Java: OpenJDK, OracleJDK, Amazon JDK. Và dự án càng lớn thì cấu trúc của nó càng phức tạp. Nhưng bạn có thể đặt rõ ràng đường dẫn đến trình biên dịch javac cho plugin bằng cách sử dụng thẻ . Nó đã được thêm vào đặc biệt cho dịp này.

Plugin maven-compiler-plugincó hai mục tiêu:

  • compiler:compile– biên dịch các nguồn, theo mặc định được liên kết với giai đoạn biên dịch
  • compiler:testCompile– biên dịch các bài kiểm tra, theo mặc định, nó được liên kết với giai đoạn biên dịch bài kiểm tra.

Bạn cũng có thể chỉ định một danh sách các đối số sẽ được chuyển đến trình biên dịch javac trên dòng lệnh:

<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 Plugin tạo file jar maven-jar-plugin

Nếu bạn muốn xây dựng thư viện jar của riêng mình với Maven, bạn sẽ cần maven-jar-plugin. Plugin này làm rất nhiều điều hữu ích.

Một ví dụ về một plugin như vậy:

<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>

Đầu tiên, nó có thể được sử dụng để chỉ định tệp nào sẽ được đưa vào thư viện và tệp nào sẽ không. Sử dụng các thẻ <include>trong phần, <includes>bạn có thể chỉ định danh sách các thư mục có nội dung cần thêm vào thư viện .

Thứ hai, mỗi jar phải có một tệp kê khai ( tệp MANIFEST.MF ). Bản thân plugin sẽ đặt nó vào đúng vị trí trong thư viện, bạn chỉ cần chỉ định đường dẫn sẽ đi. Thẻ được sử dụng cho việc này <manifestFile>.

Cuối cùng, plugin có thể tự tạo một bảng kê khai. Để làm điều này, thay vì thẻ, <manifestFile>bạn cần thêm thẻ <manifest>và chỉ định dữ liệu cho tệp kê khai trong tương lai trong đó. Ví dụ:

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

Thẻ <addClasspath>chỉ định có thêm vào tệp kê khai hay không CLASSPATH.

Thẻ <classpathPrefix>cho phép bạn thêm tiền tố (trong ví dụ lib) trước mỗi tài nguyên. Chỉ định tiền tố trong <classpathPrefix>cho phép bạn đặt các phần phụ thuộc vào một thư mục riêng.

Có, bạn có thể đặt thư viện bên trong thư viện khác. Và còn rất nhiều bất ngờ đang chờ bạn khi bạn cần chuyển đường dẫn đến file thuộc tính ở đâu đó, cái này nằm trong thư viện jar, cái này nằm trong thư viện jar.

Cuối cùng, thẻ trỏ <mainClass>đến lớp thực thi chính. “ Lớp thực thi chính là gì? ", - bạn hỏi. Và vấn đề là máy Java có thể chạy một chương trình không chỉ được chỉ định bởi lớp Java mà còn bởi tệp jar. Và đối với trường hợp này, lớp bắt đầu chính là cần thiết.

1.4 Xây dựng plugin tạo số buildnumber-maven-plugin

Thông thường, các thư viện jar và tệp chiến tranh bao gồm thông tin về tên của dự án và phiên bản của nó, cũng như phiên bản của hợp ngữ. Điều này không chỉ hữu ích cho việc quản lý các phụ thuộc mà còn đơn giản hóa việc kiểm tra: rõ ràng lỗi được sửa trong phiên bản nào của thư viện và phiên bản nào được thêm vào.

Thông thường, nhiệm vụ này được giải quyết như thế này - họ tạo một tệp đặc biệt application.propertieschứa tất cả thông tin cần thiết và đưa nó vào tập hợp. Bạn cũng có thể định cấu hình tập lệnh xây dựng để dữ liệu từ tệp này di chuyển sang tệp, MANIFEST.MFv.v.

Nhưng điều thú vị nhất là Maven có một plugin đặc biệt có thể tạo tệp application.properties như vậy. Để làm điều này, bạn cần tạo một tệp như vậy và điền vào đó các mẫu dữ liệu đặc biệt. Ví dụ:

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

Các giá trị của cả ba tham số sẽ được thay thế ở giai đoạn xây dựng.

Tham số pom.namepom.versionsẽ được lấy trực tiếp từ pom.xml. Và để tạo số bản dựng duy nhất trong Maven, có một plugin đặc biệt - buildnumber-maven-plugin. Xem ví dụ dưới đây:

<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>

Trong ví dụ trên, có ba điều quan trọng xảy ra. Đầu tiên, bản thân plugin được chỉ định để cài đặt phiên bản lắp ráp . Thứ hai, nó được chỉ định rằng nó sẽ chạy trong giai đoạn xác thực (giai đoạn đầu tiên) và tạo số bản dựng - ${buildNumber}.

Và thứ ba, định dạng của số lắp ráp này được chỉ định, được dán lại với nhau từ nhiều phần . Đây là phiên bản của dự án project.versionvà thời gian hiện tại được cung cấp bởi mẫu. Định dạng mẫu được chỉ định bởi lớp Java MessageFormat.