<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:maven package 和 maven install 有什么區(qū)別?

          共 8724字,需瀏覽 18分鐘

           ·

          2021-09-12 11:51

          你知道的越多,不知道的就越多,業(yè)余的像一棵小草!

          你來(lái),我們一起精進(jìn)!你不來(lái),我和你的競(jìng)爭(zhēng)對(duì)手一起精進(jìn)!

          編輯:業(yè)余草

          segmentfault.com/a/1190000021609439

          推薦:https://www.xttblog.com/?p=5277

          面試官:maven package 和 maven install 有什么區(qū)別?

          ?

          你常用的 maven 命令有哪些?是干什么的?還有用過(guò)其它構(gòu)建工具嗎? 和 maven 有啥區(qū)別?

          ?
          字節(jié)跳動(dòng)面試官

          如果這幾個(gè)問(wèn)題你都可以脫口而出,那你應(yīng)該是有點(diǎn) maven 能耐,寫(xiě)代碼去吧,不用看了。過(guò)。。。

          Maven 是啥?

          Maven 是 Apache 軟件基金會(huì)唯一維護(hù)的一款「自動(dòng)化構(gòu)建工具」,專(zhuān)注于服務(wù)Java 平臺(tái)的「項(xiàng)目構(gòu)建」「依賴(lài)管理」。

          Maven 是基于項(xiàng)目對(duì)象模型(POM),可以通過(guò)一小段描述信息來(lái)管理項(xiàng)目的構(gòu)建、報(bào)告和文檔的軟件項(xiàng)目管理工具。

          Maven可以干啥:

          • 添加第三方 jar 包
          • jar 包之間的依賴(lài)關(guān)系:Maven 可以替我們自動(dòng)的將當(dāng)前 jar 包所依賴(lài)的其他所有 jar 包全部導(dǎo)入進(jìn)來(lái)
          • 獲取第三方 jar 包:Maven 提供了一個(gè)完全統(tǒng)一規(guī)范的 jar 包管理體系,只需要在項(xiàng)目中以坐標(biāo)的方式依賴(lài)一個(gè) jar 包,Maven 就會(huì)自動(dòng)從中央倉(cāng)庫(kù)進(jìn)行下載到本地倉(cāng)庫(kù)
          • 將項(xiàng)目拆分成多個(gè)工程模塊
          • 構(gòu)建項(xiàng)目(打包,編譯等)

          構(gòu)建項(xiàng)目的幾個(gè)主要環(huán)節(jié):

          • 清理(clean):刪除以前的編譯結(jié)果,為重新編譯做好準(zhǔn)備
          • 編譯(compile):將Java 源程序編譯為字節(jié)碼文件
          • 測(cè)試(test):針對(duì)項(xiàng)目中的關(guān)鍵點(diǎn)進(jìn)行測(cè)試,確保項(xiàng)目在迭代開(kāi)發(fā)過(guò)程中關(guān)鍵點(diǎn)的正確性
          • 報(bào)告():在每一次測(cè)試后以標(biāo)準(zhǔn)的格式記錄和展示測(cè)試結(jié)果
          • 打包(package):將一個(gè)包含諸多文件的工程封裝為一個(gè)壓縮文件用于安裝或部署。Java 工程對(duì)應(yīng) jar 包,Web工程對(duì)應(yīng) war 包。
          • 安裝(install):在 Maven 環(huán)境下特指將打包的結(jié)果——jar 包或 war 包安裝到本地倉(cāng)庫(kù)中。
          • 部署(deploy):將打包的結(jié)果部署到遠(yuǎn)程倉(cāng)庫(kù)或?qū)?war 包部署到服務(wù)器上運(yùn)行。

          Maven 常用命令

          • mvn -version/-v 顯示版本信息
          • mvn clean 清空生成的文件
          • mvn compile 編譯
          • mvn test 編譯并測(cè)試
          • mvn package 生成target目錄,編譯、測(cè)試代碼,生成測(cè)試報(bào)告,生成jar/war文件
          • mvn site 生成項(xiàng)目相關(guān)信息的網(wǎng)站
          • mvn clean compile 表示先運(yùn)行清理之后運(yùn)行編譯,會(huì)將代碼編譯到target文件夾中
          • mvn clean package 運(yùn)行清理和打包
          • mvn clean install 運(yùn)行清理和安裝,會(huì)將打好的包安裝到本地倉(cāng)庫(kù)中,以便其他的項(xiàng)目可以調(diào)用
          • mvn clean deploy 運(yùn)行清理和發(fā)布

          Maven 核心概念

          Maven 能夠?qū)崿F(xiàn)自動(dòng)化構(gòu)建是和它的內(nèi)部原理分不開(kāi)的,這里我們從 Maven 的九個(gè)核心概念入手, 看看 Maven 是如何實(shí)現(xiàn)自動(dòng)化構(gòu)建的

          • POM
          • 約定的目錄結(jié)構(gòu)
          • 坐標(biāo)
          • 依賴(lài)管理
          • 倉(cāng)庫(kù)管理
          • 生命周期
          • 插件和目標(biāo)
          • 繼承
          • 聚合

          「Maven 的核心程序中僅僅定義了抽象的生命周期,而具體的操作則是由 Maven 的插件來(lái)完成的」??墒?Maven 的插件并不包含在 Maven 的核心程序中,在首次使用時(shí)需要聯(lián)網(wǎng)下載。下載得到的插件會(huì)被保存到本地倉(cāng)庫(kù)中。本地倉(cāng)庫(kù)默認(rèn)的位置是:~.m2repository。

          Maven 約定的工程目錄

          Maven 約定的工程目錄

          Java開(kāi)發(fā)領(lǐng)域普遍認(rèn)同的一個(gè)觀點(diǎn):「約定 > 配置 > 編碼」(能用配置解決的問(wèn)題就不編碼,能基于約定的就不配置)

          POM

          「Project Object Model:項(xiàng)目對(duì)象模型」。將 Java 工程的相關(guān)信息封裝為對(duì)象作為便于操作和管理的模型。

          Maven 工程的核心配置。

          坐標(biāo)

          • Maven 的坐標(biāo) 使用如下三個(gè)向量在 Maven 的倉(cāng)庫(kù)中唯一的確定一個(gè) Maven 工程。
            • groupid:公司或組織的域名倒序+當(dāng)前項(xiàng)目名稱(chēng)
            • artifactId:當(dāng)前項(xiàng)目的模塊名稱(chēng)
            • version:當(dāng)前模塊的版本
            <groupId>net.lazyegg.maven</groupId>
            <artifactId>Hello</artifactId>
            <version>0.0.1-SNAPSHOT</version>
          • 如何通過(guò)坐標(biāo)到倉(cāng)庫(kù)中查找 jar 包?
            net.lazyegg.maven + Hello + 0.0.1-SNAPSHOT
            • 以連起來(lái)的字符串作為目錄結(jié)構(gòu)到倉(cāng)庫(kù)中查找net/lazyegg/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar
            • 將 gav 三個(gè)向量連起來(lái)

          ※ 注意:我們自己的 Maven 工程必須執(zhí)行安裝操作才會(huì)進(jìn)入倉(cāng)庫(kù)。安裝的命令是:「mvn install」

          依賴(lài)

          Maven 中最關(guān)鍵的部分,我們使用 Maven 最主要的就是使用它的依賴(lài)管理功能。要理解和掌握 Maven 的依賴(lài)管理,我們只需要解決以下幾個(gè)問(wèn)題:

          ① 依賴(lài)的目的是什么

          當(dāng) A jar 包用到了 B jar 包中的某些類(lèi)時(shí),A 就對(duì) B 產(chǎn)生了依賴(lài),這是概念上的描述。那么如何在項(xiàng)目中以依賴(lài)的方式引入一個(gè)我們需要的 jar 包呢?答案非常簡(jiǎn)單,就是使用 dependency 標(biāo)簽指定被依賴(lài) jar 包的坐標(biāo)就可以了。

          <dependency>
              <groupId>net.lazyegg.maven</groupId>
              <artifactId>Hello</artifactId>
              <version>0.0.1-SNAPSHOT</version>
              <scope>compile</scope>            
          </dependency>

          ② 依賴(lài)的范圍

          有時(shí)依賴(lài)信息中除了目標(biāo) jar 包的坐標(biāo)還有一個(gè) scope 設(shè)置,這就是依賴(lài)的范圍。依賴(lài)的范圍有幾個(gè)可選值,常用的有:compile、test、provided 三個(gè),當(dāng)然還有不常用的 runtime、system..

          • 「compile」「默認(rèn)范圍」,編譯測(cè)試運(yùn)行都有效
          • 「provided」:在編譯和測(cè)試時(shí)有效
          • 「runtime」:在測(cè)試和運(yùn)行時(shí)有效
          • test:只在測(cè)試時(shí)有效
          • 「system」:在編譯和測(cè)試時(shí)有效,與本機(jī)系統(tǒng)關(guān)聯(lián),可移植性差
          • 常用依賴(lài)范圍有效性總結(jié)

          compiletestprovided
          主程序×
          測(cè)試程序
          參與部署××

          ③ 依賴(lài)的傳遞性

          A 依賴(lài) B,B 依賴(lài) C,A 能否使用 C 呢?那要看 B 依賴(lài) C 的范圍是不是 compile,如果是則可用,否則不可用。

          ④ 依賴(lài)的排除

          如果我們?cè)诋?dāng)前工程中引入了一個(gè)依賴(lài)是 A,而 A 又依賴(lài)了 B,那么 Maven 會(huì)自動(dòng)將 A 依賴(lài)的 B 引入當(dāng) 前工程,但是個(gè)別情況下 B 有可能是一個(gè)不穩(wěn)定版,或?qū)Ξ?dāng)前工程有不良影響。這時(shí)我們可以在引入 A 的時(shí)候?qū)?B 排除。

          <dependency>
              <groupId>net.lazyegg.maven</groupId>
              <artifactId>Hello</artifactId>
              <version>0.0.1-SNAPSHOT</version>
              <scope>compile</scope>
              <exclusions>
                  <exclusion>
                      <groupId>commons-logging</groupId>
                      <artifactId>commons-logging</artifactId>
                      </exclusion>
              </exclusions>
          </dependency>

          ⑤ 統(tǒng)一管理所依賴(lài)


          統(tǒng)一管理所依賴(lài) jar 包的版本,對(duì)同一個(gè)框架的一組 jar 包最好使用相同的版本。為了方便升級(jí)框架,可以將 jar 包的版本信息統(tǒng)一提取出來(lái)。

          • 統(tǒng)一聲明版本號(hào)
          <properties>
              <starfish.spring.version>4.1.1.RELEASE</starfish.spring.version>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          </properties>
          • 引用前面聲明的版本號(hào)
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-core</artifactId>
              <version>${starfish.spring.version}</version>
              <scope>compile</scope>
          </dependency>

          ⑥ 依賴(lài)的原則:解決 jar 包沖突

          • 路徑最短者優(yōu)先
          • 路徑相同時(shí)先聲明者優(yōu)先

          項(xiàng)目版本沖突時(shí)候的那種蛋疼的感覺(jué),只有疼過(guò)的才知道,所以,我們來(lái)看看疼過(guò)的人是怎么解決的,推薦一個(gè) IDEA 插件,Maven Helper,比自帶的好用,一目了然。

          idea中Maven Helper插件

          倉(cāng)庫(kù)

          • 分類(lèi)
            • 「私服」:架設(shè)在當(dāng)前局域網(wǎng)環(huán)境下,為當(dāng)前局域網(wǎng)范圍內(nèi)的所有 Maven 工程服務(wù)
            • 「中央倉(cāng)庫(kù)」:架設(shè)在 Internet 上,為全世界所有 Maven 工程服務(wù)
            • 「中央倉(cāng)庫(kù)的鏡像」:架設(shè)在各個(gè)大洲,為中央倉(cāng)庫(kù)分擔(dān)流量。減輕中央倉(cāng)庫(kù)的壓力,同時(shí)更快的響應(yīng)用戶(hù)請(qǐng)求,比如阿里的鏡像
            • 本地倉(cāng)庫(kù):為當(dāng)前本機(jī)電腦上的所有 Maven 工程服務(wù)
            • 遠(yuǎn)程倉(cāng)庫(kù)
          • 倉(cāng)庫(kù)中的文件
            • Maven 的插件
            • 我們自己開(kāi)發(fā)的項(xiàng)目的模塊
            • 第三方框架或工具的 jar 包

          ※ 不管是什么樣的 jar 包,在倉(cāng)庫(kù)中都是按照坐標(biāo)生成目錄結(jié)構(gòu),所以可以通過(guò)統(tǒng)一的方式查詢(xún)或依賴(lài),查詢(xún)地址:http://mvnrepository.com。

          生命周期

          什么是 Maven 的生命周期?

          Maven 生命周期定義了各個(gè)構(gòu)建環(huán)節(jié)的執(zhí)行順序,有了這個(gè)清單,Maven 就可以自動(dòng)化的執(zhí)行構(gòu)建命令了。

          Maven 有三套相互獨(dú)立的生命周期,分別是:

          • 「Clean Lifecycle」 在進(jìn)行真正的構(gòu)建之前進(jìn)行一些清理工作
          • 「Default Lifecycle」 構(gòu)建的核心部分,編譯,測(cè)試,打包,安裝,部署等等
          • 「Site Lifecycle」 生成項(xiàng)目報(bào)告,站點(diǎn),發(fā)布站點(diǎn)

          它們是相互獨(dú)立的,你可以?xún)H僅調(diào)用 clean 來(lái)清理工作目錄,僅僅調(diào)用 site 來(lái)生成站點(diǎn)。當(dāng)然你也可以直接運(yùn)行 「mvn clean install site」 運(yùn)行所有這三套生命周期。每套生命周期都由一組階段(Phase)組成,我們平時(shí)在命令行輸入的命令總會(huì)對(duì)應(yīng)于一個(gè)特定的階段。比 如,運(yùn)行 mvn clean,這個(gè) clean 是 Clean 生命周期的一個(gè)階段。有 Clean 生命周期,也有 clean 階段。

          Clean 生命周期

          Clean 生命周期一共包含了三個(gè)階段:

          • pre-clean 執(zhí)行一些需要在 clean 之前完成的工作
          • clean 移除所有上一次構(gòu)建生成的文件
          • post-clean 執(zhí)行一些需要在 clean 之后立刻完成的工作

          Site 生命周期

          • pre-site 執(zhí)行一些需要在生成站點(diǎn)文檔之前完成的工作
          • site 生成項(xiàng)目的站點(diǎn)文檔
          • post-site 執(zhí)行一些需要在生成站點(diǎn)文檔之后完成的工作,并且為部署做準(zhǔn)備
          • site-deploy 將生成的站點(diǎn)文檔部署到特定的服務(wù)器上 這里經(jīng)常用到的是 site 階段和 site-deploy 階段,用以生成和發(fā)布 Maven 站點(diǎn),這可是 Maven 相當(dāng)強(qiáng)大 的功能,Manager 比較喜歡,文檔及統(tǒng)計(jì)數(shù)據(jù)自動(dòng)生成,很好看。

          Default 生命周期

          Default 生命周期是 Maven 生命周期中最重要的一個(gè),絕大部分工作都發(fā)生在這個(gè)生命周期中(列出一些重要階段)

          • validate:驗(yàn)證工程是否正確,所有需要的資源是否可用。
          • compile:編譯項(xiàng)目的源代碼。
          • test:使用合適的單元測(cè)試框架來(lái)測(cè)試已編譯的源代碼。這些測(cè)試不需要已打包和布署。
          • package:把已編譯的代碼打包成可發(fā)布的格式,比如 jar、war 等。
          • integration-test:如有需要,將包處理和發(fā)布到一個(gè)能夠進(jìn)行集成測(cè)試的環(huán)境。
          • verify:運(yùn)行所有檢查,驗(yàn)證包是否有效且達(dá)到質(zhì)量標(biāo)準(zhǔn)。
          • install:把包安裝到 maven 本地倉(cāng)庫(kù),可以被其他工程作為依賴(lài)來(lái)使用。
          • deploy:在集成或者發(fā)布環(huán)境下執(zhí)行,將最終版本的包拷貝到遠(yuǎn)程的repository,使得其他的開(kāi)發(fā)者或者工程可以共享

          生命周期與自動(dòng)化構(gòu)建

          「運(yùn)行任何一個(gè)階段的時(shí)候,它前面的所有階段都會(huì)被運(yùn)行」,例如我們運(yùn)行 mvn install 的時(shí)候,代碼會(huì)被編譯,測(cè)試,打包。這就是 Maven 為什么能夠自動(dòng)執(zhí)行構(gòu)建過(guò)程的各個(gè)環(huán)節(jié)的原因。此外,Maven 的插件機(jī)制是完全依賴(lài) Maven 的生命周期的,因此理解生命周期至關(guān)重要。

          插件和目標(biāo)

          • Maven 的核心僅僅定義了抽象的生命周期,具體的任務(wù)都是交由插件完成的
          • 每個(gè)插件都能實(shí)現(xiàn)多個(gè)功能,每個(gè)功能就是一個(gè)插件目標(biāo)
          • Maven 的生命周期與插件目標(biāo)相互綁定,以完成某個(gè)具體的構(gòu)建任務(wù)

          例如:compile 就是插件 maven-compiler-plugin 的一個(gè)目標(biāo);pre-clean 是插件 maven-clean-plugin 的一個(gè)目標(biāo)

          繼承

          • 為什么需要繼承機(jī)制?

            由于非 compile 范圍的依賴(lài)信息是不能在“依賴(lài)鏈”中傳遞的,所以有需要的工程只能單獨(dú)配置

          • 創(chuàng)建父工程 創(chuàng)建父工程和創(chuàng)建一般的 Java 工程操作一致,唯一需要注意的是:打包方式處要設(shè)置為 pom

          • 在子工程中引用父工程 ,從當(dāng)前目錄到父項(xiàng)目的 pom.xml 文件的相對(duì)路徑

           <parent>
               <groupId>com.starfish.maven</groupId>
              <artifactId>Parent</artifactId>
              <version>0.0.1-SNAPSHOT</version>
              <!-- 以當(dāng)前文件為基準(zhǔn)的父工程pom.xml文件的相對(duì)路徑 -->
              <relativePath>../Parent/pom.xml</relativePath>
          </parent>

          此時(shí)如果子工程的 groupId 和 version 如果和父工程重復(fù)則可以刪除。

          • 在父工程中管理依賴(lài) 將 Parent 項(xiàng)目中的 dependencies 標(biāo)簽,用 「dependencyManagement」 標(biāo)簽括起來(lái)
          <dependencyManagement>
              <dependencies>
                  <dependency>
                      <groupId>junit</groupId>
                      <artifactId>junit</artifactId>
                      <version>4.9</version>
                      <scope>test</scope>
                  </dependency>
              </dependencies>
          </dependencyManagement> 

          在子項(xiàng)目中重新指定需要的依賴(lài),刪除范圍和版本號(hào)

          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
          </dependency>

          聚合

          • 為什么要使用聚合?

          將多個(gè)工程拆分為模塊后,需要手動(dòng)逐個(gè)安裝到倉(cāng)庫(kù)后依賴(lài)才能夠生效。修改源碼后也需要逐個(gè)手動(dòng)進(jìn) 行 clean 操作。而使用了聚合之后就可以批量進(jìn)行 Maven 工程的安裝、清理工作。

          如何配置聚合?在總的聚合工程中使用 modules/module 標(biāo)簽組合,指定模塊工程的相對(duì)路徑即可

          <!-- 配置聚合 -->
          <modules>
              <!-- 指定各個(gè)子工程的相對(duì)路徑 -->
              <module>starfish-learn-grpc</module>
              <module>starfish-learn-kafka</module>
              <module>starfish-web-demo</module>
          </modules>

          以上內(nèi)容看完,應(yīng)該有所收獲吧,喜歡的朋友,可以幫忙點(diǎn)個(gè)贊??!

          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线的欧美成网站 | 国产精品无码插逼 | 丁香花高清在线完整版 | 人人澡人人舔 | 国产美女操逼 |