JavaRush /Blog Java /Random-VI /Mọi thứ bạn muốn biết về Maven - "Dự án Java từ A đến Z"
Roman Beekeeper
Mức độ

Mọi thứ bạn muốn biết về Maven - "Dự án Java từ A đến Z"

Xuất bản trong nhóm
Xin chào tất cả mọi người, các bạn thân mến. Tôi muốn xin lỗi ngay: Tôi nhớ mình đã hứa sẽ viết một bài mỗi tuần một lần. Không thành công. Tôi chỉ chưa có thời gian để ngồi xuống và viết đúng cách, nhưng tôi không muốn làm theo cách này hay cách kia. Tôi sẽ không than vãn về lý do vì tôi không cần nó và bạn chắc chắn cũng không quan tâm. Dự án chưa chết, nó đang bị đình trệ :) Chúng tôi tiếp tục! Và tài liệu hôm nay được dành riêng cho Maven. "Dự án Java từ A đến Z": Mọi thứ bạn muốn biết về Maven - 1

Hãy nói về Maven

Đầu tiên bạn cần phải cài đặt nó. Tất nhiên, vì tôi có máy Mac nên tôi chỉ có thể hiển thị phần cài đặt cho máy Mac. Đó chỉ là sự xui xẻo thôi. Mình cài lâu rồi nên bạn tự làm nhé :)
Hướng dẫn cài đặt Maven có trong tài liệu này .

Tại sao chúng ta cần Maven?

Maven là công cụ xây dựng dự án cùng với Gradle và Ant. Chỉ vì tôi sẽ sử dụng nó trong JRTB (JavaRush Telegram Bot) nên tôi muốn cập nhật cho bạn. Ngày nay, không một dự án nào được tạo ra mà không có hệ thống lắp ráp, bởi vì nó đơn giản hóa cuộc sống của chúng ta nhiều lần. Điều này cho phép:
  • • lấy ra tất cả các thư viện cần thiết (về công cụ lắp ráp - các phần phụ thuộc (nghĩa là phần phụ thuộc));
  • • xác định chính xác dự án cần được biên dịch như thế nào và thành những gì (ví dụ: chúng ta muốn xây dựng trong WAR hay JAR hay JAR có thể thực thi được);
  • • đặt phiên bản dự án ở một nơi để nó được chỉ ra trong quá trình lắp ráp;
  • • mô tả dự án và vòng đời của nó;
  • • thêm cái gọi là plugin (phiên bản truyền thống của từ tiếng Anh Plugin);
  • • xuất bản các thư viện trong kho được chia sẻ để các dự án khác có thể lấy chúng lên dưới dạng phụ thuộc.
Nói chung là anh ấy làm được rất nhiều việc và cái nào cũng có ích. Tôi sẽ nói điều này: đối với các kỹ sư mới vào nghề, không cần thiết phải biết tất cả các chức năng từ đầu đến cuối. Ở đây, cũng như với git, điều quan trọng là phải hiểu những khái niệm cơ bản và chung. Đây là những gì chúng tôi sẽ làm. Đối với chúng tôi, Maven bắt đầu bằng một tệp XML trong thư mục gốc của dự án có tên pom.xml . Chúng tôi sẽ thực hiện mọi thứ trong thực tế, vì vậy trước tiên chúng tôi sẽ tạo dự án đầu tiên của mình trong Cộng đồng JavaRush. Để thực hiện mọi thứ một cách khôn ngoan, tôi sẽ sử dụng một mẫu cho kho lưu trữ , nơi những thứ cơ bản mà tôi đã mô tả trên JR đã được cấu hình sẵn . Để tạo, hãy đi tới kho lưu trữ có mẫu và nhấp vào nút Sử dụng mẫu này : "Dự án Java từ A đến Z": Mọi thứ bạn muốn biết về Maven - 2Kết quả là chúng tôi có kho lưu trữ đầu tiên trong cộng đồng của mình :) Chúng tôi tải xuống dự án cục bộ. Để thực hiện điều này, thông qua ý tưởng, hãy đi tới File -> New -> Project từ Version Control . Trong cửa sổ xuất hiện, hãy nhập liên kết đến dự án trên Github (kết quả sẽ tốt hơn nếu mọi người tạo cùng một dự án riêng biệt và thực hiện tất cả các bước với tôi): "Dự án Java từ A đến Z": Mọi thứ bạn muốn biết về Maven - 3Nhấp vào Clone và dự án được nhân bản .

pom.xml là phần đầu của mọi thứ

Mọi thứ bạn cần đều có trong pom.xml. Tất cả thông tin về dự án, nhà phát triển dự án và kho lưu trữ từ xa mà dự án được lưu trữ. Khi bắt đầu, chúng ta quan tâm đến các khối sau: <project/> - đây là khối chính chứa tất cả thông tin về dự án. Tất cả những thứ khác sẽ rõ ràng hoặc chuyển tiếp trong đó. Bên trong thẻ mở có dòng chữ như thế này:
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://maven.apache.org/POM/4.0.0"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                     http://maven.apache.org/xsd/maven-4.0.0.xsd">
Và trên hết, dòng tiếp theo cũng được viết bằng tất cả pomniks (tiếng lóng được cho là từ pom.xml :)).
<modelVersion>4.0.0</modelVersion>
Nhưng sau đó nó trở nên thú vị hơn: chúng tôi sẽ mô tả cách chúng tôi xác định dự án mà đài tưởng niệm của chúng tôi mô tả. Lấy thư viện của tôi làm ví dụ, tôi sẽ mô tả nó và sau đó chúng tôi sẽ thêm nó vào bộ nhớ của mình, vào dự án mới tạo:
<groupId>com.github.romankh3</groupId>
<artifactId>image-comparison</artifactId>
<version>4.4.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Image Comparison</name>
Điều chính ở đây:
  • groupId là mã định danh của tổ chức phát triển hoặc cá nhân kỹ sư. Đây thường là tên miền theo thứ tự ngược lại. Ví dụ: tài khoản romankh3 trên Github được mô tả ở đây. Rất quan trọng. Giả sử hệ sinh thái Spring là com.springframework . Bằng cách này, bạn có thể phân biệt dự án ban đầu với dự án của người khác hoặc đơn giản là do trùng tên dự án.
  • artifaceId đã là tên của một dự án cụ thể được mô tả trong bộ nhớ này.
  • phiên bản — phiên bản của dự án này. Mọi thứ ở đây đều rõ ràng như ban ngày: thêm chức năng mới, sửa lỗi cũ, tái cấu trúc hoặc thực hiện một số thay đổi khác - tăng phiên bản.
  • đóng gói - ở đây chúng tôi mô tả cách Maven nên lắp ráp dự án của chúng tôi. Hoặc trong Jar, hoặc trong War, hoặc một số thứ khác .
  • tên - đây là một cái tên dễ chịu hơn cho dự án.
Vẫn còn một số thứ không bắt buộc phải điền - Maven sẽ hoạt động mà không cần chúng - nhưng nếu bạn cần xuất bản thư viện để sử dụng công cộng thì chắc chắn đáng để thêm chúng. Những thứ này là gì?
  • • đường dẫn đến kho lưu trữ dự án, từ đó có thể tải xuống

    <url>https://romankh3.github.io/image-comparison/</url>

  • • giấy phép mà dự án này được phân phối. Hơn nữa, có thể có nhiều hơn một và do đó bạn cần đặt nó theo cách này:

    <licenses>
     <license>
       <name>The Apache Software License, Version 2.0</name>
       <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
     </license>
    </licenses>

  • • thông tin về các nhà phát triển đã tạo/đang tạo dự án:

    <developers>
     <developer>
       <id>romankh3</id>
       <name>Roman Beskrovnyi</name>
       <email>roman.beskrovnyy@gmail.com</email>
     </developer>
    </developers>

  • • khối scm, mô tả cách truy cập dự án:

    <scm>
    <connection>git@github.com:romankh3/image-comparison.git</connection>
    <developerConnection>git@github.com:romankh3/image-comparison.git</developerConnection>
     <url>https://github.com/romankh3/image-comparison</url>
    </scm>

Sau khi mô tả thông tin chung, chúng ta có thể thêm một khối có các phần phụ thuộc:
<dependencies>
   <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
       <version>2.26.0</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter-api</artifactId>
       <version>5.5.2</version>
       <scope>test</scope>
   </dependency>
<dependency>
   	<groupId>com.github.romankh3</groupId>
   	<artifactId>image-comparison</artifactId>
   	<version>4.3.0</version>
<scope>test</scope>
</dependency>
</dependencies>
Ở đây tôi đã thêm hai thư viện để thử nghiệm: chúng luôn cần thiết. Như bạn có thể đã nhận thấy, các phần phụ thuộc có Phạm vi - phạm vi. Trong trường hợp của chúng tôi , kiểm tra được chỉ định , điều đó có nghĩa là chúng tôi sẽ không thấy sự phụ thuộc này trong mã chính. Tiếp theo, để mọi thứ trông đẹp mắt, bạn có thể sử dụng một thẻ riêng để hiển thị các phiên bản <properties/> :
<properties>
   <mockito.version>2.26.0</mockito.version>
   <junit.version>5.5.2</junit.version>
   <image.comparison.version>4.3.0</image.comparison.version>
</properties>
Vì vậy, khối phụ thuộc có thể được cập nhật bằng cấu trúc ${PROPERTY_NAME} :
<dependencies>
   <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
       <version>${mockito.version}</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter-api</artifactId>
       <version>${junit.version}</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>com.github.romankh3</groupId>
       <artifactId>image-comparison</artifactId>
       <version>${image.comparison.version}</version>
       <scope>test</scope>
   </dependency>
</dependencies>
Tiếp theo là một khối <build/> lớn , chứa một khối <plugins/> quan trọng mà bạn có thể tùy chỉnh quá trình xây dựng. Bạn có thể thêm một hoặc nhiều plugin bên trong khối <plugins/> , như thế này:
<build>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-source-plugin</artifactId>
           <version>3.2.0</version>
           <executions>
               <execution>
                   <id>attach-sources</id>
                   <goals>
                       <goal>jar</goal>
                   </goals>
               </execution>
           </executions>
       </plugin>
   </plugins>
</build>
Ở đây bạn có thể thấy rằng tôi đã thêm hai plugin - maven-source-pluginmaven-javadoc-plugin . Mỗi plugin đều có cài đặt, thuộc tính (thông số) có thể được đặt, từ đó tùy chỉnh các plugin. Điều này sẽ rất thú vị đối với chúng tôi trong tương lai. Bây giờ chúng ta hãy ghi nhớ và tiếp tục. Tương tự như đối với phần phụ thuộc, chúng tôi sẽ đặt các phiên bản plugin vào <properties/> . Dựa trên điều này, bạn có thể tạo bộ nhớ sau:
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://maven.apache.org/POM/4.0.0"
        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.github.javarushcommunity</groupId>
   <artifactId>maven-demo</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>Maven Demo Project</name>

   <url>https://github.com/javarushcommunity/maven-demo/</url>

   <properties>
       <mockito.version>2.26.0</mockito.version>
       <junit.version>5.5.2</junit.version>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <source.plugin.version>3.2.0</source.plugin.version>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.mockito</groupId>
           <artifactId>mockito-core</artifactId>
           <version>${mockito.version}</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>org.junit.jupiter</groupId>
           <artifactId>junit-jupiter-api</artifactId>
           <version>${junit.version}</version>
           <scope>test</scope>
       </dependency>
   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-source-plugin</artifactId>
               <version>${source.plugin.version}</version>
               <executions>
                   <execution>
                       <id>attach-sources</id>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-javadoc-plugin</artifactId>
               <version>${javadoc.plugin.version}</version>
               <executions>
                   <execution>
                       <id>attach-javadocs</id>
                       <goals>
                           <goal>jar</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
       </plugins>
   </build>
</project>

Vòng đời của Maven

Maven có một thứ gọi là vòng đời của maven. Điều đáng nói là đây là tập hợp các nhiệm vụ mà một maven có thể thực hiện. Có thể có các nhiệm vụ khác ngoài vòng đời của maven. Nó nói về cái gì vậy? Có một bộ lệnh mà bạn có thể tập hợp một dự án ( xây dựng ... tất nhiên, một lần nữa, một tờ giấy theo dõi từ tiếng Anh, nhưng không có lệnh này thì không có nơi nào), xóa các bản dựng mà Maven đã thu thập, cài đặt trong Maven cục bộ để bạn có thể kéo dự án lên cục bộ như một phần phụ thuộc, v.v. Bây giờ hãy nói về mọi thứ chi tiết hơn. Trước khi viết quan điểm của mình về những đội này, tôi quyết định đọc những gì họ viết trên Internet về vấn đề này... và nhận ra rằng nó rất khó diễn tả. Đối với công việc, đối với công việc ban đầu, chúng ta cần một số lệnh . Hãy mô tả chúng:
  • biên dịch - biên dịch dự án. Đây là giai đoạn đầu tiên: trong giai đoạn này, bạn có thể xem liệu có bất kỳ lỗi biên dịch nào trong dự án hay không. Đôi khi có nhiều bước nhảy vọt khác nhau khi làm việc trong IDEA, đó là lý do tại sao các vấn đề biên dịch xuất hiện ở những nơi lẽ ra chúng không nên tồn tại. Vì vậy, lệnh này sẽ chấm tất cả các chữ i.
  • test - chạy tất cả các thử nghiệm chạy trên JUnit và được đặt ở nơi Maven mong đợi ( src/test/java là đội trưởng của bạn).
  • gói là lệnh tiếp theo, bao gồm hai lệnh trước: nghĩa là lệnh biên dịch được khởi chạy lần đầu tiên bên trong nó, sau đó lệnh kiểm tra sẽ được gửi đến dự án đã biên dịch và nếu mọi thứ đều ổn ở đây thì quá trình tạo một kho lưu trữ sẽ bắt đầu (kho lưu trữ mà chúng tôi chọn trong < bao bì/>))
  • cài đặt - khi chúng tôi cài đặt Maven trên máy, chúng tôi có kho lưu trữ Git cục bộ lưu trữ các thư viện mà chúng tôi tải xuống cho các dự án. Nhưng cái hay của Maven là chúng ta có thể sử dụng lệnh cài đặt để thêm dự án của mình vào kho lưu trữ Git cục bộ và sử dụng dự án cục bộ của chúng ta làm phần phụ thuộc. Không tin tôi? Hãy thử :) Bằng cách này, bạn có thể nhanh chóng thấy dự án của mình trông như thế nào khi phụ thuộc vào dự án khác.
  • triển khai là đỉnh cao của mọi thứ trước đó. Lệnh cung cấp khả năng thêm dự án không chỉ vào kho lưu trữ cục bộ dưới dạng cài đặt mà còn vào kho lưu trữ từ xa, từ đó mọi người có quyền truy cập đều có thể sử dụng dự án đó làm phần phụ thuộc.
  • xác minh - lệnh sẽ kiểm tra mọi thứ và cho biết dự án đã sẵn sàng để triển khai hay chưa.
  • sạch - tất nhiên, các tập tin đã biên dịch và kho lưu trữ phải được lưu trữ ở đâu đó. Maven có một thư mục đích cho việc này . Đây là dữ liệu mà dự án không cần. Và trước khi tập hợp lại dự án, tốt nhất bạn nên xóa mọi thứ có trước đó. Đây chính là mục đích của lệnh clean .

Plugin Maven

Tôi muốn nói nhiều hơn về plugin nhưng bài viết đã dài rồi. Đây sẽ là bài tập về nhà của bạn. Hiểu nó là gì và cách sử dụng nó. Trong phần tiếp theo của bài viết, chúng ta sẽ giải quyết Maven trong thực tế.

Danh sách tất cả các tài liệu trong loạt bài này nằm ở đầu bài viết này.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION