個人對於 Maven 的理解
個人對於 Maven 的理解
Maven 一直都在使用, 但如果說是不是真的懂 Maven, 很難談得上. 或許什麽時候系統地學習一下, 但在那之前, 打算先記下自己目前對於 Maven 的理解, 之後再進行對比, 看有哪些疏漏和錯誤.
Maven 基礎
最直觀的, Maven 使用 pom.xml 文件來管理項目中所使用的依賴, 這跟 Python 的 requirement.txt、JS 的 package.json
或者是 Ruby 的 Gemfile
都類似.
不過, 其他語言的依賴文件規定的往往是某個包的最低版本, 在實際安裝的時候, 很可能會安裝最新版, 這個時候實際版本會形成另外一個 lock 文件, 像 package.json.lock
其次, 因為和構建相關, 所以 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 的典型目錄是 java
、resources
、webapp
. 在編譯時, webapp 文件夾會成為根文件夾, java
文件夾中代碼會被編譯成 .class
文件放到 webapp/WEB-INF/lib
中, resources
文件夾和 java
文件夾去的地方一樣, 但因為是配置文件, 所以不會被編譯.
最最重要的一點, 就是 Maven 如何把這個項目識別成一個傳統項目呢, 就是在項目信息下方添加 packaging 信息, 也就是 <packaging>war</packaging>
, 這樣, Maven 就會識別 java
、resources
、webapp
的結構了. 在拿到這樣一個 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 的理解