最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章帶你搞定JAVA Maven

 更新時(shí)間:2021年07月14日 09:38:42   作者:香菜聊游戲  
Maven是每個(gè)Java程序都會(huì)遇到的包管理工具,今天整理一下Maven的相關(guān)知識(shí),從青銅到王者,一文全了解,我們開始吧,希望對(duì)你有所幫助

1、maven是什么,為什么存在?項(xiàng)目結(jié)構(gòu)是什么樣子,怎么定位jar

官方網(wǎng)站說了好多,整的多復(fù)雜一樣,簡單說:maven是一個(gè)管理包的工具。

Maven 存在的必要性是什么吶?想想開源的jar包如此之多,版本又如此之多,在沒有Maven之前,我們管理jar包全部都是下載之后創(chuàng)建一個(gè)lib的文件夾,然后項(xiàng)目進(jìn)行引用,在其他的項(xiàng)目成員需要修改一個(gè)jar的時(shí)候需要到處拷貝,在部署的時(shí)候也很麻煩,問題存在就要解決,因此出現(xiàn)了Maven,統(tǒng)一管理,統(tǒng)一的倉庫,只需要配置是要哪個(gè)版本的包,直接下載就夠了,不用拷貝,是不是很方便。

現(xiàn)在大的問題解決了,怎么定位一個(gè)jar包吶?

圖片

2、Idea 的操作

1.新建maven項(xiàng)目

File ->新建->project

圖片

勾選從原型(模板)創(chuàng)建,選擇maven-archetype-qiuckstart

圖片

填入項(xiàng)目的名字,和groupId (公司域名反過來,如com.alibaba)

圖片

選擇本地倉庫的位置,和自定義的setting配置

圖片

一路finish,然后等待idea 創(chuàng)建模板項(xiàng)目就好了。

2.配置倉庫

Maven 倉庫有三種類型:

  • 本地(local)
  • 中央(central)
  • 遠(yuǎn)程(remote)

當(dāng)我們執(zhí)行 Maven 構(gòu)建命令時(shí),Maven 開始按照以下順序查找依賴的庫

步驟 1 - 在本地倉庫中搜索,如果找不到,執(zhí)行步驟 2,如果找到了則執(zhí)行其他操作。

步驟 2 - 在中央倉庫中搜索,如果找不到,并且有一個(gè)或多個(gè)遠(yuǎn)程倉庫已經(jīng)設(shè)置,則執(zhí)行步驟 4,如果找到了則下載到本地倉庫中以備將來引用。

步驟 3 - 如果遠(yuǎn)程倉庫沒有被設(shè)置,Maven 將簡單的停滯處理并拋出錯(cuò)誤(無法找到依賴的文件)。

步驟 4 - 在一個(gè)或多個(gè)遠(yuǎn)程倉庫中搜索依賴的文件,如果找到則下載到本地倉庫以備將來引用,否則 Maven 將停止處理并拋出錯(cuò)誤(無法找到依賴的文件)。

阿里云倉庫配置:

 <repositories>
       <repository>
           <id>central</id>
           <name>aliyun maven</name>
           <url>https://maven.aliyun.com/repository/public/</url>
           <layout>default</layout>
           <!-- 是否開啟發(fā)布版構(gòu)件下載 -->
           <releases>
               <enabled>true</enabled>
           </releases>
           <!-- 是否開啟快照版構(gòu)件下載 -->
           <snapshots>
               <enabled>false</enabled>
           </snapshots>
       </repository>
   </repositories>

3.添加依賴,添加fastjson的依賴

舉個(gè)例子:

  <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
       </dependency>

4.打包項(xiàng)目

圖片

3、Maven坐標(biāo)主要組成

  • groupId:組織標(biāo)識(shí)(包名),一般常用公司域名的反序,比如com.alibaba
  • artifactId:項(xiàng)目名稱,項(xiàng)目的具體名稱
  • version:項(xiàng)目的當(dāng)前版本 ,一般版本號(hào)為 大版本.小版本.小版本序號(hào)
  • packaging:項(xiàng)目的打包方式,最為常見的jar和war兩種

4、maven生命周期

4.1 名詞解釋

lifecycle:生命周期,這是maven最高級(jí)別的的控制單元,它是一系列的phase組成,也就是說,一個(gè)生命周期,就是一個(gè)大任務(wù)的總稱,不管它里面分成多少個(gè)子任務(wù),反正就是運(yùn)行一個(gè)lifecycle,就是交待了一個(gè)任務(wù),運(yùn)行完后,就得到了一個(gè)結(jié)果,中間的過程,是phase完成的,自己可以定義自己的lifecycle,包含自己想要的phase

phase:可以理解為任務(wù)單元,lifecycle是總?cè)蝿?wù),phase就是總?cè)蝿?wù)分出來的一個(gè)個(gè)子任務(wù),但是這些子任務(wù)是被規(guī)格化的,它可以同時(shí)被多個(gè)lifecycle所包含,一個(gè)lifecycle可以包含任意個(gè)phase,phase的執(zhí)行是按順序的,一個(gè)phase可以綁定很多個(gè)goal,至少為一個(gè),沒有g(shù)oal的phase是沒有意義的

goal: 這是執(zhí)行任務(wù)的最小單元,它可以綁定到任意個(gè)phase中,一個(gè)phase有一個(gè)或多個(gè)goal,goal也是按順序執(zhí)行的,一個(gè)phase被執(zhí)行時(shí),綁定到phase里的goal會(huì)按綁定的時(shí)間被順序執(zhí)行,不管phase己經(jīng)綁定了多少個(gè)goal,你自己定義的goal都可以繼續(xù)綁到phase中

mojo: lifecycle與phase與goal都是概念上的東西,mojo才是做具體事情的,可以簡單理解mojo為goal的實(shí)現(xiàn)類,它繼承于AbstractMojo,有一個(gè)execute方法,goal等的定義都是通過在mojo里定義一些注釋的anotation來實(shí)現(xiàn)的,maven會(huì)在打包時(shí),自動(dòng)根據(jù)這些anotation生成一些xml文件,放在plugin的jar包里

可以通俗理解為lifecyle 是一個(gè)公司,phrase 是具體的部門,goal 是一個(gè)項(xiàng)目,Mojo 是項(xiàng)目內(nèi)部的人,其他的都是管理層級(jí),具體的執(zhí)行還是人。

4.2 生命周期

圖片

4.3 goal 的概念

一個(gè)goal是獨(dú)立的,它可以被綁定到多個(gè)phase中去,也可以一個(gè)phase都沒有。如果一個(gè)goal沒有被綁定到任何一個(gè)lifecycle,它仍然可以直接被調(diào)用,而不是被lifecycle調(diào)用。

因此可以這樣理解phase與goal的關(guān)系:

1.phase其實(shí)就是goal的容器。實(shí)際被執(zhí)行的都是goal。phase被執(zhí)行時(shí),實(shí)際執(zhí)行的都是被綁定到該phase的goal。

2.goal與goal之間是獨(dú)立的。因此單獨(dú)執(zhí)行一個(gè)goal不會(huì)導(dǎo)致其他goal被執(zhí)行。

goal可以通俗理解為一個(gè)項(xiàng)目。

4.4 生命周期和phase的關(guān)系

clean生命周期每套生命周期都由一組階段(Phase)組成,我們平時(shí)在命令行輸入的命令總會(huì)對(duì)應(yīng)于一個(gè)特定的階段。比如,運(yùn)行mvn clean ,這個(gè)的clean是Clean生命周期的一個(gè)階段。有Clean生命周期,也有clean階段。Clean生命周期一共包含了三個(gè)階段:

1.pre-clean 執(zhí)行一些需要在clean之前完成的工作

2.clean 移除所有上一次構(gòu)建生成的文件

3.post-clean 執(zhí)行一些需要在clean之后立刻完成的工作

"mvn clean" 中的clean就是上面的clean,在一個(gè)生命周期中,運(yùn)行某個(gè)階段的時(shí)候,它之前的所有階段都會(huì)被運(yùn)行,也就是說,"mvn clean"等同于 mvn pre-clean clean ,如果我們運(yùn)行 mvn post-clean ,那么 pre-clean,clean 都會(huì)被運(yùn)行。這是Maven很重要的一個(gè)規(guī)則,可以大大簡化命令行的輸入

執(zhí)行phase實(shí)際執(zhí)行的是goal。如果一個(gè)phase沒有綁定goal,那這個(gè)phase就不會(huì)被執(zhí)行。

<plugin>
  <groupId>com.mycompany.example</groupId>
  <artifactId>display-maven-plugin</artifactId>
  <version>1.0</version>
  <executions>
    <execution>
      <phase>process-test-resources</phase>
      <goals>
        <goal>time</goal>
      </goals>
    </execution>
  </executions>
</plugin>

一個(gè)生命周期包含一些列的步驟,當(dāng)執(zhí)行生命周期的時(shí)候,會(huì)把所有的步驟執(zhí)行一次

官方文檔:

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

http://maven.apache.org/ref/3.3.9/maven-core/lifecycles.html

5、idea maven的配置

POM 中可以指定以下配置:

  • 項(xiàng)目依賴 dependencies
  • 插件 plugins
  • 執(zhí)行目標(biāo)
  • 項(xiàng)目構(gòu)建 profile
  • 項(xiàng)目版本
  • 項(xiàng)目開發(fā)者列表
  • 相關(guān)郵件列表信息

6、POM有2個(gè)很重要的關(guān)系:聚合、繼承

一、聚合

如果我們想一次構(gòu)建多個(gè)項(xiàng)目模塊,那我們就需要對(duì)多個(gè)項(xiàng)目模塊進(jìn)行聚合

1.聚合配置代碼

<modules>
      <module>模塊一</module>
      <module>模塊二</module>
      <module>模塊三</module>
</modules>

  例如:對(duì)項(xiàng)目的Hello、HelloFriend、MakeFriends這三個(gè)模塊進(jìn)行聚合

<modules>
      <module>../Hello</module>  
      <module>../HelloFriend</module>        
      <module>../MakeFriends</module>
</modules>

其中module的路徑為相對(duì)路徑。

二、繼承

  繼承為了消除重復(fù)的配置,我們把很多相同的配置提取出來,例如:grouptId,version,相同的依賴包等。

繼承配置代碼:

<parent>  
         <groupId>me.gacl.maven</groupId>
         <artifactId>ParentProject</artifactId>
         <version>0.0.1-SNAPSHOT</version>
         <relativePath>../ParentProject/pom.xml</relativePath>  
</parent>

Idea 中可以新建一個(gè)maven項(xiàng)目,然后刪光文件夾,只留一個(gè)pom.xml,然后添加模塊,選擇繼承。

圖片

7、Maven 中的 profile

  • Maven 中有一個(gè)概念叫做:profile,它主要是為了解決不同環(huán)境所需的不同變量、配置等問題。比如我們內(nèi)網(wǎng)開發(fā)的數(shù)據(jù)庫配置,端口配置等是和生產(chǎn)環(huán)境不同的,這個(gè)時(shí)候就需要區(qū)分。
  • 有了 profile,可以根據(jù)激活的條件,啟動(dòng)不同條件下的配置信息。
  • profile 是可以有多個(gè)的,也可以同時(shí)激活多個(gè) profile,方便自由組合。
<profiles>
       <profile>
           <!--不同環(huán)境Profile的唯一id-->
           <!--開發(fā)環(huán)境-->
           <id>dev</id>
           <properties>
               <!--profiles.active是自定義的字段(名字隨便起),自定義字段可以有多個(gè)-->
               <profiles.active>dev</profiles.active>
           </properties>
       </profile>
       <profile>
           <!--線上環(huán)境-->
           <id>prod</id>
           <properties>
               <profiles.active>prod</profiles.active>
           </properties>
           <activation>
               <activeByDefault>true</activeByDefault>
           </activation>
       </profile>
   </profiles>

圖片

Idea 中會(huì)顯示配置的兩個(gè)profile ,可以選擇激活

圖片

pom文件里的配置為

<build>
       <resources>
           <resource>
               <directory>src/main/resources/</directory>
               <!--先排除掉兩個(gè)文件夾-->
               <excludes>
                   <exclude>dev/*</exclude>
                   <exclude>prod/*</exclude>
               </excludes>
               <includes>
                   <!--如果有其他定義通用文件,需要包含進(jìn)來-->
                   <!--<include>messages/*</include>-->
               </includes>
           </resource>
           <resource>
               <!--這里是關(guān)鍵!根據(jù)不同的環(huán)境,把對(duì)應(yīng)文件夾里的配置文件打包-->
               <directory>src/main/resources/${profiles.active}</directory>
           </resource>
       </resources>
   </build>
  <profiles>
       <profile>
           <!--不同環(huán)境Profile的唯一id-->
           <!--開發(fā)環(huán)境-->
           <id>dev</id>
           <properties>
               <!--profiles.active是自定義的字段(名字隨便起),自定義字段可以有多個(gè)-->
               <profiles.active>dev</profiles.active>
           </properties>
       </profile>
       <profile>
           <!--線上環(huán)境-->
           <id>prod</id>
           <properties>
               <profiles.active>prod</profiles.active>
           </properties>
           <activation>
               <activeByDefault>true</activeByDefault>
           </activation>
       </profile>
   </profiles>

8、maven 插件

Maven的核心僅僅定義了抽象的生命周期,具體的任務(wù)都是交由插件完成的。

每個(gè)插件都能實(shí)現(xiàn)多個(gè)功能,每個(gè)功能就是一個(gè)插件目標(biāo)goal。

Maven的生命周期與插件目標(biāo)相互綁定,以完成某個(gè)具體的構(gòu)建任務(wù),例如compile就是插件maven-compiler-plugin的一個(gè)插件目標(biāo)。

常用插件:

maven-antrun-plugin maven-archetype-plugin maven-assembly-plugin maven-dependency-plugin maven-enforcer-plugin maven-help-plugin maven-release-plugin maven-resources-plugin maven-surefire-plugin build-helper-maven-plugin exec-maven-plugin jetty-maven-plugin versions-maven-plugin

9、環(huán)境變量

${basedir}表示項(xiàng)目根目錄,即包含pom.xml文件的目錄;

${version}表示項(xiàng)目版本;

${project.basedir}同${basedir};

${project.baseUri}表示項(xiàng)目文件地址;

${maven.build.timestamp}表示項(xiàng)目構(gòu)件開始時(shí)間;

${maven.build.timestamp.format}表示屬性${maven.build.timestamp}的展示格式,默認(rèn)值為yyyyMMdd-HHmm,可自定義其格式,其類型可參考java.text.SimpleDateFormat。

${project.build.directory}表示主源碼路徑;

${project.build.sourceEncoding}表示主源碼的編碼格式;

${project.build.sourceDirectory}表示主源碼路徑;

${project.build.finalName}表示輸出文件名稱;

${project.version}表示項(xiàng)目版本,與${version}相同;

${project.xxx} 當(dāng)前pom文件的任意節(jié)點(diǎn)的內(nèi)容

${env.xxx} 獲取系統(tǒng)環(huán)境變量。

${settings.xxx} 指代了settings.xml中對(duì)應(yīng)元素的值。

10、Maven 依賴沖突的2個(gè)方法

1.統(tǒng)一版本

使用dependencyManagement 進(jìn)行版本鎖定,dependencyManagement可以統(tǒng)一管理項(xiàng)目的版本號(hào),確保應(yīng)用的各個(gè)項(xiàng)目的依賴和版本一致。

如果我們項(xiàng)目中只想使用spring core 5.2.0的包,pom.xml可以改為如下

<dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-core</artifactId>
               <version>5.2.0.RELEASE</version>
           </dependency>
       </dependencies>
   </dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>5.2.7.RELEASE</version>
       </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-aop</artifactId>
           <version>5.2.0.RELEASE</version>
       </dependency>
   </dependencies>

2.排除依賴

依賴查找的兩個(gè)原則:

使用路徑近者優(yōu)先原則:直接依賴級(jí)別高于傳遞依賴。

使用第一聲明者優(yōu)先原則:誰先定義的就用誰的傳遞依賴,即在pom.xml文件自上而下,先聲明的jar坐標(biāo),就先引用該jar的傳遞依賴。

Idea 可以安裝maven helper插件,解決沖突。

maven helper插件安裝成功,點(diǎn)開pom.xml會(huì)發(fā)現(xiàn)多了一個(gè)Dependency Analyzer視圖,如下上面按鈕的圖標(biāo)含義如下

Conflicts(查看沖突)

All Dependencies as List(列表形式查看所有依賴)

All Dependencies as Tree(樹形式查看所有依賴)

上圖說明有3個(gè)jar存在沖突,點(diǎn)擊沖突的jar,可以查看和哪個(gè)jar產(chǎn)生沖突,如下圖

圖片

點(diǎn)開pom.xml,切換到Dependency Analyzer視圖,選擇All Dependencies as Tree,點(diǎn)擊要排除的jar,右鍵會(huì)出現(xiàn)Execlude選項(xiàng),如下

圖片

11、scope

scope取值 有效范圍(compile, runtime, test) 依賴傳遞 例子
compile all spring-core
provided compile, test servlet-api
runtime runtime, test JDBC驅(qū)動(dòng)
test test JUnit
system compile, test

compile :為默認(rèn)的依賴有效范圍。如果在定義依賴關(guān)系的時(shí)候,沒有明確指定依賴有效范圍的話,則默認(rèn)采用該依賴有效范圍。此種依賴,在編譯、運(yùn)行、測試時(shí)均有效。

provided :在編譯、測試時(shí)有效,但是在運(yùn)行時(shí)無效。例如:servlet-api,運(yùn)行項(xiàng)目時(shí),容器已經(jīng)提供,就不需要Maven重復(fù)地引入一遍了。

runtime :在運(yùn)行、測試時(shí)有效,但是在編譯代碼時(shí)無效。例如:JDBC驅(qū)動(dòng)實(shí)現(xiàn),項(xiàng)目代碼編譯只需要JDK提供的JDBC接口,只有在測試或運(yùn)行項(xiàng)目時(shí)才需要實(shí)現(xiàn)上述接口的具體JDBC驅(qū)動(dòng)。

test :只在測試時(shí)有效,例如:JUnit。

system :在編譯、測試時(shí)有效,但是在運(yùn)行時(shí)無效。和provided的區(qū)別是,使用system范圍的依賴時(shí)必須通過systemPath元素顯式地指定依賴文件的路徑。由于此類依賴不是通過Maven倉庫解析的,而且往往與本機(jī)系統(tǒng)綁定,可能造成構(gòu)建的不可移植,因此應(yīng)該謹(jǐn)慎使用。systemPath元素可以引用環(huán)境變量。

總結(jié):

Maven是開發(fā)中常用的工具,很重要,所以盡可能的掌握。

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 淺談idea中導(dǎo)入maven項(xiàng)目的兩種方式

    淺談idea中導(dǎo)入maven項(xiàng)目的兩種方式

    本文主要介紹了淺談idea中導(dǎo)入maven項(xiàng)目的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Java 中的 getDeclaredMethods() 方法(使用與原理)

    Java 中的 getDeclaredMethods() 方法(使用與原理)

    文章介紹了Java反射機(jī)制中的`getDeclaredMethods()`方法,詳細(xì)講解了其使用方法、原理、注意事項(xiàng)以及實(shí)際應(yīng)用場景,幫助讀者更好地理解和應(yīng)用這一強(qiáng)大的工具,感興趣的朋友一起看看吧
    2024-12-12
  • springmvc整合ssm配置的詳細(xì)代碼

    springmvc整合ssm配置的詳細(xì)代碼

    今天通過實(shí)例代碼給大家介紹了springmvc整合ssm配置的詳細(xì)方法,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • Java System類兩個(gè)常用方法代碼實(shí)例

    Java System類兩個(gè)常用方法代碼實(shí)例

    這篇文章主要介紹了Java System類兩個(gè)常用方法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring AOP實(shí)現(xiàn)Redis緩存數(shù)據(jù)庫查詢?cè)创a

    Spring AOP實(shí)現(xiàn)Redis緩存數(shù)據(jù)庫查詢?cè)创a

    這篇文章主要介紹了Spring AOP實(shí)現(xiàn)Redis緩存數(shù)據(jù)庫查詢的相關(guān)內(nèi)容,源碼部分還是不錯(cuò)的,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot集成Nacos的詳細(xì)教程

    SpringBoot集成Nacos的詳細(xì)教程

    這篇文章主要介紹了SpringBoot集成Nacos的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

    Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

    這篇文章主要介紹了Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖,本文講解了ReentrantLock概況、Lock接口、Lock使用、輪詢鎖的和定時(shí)鎖、公平性、可中斷獲鎖獲取操作等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • SpringLDAP連接LDAPS證書報(bào)錯(cuò)問題及解決

    SpringLDAP連接LDAPS證書報(bào)錯(cuò)問題及解決

    這篇文章主要介紹了SpringLDAP連接LDAPS證書報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 淺談Java中的克隆close()和賦值引用的區(qū)別

    淺談Java中的克隆close()和賦值引用的區(qū)別

    下面小編就為大家?guī)硪黄獪\談Java中的克隆close()和賦值引用的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java使用split截取字符串過程解析

    Java使用split截取字符串過程解析

    這篇文章主要介紹了Java使用split截取字符串過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

三穗县| 乐安县| 大关县| 鹤岗市| 炉霍县| 错那县| 隆尧县| 衢州市| 平邑县| 浦县| 阿拉尔市| 西峡县| 乐业县| 托里县| 河北区| 丰镇市| 和平区| 通化县| 九江县| 门源| 出国| 博乐市| 汉中市| 新兴县| 济源市| 泗水县| 海伦市| 凌海市| 永年县| 岚皋县| 湘阴县| 克山县| 宕昌县| 老河口市| 新乡县| 东港市| 莎车县| 长沙市| 锡林浩特市| 淮南市| 武山县|