title: maven學習
categories:
- JAVA
tags: - java
- maven
abbrlink: 3856498447
date: 2019-06-27 14:45:38
一、爲什麼使用maven?
1.一般的一個項目就是一個工程
當一個項目非常龐大,可以藉助maven拆分成一個個工程。
2.項目中使用到的jar包,需要複製粘貼到lib目錄下
藉助maven可以將jar保存在倉庫,直接引用就行。不用累贅的一個個導包。
3.jar的下載與使用
藉助maven可以更加便捷快捷,規範化的使用jar包
4.jar包的版本不一致有風險
藉助maven所有jar存放在倉庫,所有項目使用倉庫中的一份jar包
5. jar包中如果依賴其他jar需要手動導入
藉助maven會自動的導入相關依賴包
二、什麼是maven?
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.
是一個軟件項目管理和理解工具。基於項目對象模型(POM)的概念,Maven可以從一箇中心信息管理項目的構建,報告和文檔。
構建:
- 定義:把動態的web工程通過編譯得到的編譯結果部署到服務器上的過程
- a.編譯:java源文件–>編譯–>Class字節碼文件
- b.部署:最終在servlet容器中部署的是編譯後的文件
- 構建的各個環節:
- clean [清理] :將之前編譯的文件刪除
- compile [編譯] : 將java源文件編譯成字節碼文件
- test [測試] :自動測試,自動調用junit程序
- report [報告] :測試程序的執行結果
- package [打包] : 將動態web打包成war,將java工程打包成jar
- install [安裝] :Maven特定的概念——將打包好的文件複製到倉庫的指定的位置
- deploy [部署] :將動態web工程war包複製到servlet容器下,並運行
三、maven的安裝
1.安裝java環境,配置環境變量。
2.下載maven,並安裝
3.maven -v
查驗mvn版本
四、構建一個maven項目從0到1
約定目錄結構
根目錄:工程名
|——src: 源碼
|——|——main : 存放主程序
|——|——|——java: java源碼文件
|——|——|——|——|——com
|——|——|——|——|——|——lee
|——|——|——|——|——|——|——maven
|——|——|——|——|——|——|——|——Hello.java
|——|——|——resource: 存放框架配置文件
|——|——test: 存放測試文件
|——pom.xml: maven的核心配置文件
按照目錄結構搭建項目
pop.xml文件
<?xml version="1.0" ?>
<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.lee.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Hello</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
1.進入.xml目錄下,執行 mvn compile
leeyf@leeyf-PC:~/java/project/maven-hello$ mvn compile
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 (file:/usr/share/maven/lib/guice.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------< com.lee.maven:Hello >-------------------------
[INFO] Building Hello 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Hello ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Hello ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /home/leeyf/java/project/maven-hello/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.072 s
[INFO] Finished at: 2019-06-29T10:45:31+08:00
[INFO] ------------------------------------------------------------------------
在pom.xml同級目錄下,多了一個target文件夾,裏面是編譯以後的字節碼
|——target
|——|——classes
|——|——|——com
|——|——|——|——lee
|——|——|——|——|——maven
|——|——|——|——|——|——Hello.class
|——|——maven-status
|——|——|——maven-compiler-plugin
|——|——|——|——compile
|——|——|——|——|——default-compile
|——|——|——|——|——|——createdFiles.lst
|——|——|——|——|——|——inputFiles.lst
|——|——generated-sources
|——|——|——annotations
2.運行mvn test-compile
,target 文件夾下多了一個test-class文件夾
leeyf@leeyf-PC:~/java/project/maven-hello$ ls target/
classes generated-sources maven-status test-classes
3.運行mvn package
,target 文件夾下多了一個jar包
leeyf@leeyf-PC:~/java/project/maven-hello$ ls target/
classes generated-sources Hello-0.0.1-SNAPSHOT.jar maven-archiver maven-status test-classes
4.運行mvn clean
target整個被清理掉
五、倉庫&&座標
- pom.xml: Project Object Model 項目對象模型。它是maven的核心配置文件,所有的構建的配置都在這裏設置。
- 座標: 使用三個向量確定倉庫內唯一一個maven工程
<!-- 1.公司或組織域名倒序+項目名-->
<groupId>junit</groupId>
<!--2.模塊名-->
<artifactId>junit</artifactId>
<!--3.版本-->
<version>4.0</version>
- maven工程座標:
- 本項目座標
<groupId>com.lee.maven</groupId> <artifactId>Hello</artifactId> <version>0.0.1-SNAPSHOT</version>
- 依賴項目座標
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.0</version> <scope>test</scope> </dependency>
- maven座標和倉庫對應的映射關係:[groupId][artifactId][version][artifactId]-[version].jar
- 本項目座標
- 倉庫
- 1.本地倉庫:.m2
- 2.遠程倉庫:
- a. 私服:個人搭建的,常見的搭建工具:nexus
- b. 中心倉庫
六、依賴
- maven解析依賴信息會到本地倉庫中查取被依賴的jar包
- 當本地倉庫中未找到,會去中心倉庫查找maven座標來獲取jar包,然後下載到本地倉庫
- 若中心倉庫未查取到依賴的jar包時,編譯失敗
- 若依賴的jar包是自己OR自己團隊開發的maven,需要先
mvn install
把所依賴的工程jar包安裝到本地maven倉庫中
舉例:現在我再創建第二個maven工程HelloFriend,其中用到了第一個Hello工程裏類的sayHello(String name)方法
我們在給HelloFriend項目使用 mvn compile命令進行編譯的時候,會提示缺少依賴Hello的jar包。怎麼辦呢?
到第一個maven工程中執行 mvn install後,你再去看一下本地倉庫,你會發現有了Hello項目的jar包
一旦本地倉庫有了依賴的maven工程的jar包後,你再到HelloFriend項目中使用 mvn compile命令的時候,可以成功編譯
- 依賴範圍:
<scope>compile</scope>
- compile :默認值,本jar包會一直存在
- provided :只有開發、測試階段使用,目的是不讓Servlet容器和你本地倉庫的jar包衝突 。如servlet.jar。
- runtime : 只在運行時使用,比如JDBC驅動,適用運行和測試階段
- test : 只在測試時適用,用於編譯和測試代碼。不隨項目發佈
- system : 類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。
七、生命週期
Maven 有三套相互獨立的生命週期
- Clean LifeCycle 在進行正式構建前進行的一些清理工作
- Default Lifecycle 構建的核心部分,編譯,測試,打包,部署
1、validate
2、generate-sources
3、process-sources
4、generate-resources
5、process-resources 複製並處理資源文件,至目標目錄,準備打包
6、compile 編譯項目的源代碼
7、process-classes
8、generate-test-sources
9、process-test-sources
10、generate-test-resources
11、process-test-resources 複製並處理資源文件,至目標測試目錄
12、test-compile 編譯測試源代碼
13、process-test-classes
14、test 使用合適的單元測試框架運行測試。這些測試代碼不會被打包或部署
15、prepare-package
16、package 接受編譯好的代碼,打包成可發佈的格式,如 JAR
17、pre-integration-test
18、integration-test
19、post-integration-test
20、verify
21、install 將包安裝至本地倉庫,以讓其它項目依賴。
22、deploy 將最終的包複製到遠程的倉庫,以讓其它開發人員與項目共享
- **不論執行哪個生命週期,一定會經過這個週期。**
- **插件:每個階段都有插件(plugin),插件的職責就是執行它對應的命令。**
- Site Lifecycle 生成項目報告、站點、發佈站點
- pre-site 執行一些需要在生成站點前完成的工作
- site 生成項目的站點文檔
- post-site 執行一些需要在生成文檔之後的任務,並且給部署做準備
- site-deploy 將生成的站點文檔部署到特定服務器上
部分內容,網絡轉載,侵權刪~