国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Maven進(jìn)階學(xué)習(xí)指南

這篇具有很好參考價(jià)值的文章主要介紹了Maven進(jìn)階學(xué)習(xí)指南。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

當(dāng)我們?cè)陂_(kāi)發(fā)項(xiàng)目時(shí),有時(shí)需要用到外部依賴組件,例如當(dāng)我們需要Json序列化的時(shí)候需要用到FastJson組件,我們可以通過(guò)下載對(duì)應(yīng)jar包加載到項(xiàng)目中。但當(dāng)一個(gè)大的項(xiàng)目同時(shí)需要依賴各種各樣的外部服務(wù),就存在著配置繁瑣、依賴沖突等問(wèn)題,因此可以通過(guò)maven來(lái)完成對(duì)應(yīng)的依賴管理功能。

一、Settings配置

settings.xml用來(lái)配置maven項(xiàng)目中的各種參數(shù)文件,包括本地倉(cāng)庫(kù)、遠(yuǎn)程倉(cāng)庫(kù)、私服、認(rèn)證等信息。

1.1 配置概述

1.1.1 全局settings、用戶setting、pom的區(qū)別

  • 全局 settings.xml 是 maven 的全局配置文件,一般位于${maven.home}/conf/settings.xml,即maven文件夾下的conf中。
  • 用戶 setting是maven的用戶配置文件,一般位于${user.home}/.m2/settings.xml,即每位用戶都有一份配置文件。
  • pom.xml 文件是項(xiàng)目配置文件,一般位于項(xiàng)目根目錄下或子目錄下。

配置優(yōu)先級(jí)從高到低:pom.xml > 本地 settings > 全局 settings

如果這些文件同時(shí)存在,在應(yīng)用配置時(shí),會(huì)合并它們的內(nèi)容,如果有重復(fù)的配置,優(yōu)先級(jí)高的配置會(huì)覆蓋優(yōu)先級(jí)低的。

1.1.2 倉(cāng)庫(kù)【重要】

如前言所述,我們依賴的外部服務(wù)是需要有地方進(jìn)行存儲(chǔ)的,而存儲(chǔ)的地方就稱之為倉(cāng)庫(kù)。其中倉(cāng)庫(kù)又分為本地倉(cāng)庫(kù)、中央倉(cāng)庫(kù)、鏡像倉(cāng)庫(kù)、私服。

其對(duì)應(yīng)關(guān)系為:

Maven進(jìn)階學(xué)習(xí)指南

(1)本地倉(cāng)庫(kù)

當(dāng)項(xiàng)目在本地編譯或運(yùn)行時(shí),直接加載本地的依賴服務(wù)無(wú)疑是最快的。默認(rèn)情況下,不管在Window還是Linux下,每個(gè)用戶在自己用戶目錄下都有一個(gè)路徑名為.m2/repository/的倉(cāng)庫(kù)目錄。

而原始的本地倉(cāng)庫(kù)是為空的,因此maven需要知道一個(gè)網(wǎng)絡(luò)上的倉(cāng)庫(kù),在本地倉(cāng)庫(kù)不存在時(shí)前往下載網(wǎng)絡(luò)上的倉(cāng)庫(kù),也就是遠(yuǎn)程倉(cāng)庫(kù)。

(2)中央倉(cāng)庫(kù)

當(dāng)maven未配置時(shí),會(huì)默認(rèn)請(qǐng)求maven的中央倉(cāng)庫(kù),中央倉(cāng)庫(kù)包含了這個(gè)世界上絕大多數(shù)流行的開(kāi)源java構(gòu)件,以及源碼、作者信息、SCM,信息、許可證信息等,每個(gè)月這里都會(huì)接受全世界java程序員大概1億次的訪問(wèn),它對(duì)全世界java開(kāi)發(fā)者的貢獻(xiàn)由此可見(jiàn)一斑。

但是由于最常見(jiàn)的例如網(wǎng)絡(luò)原因等,國(guó)外的中央倉(cāng)庫(kù)使用起來(lái)并不順利,因此就有了下載地址為國(guó)內(nèi)的中央倉(cāng)庫(kù),也就是鏡像倉(cāng)庫(kù)。

(3)鏡像倉(cāng)庫(kù)

總結(jié)來(lái)說(shuō),鏡像倉(cāng)庫(kù)就是將國(guó)外的中心倉(cāng)庫(kù)復(fù)制一份到國(guó)內(nèi),這樣一來(lái)下載速度以及訪問(wèn)速度都將很快。

(4)私服

一般來(lái)說(shuō)中央倉(cāng)庫(kù)或者鏡像倉(cāng)庫(kù)都能滿足我們的需求,但是當(dāng)我們?cè)诠緝?nèi)合作開(kāi)發(fā)代碼時(shí),可能因?yàn)橄到y(tǒng)保密性原因,有一些其他同事開(kāi)發(fā)的外部依賴只希望能夠被本公司的人使用,而如果上傳到鏡像倉(cāng)庫(kù)則保密性就不復(fù)存在了。因此私服最主要的功能時(shí)存儲(chǔ)一些公司內(nèi)部不希望被公開(kāi)的依賴服務(wù)。

1.2 settings配置詳解

settings.xml配置了本地全局maven的相關(guān)配置。

以下是一份seetings.xml的文件配置頂級(jí)元素。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">
      <localRepository>
      <interactiveMode>
      <usePluginRegistry>
      <offline>
      <pluginGroups>
      <servers>
      <mirrors>
      <proxies>
      <profiles>
      <activeProfiles>
</settings>

1.2.1 localRepository

用來(lái)標(biāo)識(shí)本地倉(cāng)庫(kù)的位置

D:/Maven/Repository

1.2.2 interactiveMode

maven 是否需要和用戶交互以獲得輸入。默認(rèn)為true。

true

1.2.3 usePluginRegistry

maven 是否需要使用 plugin-registry.xml 文件來(lái)管理插件版本。

false

1.2.4 offline

用來(lái)標(biāo)識(shí)是否以離線模式運(yùn)營(yíng)maven。

當(dāng)系統(tǒng)不能聯(lián)網(wǎng)時(shí),可以通過(guò)次配置來(lái)離線運(yùn)行。

false

1.2.5 servers

當(dāng)使用maven私服時(shí),某些私服需要配置認(rèn)證信息,需要在此處填寫(xiě)相應(yīng)的配置。之所以不寫(xiě)在pom.xml中是因?yàn)橐话沩?xiàng)目在上傳至代碼倉(cāng)庫(kù)時(shí)同樣會(huì)將pom.xml上傳,而setting.xml一般位于用戶本地,因此相對(duì)比較安全。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      https://maven.apache.org/xsd/settings-1.0.0.xsd">
  ...
  <!--配置服務(wù)端的一些設(shè)置。一些設(shè)置如安全證書(shū)不應(yīng)該和pom.xml一起分發(fā)。這種類型的信息應(yīng)該存在于構(gòu)建服務(wù)器上的settings.xml文件中。 -->
  <servers>
    <!--服務(wù)器元素包含配置服務(wù)器時(shí)需要的信息 -->
    <server>
      <!--這是server的id(注意不是用戶登陸的id),該id與distributionManagement中repository元素的id相匹配。 -->
      <id>server001</id>
      <!--鑒權(quán)用戶名。鑒權(quán)用戶名和鑒權(quán)密碼表示服務(wù)器認(rèn)證所需要的登錄名和密碼。 -->
      <username>my_login</username>
      <!--鑒權(quán)密碼 。鑒權(quán)用戶名和鑒權(quán)密碼表示服務(wù)器認(rèn)證所需要的登錄名和密碼。密碼加密功能已被添加到2.1.0 +。詳情請(qǐng)?jiān)L問(wèn)密碼加密頁(yè)面 -->
      <password>my_password</password>
      <!--鑒權(quán)時(shí)使用的私鑰位置。和前兩個(gè)元素類似,私鑰位置和私鑰密碼指定了一個(gè)私鑰的路徑(默認(rèn)是${user.home}/.ssh/id_dsa)以及如果需要的話,一個(gè)密語(yǔ)。將來(lái)passphrase和password元素可能會(huì)被提取到外部,但目前它們必須在settings.xml文件以純文本的形式聲明。 -->
      <privateKey>${usr.home}/.ssh/id_dsa</privateKey>
      <!--鑒權(quán)時(shí)使用的私鑰密碼。 -->
      <passphrase>some_passphrase</passphrase>
      <!--文件被創(chuàng)建時(shí)的權(quán)限。如果在部署的時(shí)候會(huì)創(chuàng)建一個(gè)倉(cāng)庫(kù)文件或者目錄,這時(shí)候就可以使用權(quán)限(permission)。這兩個(gè)元素合法的值是一個(gè)三位數(shù)字,其對(duì)應(yīng)了unix文件系統(tǒng)的權(quán)限,如664,或者775。 -->
      <filePermissions>664</filePermissions>
      <!--目錄被創(chuàng)建時(shí)的權(quán)限。 -->
      <directoryPermissions>775</directoryPermissions>
    </server>
  </servers>
  ...
</settings>

1.2.6 mirrors【重要】

用來(lái)配置相應(yīng)的鏡像倉(cāng)庫(kù)。

如果倉(cāng)庫(kù)X可以提供倉(cāng)庫(kù)Y存儲(chǔ)的所有內(nèi)容,那么就可以認(rèn)為X是Y的一個(gè)鏡像。用過(guò)Maven的都知道,國(guó)外的中央倉(cāng)庫(kù)因?yàn)榫W(wǎng)絡(luò)原因用起來(lái)太慢了,所以選擇一個(gè)國(guó)內(nèi)的鏡像就很有必要,我推薦國(guó)內(nèi)的阿里云鏡像。 阿里云鏡像:配置很簡(jiǎn)單,修改conf文件夾下的settings.xml文件,添加如下鏡像配置:

<mirrors>
    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
    </mirror> 
    <mirror>
      <id>alimaven1</id>
      <name>aliyun maven1</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>*</mirrorOf>        
    </mirror>
</mirrors>

其中id與name用來(lái)標(biāo)識(shí)唯一的倉(cāng)庫(kù),url為鏡像倉(cāng)庫(kù)地址,mirrorOf用來(lái)匹配當(dāng)請(qǐng)求什么倉(cāng)庫(kù)依賴時(shí)使用該鏡像。

這里介紹下<mirrorOf>配置的各種選項(xiàng)

  • <mirrorOf>*<mirrorOf>:匹配所有遠(yuǎn)程倉(cāng)庫(kù)。
  • <mirrorOf>external:*<mirrorOf>:匹配所有遠(yuǎn)程倉(cāng)庫(kù),使用localhost的除外,使用file://協(xié)議的除外。也就是說(shuō),匹配所有不在本機(jī)上的遠(yuǎn)程倉(cāng)庫(kù)。
  • <mirrorOf>repo1,repo2<mirrorOf>:匹配倉(cāng)庫(kù)repo1h和repo2,使用逗號(hào)分隔多個(gè)遠(yuǎn)程倉(cāng)庫(kù)。
  • <mirrorOf>*,!repo1<mirrorOf>:匹配所有遠(yuǎn)程倉(cāng)庫(kù),repo1除外,使用感嘆號(hào)將倉(cāng)庫(kù)從匹配中排除。

需要注意的是,由于鏡像倉(cāng)庫(kù)完全屏蔽了被鏡像倉(cāng)庫(kù),當(dāng)鏡像倉(cāng)庫(kù)不穩(wěn)定或者停止服務(wù)的時(shí)候,Maven仍將無(wú)法訪問(wèn)被鏡像倉(cāng)庫(kù),因而將無(wú)法下載構(gòu)件。

此外, maven 讀取mirror 配置是 從上往下讀取的,因此謹(jǐn)慎配置<mirrorOf>*<mirrorOf>,因?yàn)槿绻谝粋€(gè)鏡像倉(cāng)庫(kù)配置了如此標(biāo)志,那么如果該倉(cāng)庫(kù)即使不存在對(duì)應(yīng)依賴也不會(huì)向下游查詢。

1.2.7 proxies

用來(lái)配置代理。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      https://maven.apache.org/xsd/settings-1.0.0.xsd">
  ...
  <proxies>
    <!--代理元素包含配置代理時(shí)需要的信息 -->
    <proxy>
      <!--代理的唯一定義符,用來(lái)區(qū)分不同的代理元素。 -->
      <id>myproxy</id>
      <!--該代理是否是激活的那個(gè)。true則激活代理。當(dāng)我們聲明了一組代理,而某個(gè)時(shí)候只需要激活一個(gè)代理的時(shí)候,該元素就可以派上用處。 -->
      <active>true</active>
      <!--代理的協(xié)議。 協(xié)議://主機(jī)名:端口,分隔成離散的元素以方便配置。 -->
      <protocol>http</protocol>
      <!--代理的主機(jī)名。協(xié)議://主機(jī)名:端口,分隔成離散的元素以方便配置。 -->
      <host>proxy.somewhere.com</host>
      <!--代理的端口。協(xié)議://主機(jī)名:端口,分隔成離散的元素以方便配置。 -->
      <port>8080</port>
      <!--代理的用戶名,用戶名和密碼表示代理服務(wù)器認(rèn)證的登錄名和密碼。 -->
      <username>proxyuser</username>
      <!--代理的密碼,用戶名和密碼表示代理服務(wù)器認(rèn)證的登錄名和密碼。 -->
      <password>somepassword</password>
      <!--不該被代理的主機(jī)名列表。該列表的分隔符由代理服務(wù)器指定;例子中使用了豎線分隔符,使用逗號(hào)分隔也很常見(jiàn)。 -->
      <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>
    </proxy>
  </proxies>
  ...
</settings>

1.2.8 profiles【重要】

根據(jù)環(huán)境參數(shù)來(lái)調(diào)整構(gòu)建配置的列表。用于定義一組profile

seetings中的profile是?pom.xml?中?profile?元素的裁剪版本

它包含了id、activation、repositories、pluginRepositories?和?properties?元素。這里的 profile 元素只包含這五個(gè)子元素是因?yàn)檫@里只關(guān)心構(gòu)建系統(tǒng)這個(gè)整體(這正是 settings.xml 文件的角色定位),而非單獨(dú)的項(xiàng)目對(duì)象模型設(shè)置。如果一個(gè)?settings.xml?中的?profile?被激活,它的值會(huì)覆蓋任何其它定義在?pom.xml?中帶有相同 id 的?profile。

(1)repositories

定義了一組遠(yuǎn)程倉(cāng)庫(kù)的列表,當(dāng)該屬性對(duì)應(yīng)的profile被激活時(shí),會(huì)使用該遠(yuǎn)程倉(cāng)庫(kù)。

<repositories>
  <!--包含需要連接到遠(yuǎn)程倉(cāng)庫(kù)的信息 -->
  <repository>
    <!--遠(yuǎn)程倉(cāng)庫(kù)唯一標(biāo)識(shí) -->
    <id>codehausSnapshots</id>
    <!--遠(yuǎn)程倉(cāng)庫(kù)名稱 -->
    <name>Codehaus Snapshots</name>
    <!--如何處理遠(yuǎn)程倉(cāng)庫(kù)里發(fā)布版本的下載 -->
    <releases>
      <!--true或者false表示該倉(cāng)庫(kù)是否為下載某種類型構(gòu)件(發(fā)布版,快照版)開(kāi)啟。 -->
      <enabled>false</enabled>
      <!--該元素指定更新發(fā)生的頻率。Maven會(huì)比較本地POM和遠(yuǎn)程POM的時(shí)間戳。這里的選項(xiàng)是:always(一直),daily(默認(rèn),每日),interval:X(這里X是以分鐘為單位的時(shí)間間隔),或者never(從不)。 -->
      <updatePolicy>always</updatePolicy>
      <!--當(dāng)Maven驗(yàn)證構(gòu)件校驗(yàn)文件失敗時(shí)該怎么做-ignore(忽略),fail(失敗),或者warn(警告)。 -->
      <checksumPolicy>warn</checksumPolicy>
    </releases>
    <!--如何處理遠(yuǎn)程倉(cāng)庫(kù)里快照版本的下載。有了releases和snapshots這兩組配置,POM就可以在每個(gè)單獨(dú)的倉(cāng)庫(kù)中,為每種類型的構(gòu)件采取不同的策略。例如,可能有人會(huì)決定只為開(kāi)發(fā)目的開(kāi)啟對(duì)快照版本下載的支持。參見(jiàn)repositories/repository/releases元素 -->
    <snapshots>
      <enabled />
      <updatePolicy />
      <checksumPolicy />
    </snapshots>
    <!--遠(yuǎn)程倉(cāng)庫(kù)URL,按protocol://hostname/path形式 -->
    <url>http://snapshots.maven.codehaus.org/maven2</url>
    <!--用于定位和排序構(gòu)件的倉(cāng)庫(kù)布局類型-可以是default(默認(rèn))或者legacy(遺留)。Maven 2為其倉(cāng)庫(kù)提供了一個(gè)默認(rèn)的布局;然而,Maven 1.x有一種不同的布局。我們可以使用該元素指定布局是default(默認(rèn))還是legacy(遺留)。 -->
    <layout>default</layout>
  </repository>
</repositories>
(2)properties

定義了一組拓展屬性,當(dāng)對(duì)應(yīng)的profile被激活時(shí)該屬性有效。

<!--
  1. env.X: 在一個(gè)變量前加上"env."的前綴,會(huì)返回一個(gè)shell環(huán)境變量。例如,"env.PATH"指代了$path環(huán)境變量(在Windows上是%PATH%)。
  2. project.x:指代了POM中對(duì)應(yīng)的元素值。例如: <project><version>1.0</version></project>通過(guò)${project.version}獲得version的值。
  3. settings.x: 指代了settings.xml中對(duì)應(yīng)元素的值。例如:<settings><offline>false</offline></settings>通過(guò) ${settings.offline}獲得offline的值。
  4. java System Properties: 所有可通過(guò)java.lang.System.getProperties()訪問(wèn)的屬性都能在POM中使用該形式訪問(wèn),例如 ${java.home}。
  5. x: 在<properties/>元素中,或者外部文件中設(shè)置,以${someVar}的形式使用。
 -->
<properties>
  <user.install>${user.home}/our-project</user.install>
</properties>
(3)id

全局唯一標(biāo)識(shí),如果一個(gè)?settings.xml?中的?profile?被激活,它的值會(huì)覆蓋任何其它定義在?pom.xml?中帶有相同 id 的?profile。

(4)pluginRepositories

同repositories差不多,不過(guò)該標(biāo)簽定義的是插件的遠(yuǎn)程倉(cāng)庫(kù)。

(5)activation

觸發(fā)激活該profile的條件。

<activation>
  <!--profile默認(rèn)是否激活的標(biāo)識(shí) -->
  <activeByDefault>false</activeByDefault>
  <!--當(dāng)匹配的jdk被檢測(cè)到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4開(kāi)頭的JDK。 -->
  <jdk>1.5</jdk>
  <!--當(dāng)匹配的操作系統(tǒng)屬性被檢測(cè)到,profile被激活。os元素可以定義一些操作系統(tǒng)相關(guān)的屬性。 -->
  <os>
    <!--激活profile的操作系統(tǒng)的名字 -->
    <name>Windows XP</name>
    <!--激活profile的操作系統(tǒng)所屬家族(如 'windows') -->
    <family>Windows</family>
    <!--激活profile的操作系統(tǒng)體系結(jié)構(gòu) -->
    <arch>x86</arch>
    <!--激活profile的操作系統(tǒng)版本 -->
    <version>5.1.2600</version>
  </os>
  <!--如果Maven檢測(cè)到某一個(gè)屬性(其值可以在POM中通過(guò)${name}引用),其擁有對(duì)應(yīng)的name = 值,Profile就會(huì)被激活。如果值字段是空的,那么存在屬性名稱字段就會(huì)激活profile,否則按區(qū)分大小寫(xiě)方式匹配屬性值字段 -->
  <property>
    <!--激活profile的屬性的名稱 -->
    <name>mavenVersion</name>
    <!--激活profile的屬性的值 -->
    <value>2.0.3</value>
  </property>
  <!--提供一個(gè)文件名,通過(guò)檢測(cè)該文件的存在或不存在來(lái)激活profile。missing檢查文件是否存在,如果不存在則激活profile。另一方面,exists則會(huì)檢查文件是否存在,如果存在則激活profile。 -->
  <file>
    <!--如果指定的文件存在,則激活profile。 -->
    <exists>${basedir}/file2.properties</exists>
    <!--如果指定的文件不存在,則激活profile。 -->
    <missing>${basedir}/file1.properties</missing>
  </file>
</activation>

1.2.9 ActiveProfiles

在運(yùn)行時(shí)手工激活的profile。

該元素包含了一組?activeProfile?元素,每個(gè)?activeProfile?都含有一個(gè) profile id。任何在?activeProfile?中定義的 profile id,不論環(huán)境設(shè)置如何,其對(duì)應(yīng)的?profile?都會(huì)被激活。如果沒(méi)有匹配的?profile,則什么都不會(huì)發(fā)生。

<activeProfiles>
    <!-- 要激活的profile id -->
    <activeProfile>env-test</activeProfile>
</activeProfiles>

1.2.10 激活profile的三種方式【重要】

上面有提到了兩種激活的profile的方式,還有一種可以通過(guò)命令行激活profile。

(1)通過(guò)ActiveProfiles激活

如題1.2.9?可以同時(shí)激活多個(gè)profile。

(2)通過(guò)activation結(jié)果

如題1.2.8 (5)

(3)通過(guò)命令行的方式激活

也是我們經(jīng)常使用的方式,例如:

mvn -P 

我們可以通過(guò)在pom.xml或setting.xml中指定不同環(huán)境的profile,在編譯構(gòu)建不同的項(xiàng)目時(shí),通過(guò)上述的命令行方式激活對(duì)應(yīng)的profIle。例如在開(kāi)發(fā)環(huán)境下:

mvn package -P dev 

可以打包開(kāi)環(huán)環(huán)境下的項(xiàng)目。

1.3 Q&A

1.3.1 mirrors與repositories的關(guān)系【重要】

從上文可以看到,repository標(biāo)簽與mirror標(biāo)簽都定義了一個(gè)遠(yuǎn)程倉(cāng)庫(kù)的位置,那么當(dāng)一個(gè)依賴同時(shí)存在于兩個(gè)倉(cāng)庫(kù)時(shí),會(huì)先加載那個(gè)依賴呢?

這里需要闡述一下maven加載真正起作用的repository的步驟,

  1. 首先獲取pom.xml中repository的集合,然后獲取setting.xml中mirror中元素。
  2. 如果repository的id和mirror的mirrorOf的值相同,則該mirror替代該repository。
  3. 如果該repository找不到對(duì)應(yīng)的mirror,則使用其本身。
  4. 依此可以得到最終起作用的repository集合??梢岳斫鈓irror是復(fù)寫(xiě)了對(duì)應(yīng)id的repository。

mirror相當(dāng)于一個(gè)攔截器,會(huì)攔截被mirrorOf匹配到的repository,匹配原則參照?1.2.6?,在匹配到后,會(huì)用mirror里定義的url替換到repository。

沒(méi)有配置mirror

Maven進(jìn)階學(xué)習(xí)指南

配置了mirror

Maven進(jìn)階學(xué)習(xí)指南

二、Pom.xml詳解

上章中setting.xml定義了某個(gè)環(huán)境下全局項(xiàng)目的相關(guān)依賴配置,而pom.xml則具體定義了某一個(gè)項(xiàng)目中的依賴配置。

2.1 pom元素

2.1.1 基本信息

<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>
    <!-- 公司或者組織的唯一標(biāo)志,也是打包成jar包路徑的依據(jù) -->
    <!-- 例如com.companyname.project-group,maven打包jar包的路徑:/com/companyname/project-group -->
    <groupId>com.companyname.project-group</groupId>
 
    <!-- 項(xiàng)目的唯一ID,一個(gè)groupId下面可能多個(gè)項(xiàng)目,就是靠artifactId來(lái)區(qū)分的 -->
    <artifactId>project</artifactId>
 
    <!-- 項(xiàng)目當(dāng)前版本,格式為:主版本.次版本.增量版本-限定版本號(hào) -->
    <version>1.0</version>
 
    <!--項(xiàng)目產(chǎn)生的構(gòu)件類型,
    jar、war主要用來(lái)標(biāo)識(shí)項(xiàng)目打包出的服務(wù)是jar包還是war包 
    pom一般用作多moudle的項(xiàng)目中 頂層的pom用來(lái)指定子moudle中需要依賴的版本 詳見(jiàn)2.1.3 -->
    <packaging>jar</packaging>
    
    <!--定義了本項(xiàng)目的名稱與example的網(wǎng)址 -->
    <name>itoken dependencies</name>
    <url>www.funtl.com</url>
</project>

基本信息都比較易懂,主要定義了本項(xiàng)目的相關(guān)配置說(shuō)明,例如唯一坐標(biāo)、版本、項(xiàng)目介紹等。

2.1.2 dependencies【重要】

(1)dependencies

本元素定義了項(xiàng)目中所需要的相關(guān)依賴信息,也是最重要的元素之一。

<!--該元素描述了項(xiàng)目相關(guān)的所有依賴。 這些依賴自動(dòng)從項(xiàng)目定義的倉(cāng)庫(kù)中下載 -->
<dependencies>
    <dependency>
        <!------------------- 依賴坐標(biāo) ------------------->
        <!--依賴項(xiàng)目的坐標(biāo)三元素:groupId + artifactId + version -->
        <!--其中三要素的來(lái)源就是2.1.1中別人定義好的相關(guān)信息 -->
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-artifact</artifactId>
        <version>3.8.1</version>
 
        <!------------------- 依賴傳遞 ------------------->
        <!--依賴排除,即告訴maven只依賴指定的項(xiàng)目,不依賴該項(xiàng)目的這些依賴。此元素主要用于解決版本沖突問(wèn)題 -->
        <exclusions>
            <exclusion>
                <artifactId>spring-core</artifactId>
                <groupId>org.springframework</groupId>
            </exclusion>
        </exclusions>
        <!-- 可選依賴,用于阻斷依賴的傳遞性。如果在項(xiàng)目B中把C依賴聲明為可選,那么依賴B的項(xiàng)目中無(wú)法使用C依賴 -->
        <optional>true</optional>
        
        <!------------------- 依賴范圍 ------------------->
        <!--依賴范圍。在項(xiàng)目發(fā)布過(guò)程中,幫助決定哪些構(gòu)件被包括進(jìn)來(lái)
            - compile:默認(rèn)范圍,適用于所有階段,會(huì)隨著項(xiàng)目一起發(fā)布;  
            - runtime: 在執(zhí)行時(shí)需要使用,如JDBC驅(qū)動(dòng),適用運(yùn)行和測(cè)試階段,不同于例如fastjson,需要在編譯時(shí)使用;   
            - test: 只在測(cè)試時(shí)使用,用于編譯和運(yùn)行測(cè)試代碼,例如junit,不同于junit,在發(fā)布時(shí)并不需要;    
            - optional: 當(dāng)項(xiàng)目自身被依賴時(shí),標(biāo)注依賴是否傳遞。用于連續(xù)依賴時(shí)使用 -->
        <scope>test</scope>
    </dependency>
</dependencies>

(2)如何解決依賴傳遞問(wèn)題或jar包版本沖突問(wèn)題

解決上述問(wèn)題一般有兩種方式:

  • 當(dāng)我們作為依賴服務(wù)提供者時(shí),可以通過(guò)<optional>標(biāo)簽排除掉不想被傳遞的服務(wù)。
<!-- Project A -->
<project>
  ...
  <dependencies>
    <!-- declare the dependency to be set as optional -->
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0</version>
      <optional>true</optional> 
    </dependency>
  </dependencies>
</project>

我們的A服務(wù)中引用了外部的依賴B服務(wù),此時(shí)有A -> B,在別人引用我們時(shí)有C -> A ->B,若此時(shí)我們A在提供對(duì)外服務(wù)時(shí)不想讓別人依賴B服務(wù),可以在引用B時(shí)添加<optional>標(biāo)簽為true,這樣帶C依賴于A時(shí)并不會(huì)引入B。如果C在此時(shí)想要使用B的相關(guān)服務(wù),需要在C的pom中顯示的調(diào)用B的相關(guān)服務(wù)。

  • 當(dāng)我們作為依賴服務(wù)使用者時(shí),可以通過(guò)<exclusions>來(lái)去除掉我們依賴包中所不想依賴的其他服務(wù)。

如果此時(shí)我們的A服務(wù)依賴于B服務(wù),B服務(wù)依賴于C服務(wù),則有A ->B ->C,因?yàn)槟撤N原因例如jar包沖突,我們?cè)贏中并不想依賴于C服務(wù)的版本,可以在調(diào)用B服務(wù)時(shí)去除掉C的相關(guān)依賴,然后自己再在A中使用C的相關(guān)版本。

<project>
  ...
  <dependencies>
      
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0</version>
      <exclusions>
        <exclusion>
          <!-- 排除掉B中C的相關(guān)依賴 -->
          <groupId>sample.ProjectC</groupId>
          <artifactId>Project-C</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
      
    <!-- 自己引用C的相關(guān)版本 -->
    <dependency>
      <groupId>sample.ProjectC</groupId>
      <artifactId>Project-C</artifactId>
      <version>2.0</version>
    </dependency>
      
  </dependencies>
</project>

2.1.3?<dependencyManagement>

當(dāng)一個(gè)服務(wù)中存在有多個(gè)moudle時(shí),每個(gè)子module都可能引用了相同的jar包,但是如果將版本維護(hù)到子module的pom中,當(dāng)需要升級(jí)時(shí)需要修改所有的pom文件版本。maven提供了繼承的方式來(lái)解決此問(wèn)題。

<!--在父pom中定義子pom需要的相關(guān)依賴 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
</dependencyManagement>

在父pom的?<dependencyManagement>?中定義子pom需要的依賴及版本。

  <!--在子pom中  如下定義了父pom中相關(guān)依賴信息 -->
  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
        <relativePath/>
  </parent>

  <dependencies>
        <dependency>
            <!--因?yàn)橐昧烁竝om 所以可以不指定版本 maven會(huì)自動(dòng)去父pom中查找指定版本 此處為1.0.0 -->
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
  </dependencies>

當(dāng)我們的pom中有定義父pom的元素后,可以在指定需要的依賴時(shí)不指定其版本,maven會(huì)幫我們?nèi)ジ竝om中查找相關(guān)的版本信息。

2.1.4 properties

properties主要用來(lái)定義常量,通過(guò)${value}來(lái)使用。

 <!--配置依賴版本-->
 <properties>
     <!-- Environment Settings -->
     <java.version>1.8</java.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

     <!-- Spring cloud Settings   -->
     <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
     <spring-boot-admin.version>2.0.1</spring-boot-admin.version>
     <zipkin.version>2.10.1</zipkin.version>
 </properties>

<dependencies>
        <!--spring cloud-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--zipkin-->
        <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin</artifactId>
            <version>${zipkin.version}</version>
        </dependency>
    <dependencies>

此外,maven還通過(guò)約定大于配置的方式定義了一些常用的屬性。

屬性 定義
$ 存放pom.xml和所有的子目錄
${basedir}/src/main/java 項(xiàng)目的java源代碼
${basedir}/src/main/resources 項(xiàng)目的資源,比如說(shuō)property文件,springmvc.xml
${basedir}/src/main/webapp/WEB-INF web應(yīng)用文件目錄,web項(xiàng)目的信息,比如存放web.xml、本地圖片、jsp視圖頁(yè)面
${basedir}/target 打包輸出目錄
$ 項(xiàng)目版本
$ 項(xiàng)目groupid

2.1.5 resources

resources標(biāo)簽用來(lái)標(biāo)識(shí)項(xiàng)目在編譯運(yùn)行時(shí)需要額外編譯的文件。例如手工引入jar包、不同運(yùn)行環(huán)境對(duì)應(yīng)不同的profile。

<build>
     <resources>
         <!--首先將默認(rèn)resources目錄下的所有文件包括 -->
         <resource>
             <directory>src/main/resources</directory>
             <filtering>true</filtering>
             <!--只編譯所有以.fxml結(jié)尾的文件 -->
             <includes>
                 <include>**/*.fxml</include>
             </includes>
             <!--排除掉所有的yaml文件 -->
             <excludes>  
                    <exclude>**/*.yaml</exclude>  
             </excludes>
         </resource>
         <!--將不同環(huán)境下對(duì)應(yīng)的不同yaml或properties文件編譯運(yùn)行 -->
         <resource>
             <!--
             <directory>src/main/profiles/dev</directory>
             <directory>src/main/profiles/beta<directory>
             <directory>src/main/profiles/pre</directory>
             -->
             <directory>src/main/profiles/product</directory>
             <filtering>true</filtering>
             <includes>
                 <include>**/*.fxml</include>
             </includes>
         </resource>
         <!--將手工引入的jar包編譯運(yùn)行 -->
         <resource>
                <directory>lib</directory>
                <targetPath>BOOT-INF/lib/</targetPath>
                <includes>
                    <include>**/*.jar</include>
                </includes>
            </resource>
     </resources>
</build>

2.1.6 profile

與setting.xml中profile所不同的是(參照1.2.8),pom中的profile有著更多的標(biāo)簽來(lái)描述一組環(huán)境。從作用上來(lái)區(qū)分的話,一般setting.xml用來(lái)標(biāo)識(shí)不同的遠(yuǎn)程倉(cāng)庫(kù),而pom中的profile一般用來(lái)標(biāo)識(shí)當(dāng)前項(xiàng)目屬于什么環(huán)境,如下是一組常見(jiàn)的pom中的profiles。

<profiles>
        <profile>
            <id>dev</id>
            <!--激活條件 其中默認(rèn)為該profile 更多激活條件可以參考1.2.8 -->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <!--當(dāng)此profile被激活時(shí),會(huì)將 project.active 的屬性賦值為dev -->
            <properties>
                <project.active>dev</project.active>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <!--當(dāng)此profile被激活時(shí),會(huì)將 project.active 的屬性賦值為test -->
            <properties>
                <project.active>test</project.active>
            </properties>
        </profile>
</profiles>

<resources>
         <resource>
             <!--根據(jù)不同的環(huán)境 project.active 取得不同的值 從而會(huì)將不同的環(huán)境下的yaml或properties文件編譯進(jìn)項(xiàng)目中 達(dá)到只需要在編譯時(shí)指定環(huán)境變量即可 不用每次都要修改配置文件 -->
             <directory>src/main/${project.active}</directory>
             <filtering>true</filtering>
             <includes>
                 <include>**/*.fxml</include>
             </includes>
         </resource>
</resources>

此外,一般通過(guò)?mvn -P dev/beta/pre/product?命令來(lái)激活不同的環(huán)境,也可以通過(guò)其他的方式來(lái)激活profile,詳見(jiàn)1.2.10。

當(dāng)然,pom中的profile不止有指定編譯環(huán)境的功能,同樣也可以指定遠(yuǎn)程倉(cāng)庫(kù)等其他功能。

2.1.6 modules

當(dāng)我們項(xiàng)目中有多個(gè)模塊時(shí),如果我們要單獨(dú)打包的話需要在每一個(gè)模塊都執(zhí)行對(duì)應(yīng)的maven命令,但是通過(guò)<modules>標(biāo)簽可以將子服務(wù)或平級(jí)服務(wù)進(jìn)行聚合,只需要打包該服務(wù),也就會(huì)將其對(duì)應(yīng)的子模塊同時(shí)打包。

<modules>
    <!-- 引入子模塊所在的相對(duì)目錄 -->
    <module>springmybatis</module>
    <!-- 引入同級(jí)模塊所在的相對(duì)目錄 -->
    <module>../utils</module>
 </modules>

三、null:jrdp-common:null:jar問(wèn)題解決

3.1包找不到問(wèn)題

我們某次在開(kāi)發(fā)功能的時(shí)候,在我們的項(xiàng)目中引用了伏羲另外一個(gè)系統(tǒng)的jar包,但是預(yù)發(fā)環(huán)境下編譯的時(shí)候卻發(fā)現(xiàn)構(gòu)建失敗,原因是

Maven進(jìn)階學(xué)習(xí)指南

因?yàn)楫?dāng)時(shí)項(xiàng)目有用到京東自己的倉(cāng)庫(kù),所以我們當(dāng)時(shí)第一反應(yīng)是去倉(cāng)庫(kù)中查找,結(jié)果發(fā)現(xiàn)倉(cāng)庫(kù)中是有這個(gè)jar包的。

在發(fā)現(xiàn)并不是最常見(jiàn)的jar包不存在的問(wèn)題后,我們開(kāi)始分析報(bào)錯(cuò)原因,發(fā)現(xiàn)報(bào)錯(cuò)的?jrdp-common這個(gè)包并不是我們直接引用的,而是在我們引用的jar包中引用的,并且?null:jrdp-common:null:jar可以推測(cè)前面應(yīng)該是?groupID與?version

假設(shè)我們的項(xiàng)目是A項(xiàng)目,引用的項(xiàng)目是B項(xiàng)目,也就是?A->B->jrdp-common

于是我們打開(kāi)B項(xiàng)目,查看B的pom結(jié)構(gòu)。

Maven進(jìn)階學(xué)習(xí)指南

發(fā)現(xiàn)B項(xiàng)目的pom中確實(shí)引用了jrdp-common這個(gè)包,但是并沒(méi)有指定版本,是因?yàn)槔^承了?xx-parent這個(gè)包,我們?cè)谶@個(gè)包中確實(shí)也找到了指定的版本號(hào),因此就排除了項(xiàng)目中沒(méi)有指定groupid與版本號(hào)的問(wèn)題。

這個(gè)時(shí)候好像就問(wèn)題就陷入了思路,但是我們注意到,我們之前另一個(gè)私服上也是有這個(gè)包的,那么之前的在另一個(gè)私服上引用好像是沒(méi)有問(wèn)題的,我們查看了私服了上的pom文件,發(fā)現(xiàn)也是跟項(xiàng)目一樣的。

然后我們就突然想到,會(huì)不會(huì)是倉(cāng)庫(kù)中的包有問(wèn)題,果不其然

Maven進(jìn)階學(xué)習(xí)指南

沒(méi)有指定parent也沒(méi)有指定版本號(hào),于是我們修改了這個(gè)版本的pom,至此問(wèn)題解決。

總結(jié):因?yàn)槲覀兊南到y(tǒng)已經(jīng)被好多個(gè)團(tuán)隊(duì)中轉(zhuǎn)接手過(guò),因此可能在某些地方踩了不少坑,像這種問(wèn)題應(yīng)該就是之前的團(tuán)隊(duì)上傳了一些有問(wèn)題的jar包,導(dǎo)致依賴不可用,但是因?yàn)槲覀冎耙恢庇玫乃椒菦](méi)有什么問(wèn)題的,只到這次用到了倉(cāng)庫(kù)問(wèn)題才浮現(xiàn)。

另外,此問(wèn)題并不具有普適性,但是當(dāng)遇到了groupid不能未空的時(shí)候可以按照此方法進(jìn)行排查。

作者:京東科技 韓國(guó)凱

內(nèi)容來(lái)源:京東云開(kāi)發(fā)者社區(qū)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-500930.html

到了這里,關(guān)于Maven進(jìn)階學(xué)習(xí)指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 丁鹿學(xué)堂:前端學(xué)習(xí)進(jìn)階指南之react入門(react在html中使用數(shù)據(jù)綁定和修改)

    在html中使用react 今天跟大家分享react的基礎(chǔ)語(yǔ)法。 我們采用最簡(jiǎn)單的方法,就是在html中引入react 因?yàn)橐簧蟻?lái)就使用腳手架的話,很多配置大家不一定清楚。 而在html中使用react的話,可以直接去學(xué)習(xí)react最基本的語(yǔ)法。 這是零基礎(chǔ)學(xué)習(xí)react的最佳實(shí)踐。 引入react的依賴 react也

    2024年02月14日
    瀏覽(23)
  • 字節(jié)8年測(cè)試經(jīng)驗(yàn),從功能測(cè)試到自動(dòng)化測(cè)試,我整理了這一份2000字進(jìn)階學(xué)習(xí)指南

    字節(jié)8年測(cè)試經(jīng)驗(yàn),從功能測(cè)試到自動(dòng)化測(cè)試,我整理了這一份2000字進(jìn)階學(xué)習(xí)指南

    隨著軟件行業(yè)的不斷發(fā)展,軟件測(cè)試技術(shù)也在不斷地更新,出現(xiàn)了眾多的自動(dòng)化功能測(cè)試工具,如HP的Quick Test Professional(最新版本名為UFT)及開(kāi)源的Selenium。性能測(cè)試工具如LoadRunner、JMeter等。 所謂自動(dòng)化測(cè)試,即利用測(cè)試工具,編程實(shí)現(xiàn)模擬用戶業(yè)務(wù)使用流程的腳本,設(shè)定

    2024年02月06日
    瀏覽(20)
  • 2023年 Web3開(kāi)發(fā)學(xué)習(xí)路線全指南

    Web3是一個(gè)包含了很多領(lǐng)域的概念,不討論幣圈和鏈圈的劃分,Web3包括有Defi、NFT、Game等基于區(qū)塊鏈的Dapp應(yīng)用的開(kāi)發(fā);也有VR、AR等追求視覺(jué)沉浸感的XR相關(guān)領(lǐng)域的開(kāi)發(fā);還有基于區(qū)塊鏈底層架構(gòu)或者協(xié)議的開(kāi)發(fā)。 這篇文章給出的學(xué)習(xí)路線圖是第一種類型: 針對(duì)Dapp應(yīng)用的開(kāi)發(fā)

    2024年02月11日
    瀏覽(26)
  • 如何入門微信小程序開(kāi)發(fā),超詳細(xì)學(xué)習(xí)指南大全

    2017年微信小程序發(fā)布開(kāi)始,我就開(kāi)始接觸和學(xué)習(xí)微信小程序,看著小程序不斷的更新迭代,功能越來(lái)越豐富,生態(tài)也越來(lái)越健全完善。 在這過(guò)程中,開(kāi)發(fā)過(guò)商城小程序、停車掃碼計(jì)費(fèi)小程序、工具打卡小程序、流量主小程序等等。 很多人問(wèn)我小程序怎么開(kāi)發(fā),一個(gè)人怎么制

    2024年02月09日
    瀏覽(17)
  • 微信小程序網(wǎng)悅新聞開(kāi)發(fā)--云函數(shù)以及云數(shù)據(jù)開(kāi)發(fā)(七),詳細(xì)學(xué)習(xí)指南

    微信小程序網(wǎng)悅新聞開(kāi)發(fā)--云函數(shù)以及云數(shù)據(jù)開(kāi)發(fā)(七),詳細(xì)學(xué)習(xí)指南

    微信小程序網(wǎng)悅新聞開(kāi)發(fā)–我的模塊開(kāi)發(fā)(五) 微信小程序網(wǎng)悅新聞開(kāi)發(fā)–自定義組件開(kāi)發(fā)(六) 微信小程序網(wǎng)悅新聞開(kāi)發(fā)–云函數(shù)以及云數(shù)據(jù)開(kāi)發(fā)(七) 云函數(shù) 云函數(shù)是一段運(yùn)行在云端的代碼,無(wú)需管理服務(wù)器,在開(kāi)發(fā)工具內(nèi)編寫(xiě)、一鍵上傳部署即可運(yùn)行后端代碼。 小

    2024年04月25日
    瀏覽(16)
  • 打不過(guò)就加入!ChatGPT 指令學(xué)習(xí)指南:為開(kāi)發(fā)者提供靈活而強(qiáng)大的工具

    最近AI大火,智能化,集成化的出現(xiàn),對(duì)于各行各業(yè)的沖擊可謂是相當(dāng)?shù)拇???椿A(chǔ)的文案AI可以代勞,簡(jiǎn)單的文章AI可以代勞,重復(fù)的代碼AI可以代勞,風(fēng)格迥異的繪畫(huà)AI可以代勞,除此種種,用法只有你想不到的,就沒(méi)有做不到的。 在這時(shí)候不得不思考,未來(lái)自己的工作會(huì)

    2024年02月03日
    瀏覽(21)
  • 【深入淺出Docker原理及實(shí)戰(zhàn)】「原理實(shí)戰(zhàn)體系」零基礎(chǔ)+全方位帶你學(xué)習(xí)探索Docker容器開(kāi)發(fā)實(shí)戰(zhàn)指南(Docker-compose使用全解 一)

    【深入淺出Docker原理及實(shí)戰(zhàn)】「原理實(shí)戰(zhàn)體系」零基礎(chǔ)+全方位帶你學(xué)習(xí)探索Docker容器開(kāi)發(fā)實(shí)戰(zhàn)指南(Docker-compose使用全解 一)

    Docker Compose是一款用于定義和運(yùn)行復(fù)雜應(yīng)用程序的Docker工具。在使用Docker容器的應(yīng)用中,通常由多個(gè)容器組成。使用Docker Compose可以擺脫使用shell腳本來(lái)啟動(dòng)容器的繁瑣過(guò)程。 Compose通過(guò)一個(gè)配置文件來(lái)管理多個(gè)Docker容器。在配置文件中,我們使用services來(lái)定義所有的容器。然后

    2024年01月17日
    瀏覽(26)
  • 機(jī)器學(xué)習(xí)指南:如何學(xué)習(xí)機(jī)器學(xué)習(xí)?

    機(jī)器學(xué)習(xí)指南:如何學(xué)習(xí)機(jī)器學(xué)習(xí)?

    機(jī)器學(xué)習(xí) ????????你有沒(méi)有想過(guò)計(jì)算機(jī)是如何從數(shù)據(jù)中學(xué)習(xí)和變得更聰明的?這就是機(jī)器學(xué)習(xí) (ML) 的魔力!這就像計(jì)算機(jī)科學(xué)和統(tǒng)計(jì)學(xué)的酷炫組合,計(jì)算機(jī)從大量信息中學(xué)習(xí)以解決問(wèn)題并做出預(yù)測(cè),就像人類一樣。 ????????可以這樣想:想象一下,你想教你的電腦

    2024年01月21日
    瀏覽(28)
  • 【機(jī)器學(xué)習(xí)學(xué)習(xí)】第一天:入門指南

    引言 當(dāng)今社會(huì),機(jī)器學(xué)習(xí)技術(shù)已經(jīng)被廣泛應(yīng)用于許多領(lǐng)域,如自然語(yǔ)言處理、圖像處理和金融分析等。然而,機(jī)器學(xué)習(xí)這一領(lǐng)域需要掌握大量的數(shù)學(xué)知識(shí)和編程技能,因此對(duì)于初學(xué)者來(lái)說(shuō),可能會(huì)感到非常困難。本文將為初學(xué)者提供一份機(jī)器學(xué)習(xí)入門指南,幫助他們了解機(jī)器

    2024年02月02日
    瀏覽(26)
  • 【深度學(xué)習(xí)】深度強(qiáng)化學(xué)習(xí)初學(xué)者指南

    ????????GAN(Generative Adversarial Networks)是一種深度學(xué)習(xí)模型,它由兩個(gè)神經(jīng)網(wǎng)絡(luò)組成:一個(gè)生成網(wǎng)絡(luò)和一個(gè)判別網(wǎng)絡(luò)。生成網(wǎng)絡(luò)學(xué)習(xí)如何生成類似于給定數(shù)據(jù)集的新數(shù)據(jù),而判別網(wǎng)絡(luò)則學(xué)習(xí)如何區(qū)分生成網(wǎng)絡(luò)生成的數(shù)據(jù)和原始數(shù)據(jù)。這兩個(gè)網(wǎng)絡(luò)相互競(jìng)爭(zhēng),使得生成器越來(lái)

    2024年02月13日
    瀏覽(51)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包