1. 程式人生 > >個人對於 Maven 的理解

個人對於 Maven 的理解

完成後 部分 運行 plugins 名稱 gin per aging rep

個人對於 Maven 的理解

Maven 一直都在使用, 但如果說是不是真的懂 Maven, 很難談得上. 或許什麽時候系統地學習一下, 但在那之前, 打算先記下自己目前對於 Maven 的理解, 之後再進行對比, 看有哪些疏漏和錯誤.

Maven 基礎

最直觀的, Maven 使用 pom.xml 文件來管理項目中所使用的依賴, 這跟 Python 的 requirement.txt、JS 的 package.json 或者是 Ruby 的 Gemfile 都類似.

不過, 其他語言的依賴文件規定的往往是某個包的最低版本, 在實際安裝的時候, 很可能會安裝最新版, 這個時候實際版本會形成另外一個 lock 文件, 像 package.json.lock

. 但是 Maven 不會, 因為在 Maven 的一個依賴節點中, 會要求聲明具體的版本.

其次, 因為和構建相關, 所以 pom.xml 中需要聲明項目所屬的組織、項目的名稱、版本, 同時還要在 properties 節點中聲明使用的 Java 版本、編碼等信息, build 也是經常見到的一個節點, 但我不是很理解它的作用.

<!--項目信息-->
<groupId>域名/項目名</groupId>
<artifactId>項目名/組件</artifactId>
<version>版本</version>

<properties>
    <!-- 可以聲明編碼 -->    
    <!-- 聲明 jdk 版本-->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!-- 可以自定義一些版本值 -->
</properties>

<!-- 一些構建相關的信息 -->
<build>
    ……
</build>

<!-- 最重要的部分, 列出所依賴的包 -->
<dependencies>
    <dependency>
        <groupId>域名/項目名</groupId>
        <artifactId>項目名/組件</artifactId>
        <version>版本</version>
    </dependency>
    ……
</dependencies>

同時, 和其他包管理工具相比, Maven 不像 pip、npm、gem 一樣可以使用 install xxxx 命令安裝依賴, 而是需要自己向 pom.xml 中添加 <dependency>……</dependency> 節點來添加依賴, 然後執行 mvn install 命令才能安裝.

項目名, 包名, 版本號往往瑣碎而難以記憶, 所以常常借用現有的 pom.xml 文件; 或者像 Spring initializer 一樣生成 pom.xml 文件; 同時也可以依賴搜索引擎, 比如說 Maven Repository Search 就是一個很好用的 Maven 搜索工具.

但在包管理之外, Maven 還可以進編譯和打包, Maven 的使用大大簡化了項目編譯, 打包, 部署的工作量, 因為操作非常簡單:

  • 運行是 mvn run, 或者有一些特殊的項目可以定義特殊的啟動方式, 如 mvn spring-boot:run 命令;
  • 打包是 mvn package , 打包之後產生的 fat jar package 就可以通過 java -jar xx.jar 來運行;
  • mvn clean 命令可以刪除掉項目中的 target 文件夾, 也就是清除掉所有的編譯後的內容.

JSP 項目

而對於傳統的項目, 我以前並不太會使用 Maven 處理, 最近有需求之後有這些經驗.

一個JSP 項目的 Maven 的典型目錄是 javaresourceswebapp. 在編譯時, webapp 文件夾會成為根文件夾, java 文件夾中代碼會被編譯成 .class 文件放到 webapp/WEB-INF/lib 中, resources 文件夾和 java 文件夾去的地方一樣, 但因為是配置文件, 所以不會被編譯.

最最重要的一點, 就是 Maven 如何把這個項目識別成一個傳統項目呢, 就是在項目信息下方添加 packaging 信息, 也就是 <packaging>war</packaging>, 這樣, Maven 就會識別 javaresourceswebapp 的結構了. 在拿到這樣一個 xx.war 包之後, 把它拷貝到服務器 Tomcat 的 webapps 文件夾下面, 重啟 Tomcat 就可以成功部署.

Spring Boot 項目

我 Spring Boot 相關的項目經驗並不多, 僅有的經驗是 Spring Boot 項目會在根目錄產生 mvnw 腳本, 通過該腳本, 可以使用 mvn spring-boot:run 命令運行項目.

因為 Spring Boot 項目往往具有共享的版本號, 所以可以添加 <parent>...</parent> 節點來一次性指定 Spring Boot 的版本, 之後可以省略.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.7.RELEASE</version>
</parent>

PS: 在使用 mvn package 時會要求數據庫必須有連通性, 所以應當是本地打包完成後再在服務器部署使用.

PS: mvn spring-boot:run 命令為何可用, 是因為 添加以下插件帶來的效果.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

個人對於 Maven 的理解