天天看點

Maven筆記(從配置倉庫開始)配置本地倉庫位置配置阿裡雲的源約定的項目結構常用的指令生命周期安裝maven插件依賴傳遞依賴沖突依賴範圍聚合繼承

Maven筆記

  • 配置本地倉庫位置
  • 配置阿裡雲的源
  • 約定的項目結構
  • 常用的指令
  • 生命周期
  • 安裝maven插件
  • 依賴傳遞
  • 依賴沖突
  • 依賴範圍
  • 聚合
  • 繼承

下載下傳,環境變量配置跳過

首先設定\conf\settings.xml檔案

配置本地倉庫位置

配置阿裡雲的源

<mirror>
     <id>aliyunmaven</id>
     <mirrorOf>*</mirrorOf>
     <name>阿裡雲公共倉庫</name>
     <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
     <mirror>
     <id>aliyunmaven</id>
     <mirrorOf>*</mirrorOf>
     <name>阿裡雲谷歌倉庫</name>
     <url>https://maven.aliyun.com/repository/google</url>
    </mirror>
    <mirror>
     <id>aliyunmaven</id>
     <mirrorOf>*</mirrorOf>
     <name>阿裡雲阿帕奇倉庫</name>
     <url>https://maven.aliyun.com/repository/apache-snapshots</url>
    </mirror>
    <mirror>
     <id>aliyunmaven</id>
     <mirrorOf>*</mirrorOf>
     <name>阿裡雲spring倉庫</name>
     <url>https://maven.aliyun.com/repository/spring</url>
    </mirror>
    <mirror>
     <id>aliyunmaven</id>
     <mirrorOf>*</mirrorOf>
     <name>阿裡雲spring插件倉庫</name>
     <url>https://maven.aliyun.com/repository/spring-plugin</url>
    </mirror>
  </mirrors>
           

約定的項目結構

main

    java

        package //源碼

test

    java

        package //單元測試

resources //資源

常用的指令

compile 編譯

test 運作單元測試

package 打包

clean 清除target

install 安裝jar包到本地倉庫中

生命周期

周期 含義
clean 清理項目
default 建構項目(最核心)
site 生成項目站點

clean 的三個階段

pre-clean 執行清理前的工作

clean 清理上一次建構生成的所有檔案檔案

post-clean 執行清理後的檔案

default 常用的幾個階段

compile 編譯

test 測試

package 打包

install 安裝包到本地倉庫

site 的四個階段

pre-site 在生成項目站點前要完成的工作

site 生成項目的站點文檔

post-site 在生成項目站點後要完成的工作

site-deploy 釋出生成的站點到伺服器上

安裝maven插件

修改pom.xml檔案

<build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
        <!--綁定插件到某個執行步驟-->
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
          <version>2.4</version>
          <!--這裡就是綁定source插件到package,執行package時會執行source,試過了,不知道為什麼不好使-->
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>jar-no-fork</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
           

依賴傳遞

如果A依賴B,B依賴C,那麼A也會依賴C

如果我們依賴B的時候,不希望依賴B所依賴的C,那麼我們可以用如下配置排除B的依賴項依賴

<dependency>  
    <groupId>B</groupId>  
    <artifactId>B</artifactId>  
    <version>0.0.1</version>  
    <exclusions>  
        <exclusion>
            <groupId>C</groupId>  
            <artifactId>C</artifactId>  
        </exclusion>  
    </exclusions>  
</dependency> 
           

排除B的所有依賴項

<dependency>  
    <groupId>B</groupId>  
    <artifactId>B</artifactId>  
    <version>0.0.1</version>  
    <exclusions>  
        <exclusion>
            <groupId>*</groupId>  
            <artifactId>*</artifactId>  
        </exclusion>  
    </exclusions>  
</dependency> 
           

依賴沖突

最短路徑優先

比如A依賴B,B依賴C,同時B依賴M的1.0版本,然後C又依賴M的2.0版本,那麼A會遵循B的依賴,依賴的是M的1.0版本

先聲明優先

比如A依賴B,A又依賴C,同時B依賴M的1.0版本,C又依賴M的2.0版本,那麼在A的pom.xml檔案中,對誰的依賴寫在前面,A就遵循誰的依賴

依賴範圍

具體看這個人的文章吧

https://blog.csdn.net/seasonsbin/article/details/79093647

聚合

假設有如下幾個子產品

chameleon-core

chameleon-simple

chameleon-common

chameleon-config-web

chameleon-web

chameleon-sso

在父項目的pom.xml檔案中添加

<modules>
        <module>chameleon-core</module>
        <module>chameleon-simple</module>
        <module>chameleon-common</module>
        <module>chameleon-config-web</module>
        <module>chameleon-web</module>
        <module>chameleon-sso</module>
    </modules>
           

然後在執行一個build的時候就會将這些一起build了

繼承

建立一個項目,pom.xml中進行如下配置,除了packaging節點,其他都是你自己起名的,注意

packaging節點改成pom

<groupId>com.chameleon</groupId>
    <artifactId>chameleon</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
           

在子項目的pom.xml檔案中添加如下内容,就會繼承父pom了

<parent>
        <artifactId>chameleon</artifactId>
        <groupId>com.chameleon</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
           

将版本号提取成屬性

在pom.xml的properties節點中添加随便起名的節點,我起名為junit.ver

<properties>
    <junit.ver>4.12</junit.ver>
  </properties>
           

然後使用該屬性的時候就這樣使用就可以了

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.ver}</version>
      <scope>test</scope>
    </dependency>
           

dependencyManagement标簽,在父項目的pom.xml檔案中,添加這個标簽

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>${junit.ver}</version>
           <scope>test</scope>
       </dependency>
       <dependency>
           <groupId>com.google.guava</groupId>
           <artifactId>guava</artifactId>
           <version>18.0</version>
       </dependency>
   </dependencies>
</dependencyManagement>
           

然後在子項目中引用junit的時候就不再需要聲明version和scope了

需要注意的是dependencyManagement标簽不會引入相關的jar,他隻是對依賴的聲明,當子項目需要引用dependencyManagement中聲明的依賴時,需要在pom.xml中顯式的聲明

子項目中進行如下的聲明才會真正的引用相關jar包

<dependencies>
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
       </dependency>
       <dependency>
           <groupId>com.google.guava</groupId>
           <artifactId>guava</artifactId>
       </dependency>
   </dependencies>