NET2Java之二:Maven

如果是初用Maven的小夥伴,就會覺得它和.NET中的Nuget很像,用來管理項目中的包依賴,畢竟Java依賴包浩如煙海,沒個包管理器,簡直是噩夢,當然Maven的作用不止如此,他提供了:

  • 依賴管理:Maven的核心功能,讓開發者可以通過pom.xml來管理項目所需的庫和框架,就按照Nuget來理解就行;
  • 項目構建:提供了一套完整的構建機制,可以自動完成項目的編譯、測試、打包、部署等操作,功能類似於MSBuild,通過配置POM文件就可以輕鬆實現;
  • 模塊管理:Maven提供了多模塊的管理,可以允許開發者在一個項目中包含多個子模塊,類似於.NET中的解決方案和.csproj等功能的集合體;
  • 標準化管理:Maven提供了標準化的項目結構,便於團隊管理。

管他啥功能,別人都在用,我也用,用多了自然知道是幹啥的了。

Maven配置

大家可以去官網上下載最新版本,我本地已經有了3.6.2的版本了,就不再額外安裝了。

配置環境變量

  1. 在環境變量中添加“maven_home”,路徑爲maven的安裝路徑,本人的安裝路徑爲D:\DevSoft\maven_3.6.2
  2. 在Path中添加%maven_home%\bin\,點擊確認;
  3. 打開命令行,輸入mvn -v驗證是否配置成功;

本地配置

打開maven目錄,找到conf,打開settings.xml,找到localRepository,不要用c盤,畢竟作爲一名開發,c盤真的不富裕,把本地倉庫位置挪走。


<localRepository>D:\\Repository\\Maven</localRepository>

由於某些原因,mvn更新包的速度會很慢,建議使用阿里雲的鏡像,一樣是在settings.xml的mirrors節點下添加:

    <!-- 阿里雲倉庫 -->
<mirros>
    <mirror>
        <id>alimaven</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    <!-- 中央倉庫1 -->
    <mirror>
        <id>repo1</id>
        <mirrorOf>central</mirrorOf>
        <name>Human Readable Name for this Mirror.</name>
        <url>http://repo1.maven.org/maven2/</url>
    </mirror>
    <!-- 中央倉庫2 -->
    <mirror>
        <id>repo2</id>
        <mirrorOf>central</mirrorOf>
        <name>Human Readable Name for this Mirror.</name>
        <url>http://repo2.maven.org/maven2/</url>
    </mirror>
</mirros>

Idea設置

Idea中也要進行一些簡單設置,在文件->設置->構建->Maven中,按自己的情況配置Maven地址和配置文件。

別上來就整mvn archetype:generate ***之類的來創建項目,放着打火機不用,非要自己鑽木取火,Idea:文件->新建->項目調出項目創建界面:

因爲是maven項目,構建系統直接選擇maven,JDK選擇本地安裝的1.8版本,這裏的名稱類似於.NET中的解決方案名稱,不同的是,這個解決方案也可以是一個項目,高級設置中有一個組Id和工件Id,分別對應pom文件中的groupId和artifactId(這裏我覺得沒必要翻譯,用中文反而差點意思),groupid一般就是公司網址的反寫+項目名稱,這裏瞎寫了一個:com.lmmplat.net2java,artifactid你可以理解爲是項目名,一般就是項目名+模塊名,到這裏,一個簡單的Maven項目就創建完成了。

POM文件

上圖中我們看到了項目中存在一個pom.xml文件,pom是maven中核心文件,包含項目的基本信息,主要用於表述項目如何構建、聲明依賴等:

<?xml version="1.0" encoding="UTF-8"?>
<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.lmmplat.net2java</groupId>
    <artifactId>lmmplat</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

一個完整的pom文件至少包含一個project根和groupId、artifactId、version三個元素,groupId前文中也表述過,一般來說就是公司網址的反寫+項目名稱,最好是唯一的;artifactId是工程標識,通常就是項目名稱+模塊名稱,比如llmplat-api、llmplat-core等;version就是工程的版本號。這個文件看起來簡單,實際上是以爲它默認繼承了一個Super pom,maven使用Super pom加項目pom來執行,我們可以通過mvn help:effective-pom來查看實際生效的pom。

POM詳解

POM的全程爲Project Object Model,是整個項目的描述未見,定義了項目構建、依賴管理以及其他相關的配置信息,學習Maven可以說就是學習如何配置POM,下面我會挑選最常用的一些內容進行講解:

  • 項目描述:
    • groupId:組織的唯一標識,一般是公司域名反寫+項目名
    • artifactId:項目內的唯一表示,一般是項目名+模塊名
    • version:版本號,值得一提的是1.0-SNAPSHOT中的snapshot,這個一般表示該版本尚不穩定
    • description:項目描述,當然還有name、url等屬性,一般都是用來生成文檔
    • packaging:文件的打包類型,有pom、jar、war等,pom類型表示該項目是一個聚合項目或父項目,多用於組織和協調項目模塊
    • modelVersion:描述項目遵循哪一個pom模型
    • properties:用於定義後續配置中用到的變量,多用於版本號的統一管理,如<slf4j.version>1.7.36<slf4j.version>,在後面的依賴管理中就可以統一用${slf4j.version}來替代,便於版本的管理和統一
    • parent:parent元素一般表示一個項目繼承自另外一個maven項目,通常用於多模塊的maven項目結構,好處是子模塊可以繼承父模塊的配置,易於整個項目統一維護

<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/maven-v4_0_0.xsd ">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.lmmplat.net2java</groupId>
        <artifactId>lmmplat</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>lmmplat-api</artifactId>
</project>
  • 構建配置:
    • build:定義項目如何構建
    • plugins:定義要使用的插件
  • 依賴管理:
    • dependencies:項目依賴配置,指定項目所需的依賴
    • dependencyManagement:集中管理多個模塊的依賴,比如在父項目中統一指定依賴的版本號,子模塊只需要引用依賴即可
  • 模塊管理:
    • modules:主要針對多模塊項目,指定包含的子模塊,多是在父項目中使用
  • 倉庫管理:
    • repositories:定義項目中使用的遠程倉庫地址
    • pluginRepositories:定義項目中使用的插件倉庫地址
  • 配置管理
    • profiles:爲項目定義不同的構建環境或集合配置。

實際上Maven的功能不止如此,但對於大多數開發者來說,上面的功能已經足夠使用了。

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <!--描述項目遵循那個POM模型,必須,基本不需要懂-->
    <modelVersion>4.0.0</modelVersion>
    <!--組織的唯一標識,一般是公司域名反寫+項目名-->
    <groupId>com.lmmplat.net2java</groupId>
    <!--項目內的唯一表示,一般是項目名+模塊名-->
    <artifactId>lmmplat</artifactId>
    <!--版本號-->
    <version>1.0-SNAPSHOT</version>
    <!--項目的打包類型:pom、jar、war等-->
    <packaging>pom</packaging>
    <!--項目的詳細描述-->
    <description>這是一個示例項目</description>
    <!--聲明所依賴的外部庫或組件-->
    <dependencies>
        <!--引入了slf4j的依賴-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    </dependencies>
    <!--用於配置項目構建相關信息-->
    <build>
        <plugins>
            <!--插件:下面這個插件能夠將spring boot應用打包爲可執行的jar或war文件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <mainClass>com.lmmplat.net2java.Main</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


    <!--遠程倉庫配置-->
    <repositories>
        <!--比如有時候你需要用到自己搭建的私有倉庫-->
        <repository>
            <id>central</id>
            <name>lmmplat中央倉庫</name>
            <!--地址我瞎寫的,lmm最近比較火-->
            <url>https://repo.maven.lmmplat.cn/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <!--模塊信息描述-->
    <modules>
        <!--子項目相對路徑-->
        <module>lmmplat-api</module>
    </modules>

    <!--自定義變量-->
    <properties>
        <!--自定義了一個名爲sl4j.version的變量,用於後續替代sl4j的版本依賴-->
        <slf4j.version>1.7.32</slf4j.version>
    </properties>

</project>

Archetype

如果你用Idea新建項目可以發現一個MavenArchetype選項,這個就是Maven工程模板了,類似於VS新建項目裏的項目模板,比如org.apache.maven.archetypes:maven-archetype-webapp就可以對標一下VS裏的ASP.NET Core Web應用,可以幫助你快速構建應用,下面列一些比較常用的MavenArchetype,一般我都是直接通過maven-archetype-quickstart創建項目,再通過修改pom來調整項目,比如我想創建一個Spring Boot項目,我們可以先創建一個quickstart項目,然後通過在pom.xml中添加Spring Boot依賴:


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.6.3</version>
    </dependency>
    <!-- 添加其他需要的Spring Boot Starters -->
</dependencies>

然後添加一個Application類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

一個Spring Boot項目就創建完成了。

生命週期

一個項目從構建到發佈,Maven爲期定義了一個完整的聲明週期,點開Idea界面右側邊欄的m圖標,就可以看見一個大概的生命週期:

階段 操作 描述
clean 清理 通常在構建之前執行,用於刪除target中的輸出文件,從頭開始,未必不是一件好事
validate 驗證 驗證項目的正確性
compile 編譯 編譯項目
test 測試 運行單元測試
package 打包 將編譯後的文件打包成目標格式,如jar或war
verify 檢查 檢查集成測試的結果,保證質量達標
install 安裝 安裝打包的項目到本地倉庫,供其他項目使用
site 站點 生成項目文檔和站點信息mvn
deploy 部署 將打包好的項目報拷貝到遠程倉庫(我看就沒有這個必要了吧)

工作中比較常用的就是mvn cleanmvn compilemvn packagemvn install幾個命令,當我們進行操作是,只有該階段及該階段之前的命令會被調用,如我使用mvn install,那clean->validate->compile->test->package->versify->install會執行,而之後不會被執行。當然mvn的生命週期的控制可以更爲精細,但我們絕大多數的時候並不需要用到這些功能,如果需要,再去細化研究。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章