maven學習


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 cleantarget整個被清理掉

五、倉庫&&座標

  • 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 將生成的站點文檔部署到特定服務器上

部分內容,網絡轉載,侵權刪~

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