天天看点

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>