Maven笔记

本文介绍了Maven的安装步骤,包括设置本地仓库和阿里云镜像,以及配置基础JDK版本。详细解析了pom.xml文件中的各项标签,如groupId,artifactId,version,packaging等,并解释了依赖管理和多环境配置。此外,还列举了常用Maven命令以及依赖范围的含义和冲突处理方法。
摘要由CSDN通过智能技术生成

Maven笔记


一、安装

1、配置本地仓库

conf/settings.xml 文件中配置maven本地仓库

<!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <!-- 本地仓库地址 -->
 <localRepository>D:/local/repository</localRepository>

2、配置阿里云镜像

conf/settings.xml 文件中配置中央仓库的地址

<mirror>
	<id>nexus-aliyun</id>
	<mirrorOf>central</mirrorOf>
	<name>Nexus aliyun</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

3、配置maven工程的基础JDK版本(可选)

maven默认的jdk版本为1.5,可以选择进行修改。

<profile>
  <id>jdk-1.8</id>
  <activation>
	<activeByDefault>true</activeByDefault>
	<jdk>1.8</jdk>
  </activation>
  <properties>
	<maven.compiler.source>1.8</maven.compiler.source>
	<maven.compiler.target>1.8</maven.compiler.target>
	<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  </properties>
</profile>

4、maven坐标查询网址

https://mvnrepository.com/

二、pom.xml 中各标签属性详解


 <modelVersion>4.0.0</modelVersion>
 
 <!-- 当前Maven工程的坐标 -->
 <groupId>cn.com.supercoder</groupId>
 <artifactId>supercoder-maven-demo</artifactId>
 <version>1.0-SNAPSHOT</version>
 
 <!-- 当前Maven工程的打包方式,可选值有下面三种: -->
 <!-- jar:表示这个工程是一个Java工程  -->
 <!-- war:表示这个工程是一个Web工程 -->
 <!-- pom:表示这个工程是“管理其他工程”的工程 -->
 <packaging>jar</packaging>

<!-- parent标签指定当前工程的父工程 -->
<parent>
	<!-- 父工程的坐标 -->
	<groupId>cn.com.supercoder</groupId>
	<artifactId>supercoder-maven-demo</artifactId>
	<version>1.0-SNAPSHOT</version>
</parent>

<!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,可以省略 -->
<!-- <groupId>cn.com.supercoder</groupId> -->
<artifactId>supercoder-maven-demo1</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->

<!--modules 和 module 标签配置当前父工程包含的子模块-->
<modules>  
	<module>supercoder-maven-demo1</module>
	<module>supercoder-maven-demo2</module>
	<module>supercoder-maven-demo3</module>
</modules>

 <!-- 当前工程名称 -->
 <name>supercoder-maven-demo</name>
 <url>http://maven.apache.org</url>

 <!--配置属性集-->
 <properties>
   <!-- 工程构建过程中读取源码时使用的字符集 -->
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <!-- 通过自定义属性,统一指定Spring的版本 -->
   <spring.version>5.3.18</spring.version>
 </properties>

 <!-- 当前工程所依赖的jar包 -->
 <dependencies>
   <!-- 使用dependency配置一个具体的依赖 -->
   <dependency>
      <!-- 在dependency标签内使用具体的坐标依赖jar包 -->
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
     <!-- scope标签配置依赖的范围 -->
     <scope>test</scope>
   </dependency>
   <dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.3.18</version>
	<!-- 使用excludes标签排除依赖	-->
	<exclusions>
		<!-- 在exclude标签中配置具体要排除的依赖 -->
		<exclusion>
			<!-- 指定要排除的依赖的坐标(不需要写version) -->
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>
 </dependencies>


<!-- 在父工程中使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程,只是指明版本号-->
<!-- 子工程中依然需要引入以来,只是不需要声明版本号,起到统一依赖版本号的作用 -->
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<!-- 使用${}引用自定义属性声明版本号,方便统一管理 -->
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-devtools</artifactId>
		    <scope>runtime</scope>
		    <!-- 表示该依赖是可选的,即可有可无 -->
		    <optional>true</optional>
		</dependency>
	</dependencies>
</dependencyManagement>

<!-- Maven在构建过程中相关配置 -->
<build>
    <!-- 构建过程中用到的插件 -->
    <plugins>
        <!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.0</version>
            <!-- 插件用到的依赖 -->
            <dependencies>
                <!-- 逆向工程的核心依赖 -->
                <dependency>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-core</artifactId>
                    <version>1.3.2</version>
                </dependency>
                <!-- 数据库连接池 -->
                <dependency>
                    <groupId>com.mchange</groupId>
                    <artifactId>c3p0</artifactId>
                    <version>0.9.2</version>
                </dependency>
                <!-- MySQL驱动 -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.8</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

<!-- 配置多套环境信息,在特定环境激活特定profile -->
<profile>
	<id>dev</id>
    <activation>
        <!-- 配置是否默认激活 -->
    	<activeByDefault>false</activeByDefault>
    	<!-- 指定激活条件为:JDK 1.6 -->
        <jdk>1.6</jdk>
        <os>
        	<name>Windows XP</name>
            <family>Windows</family>
            <arch>x86</arch>
            <version>5.1.2600</version>
        </os>
        <property>
        	<name>mavenVersion</name>
            <value>2.0.5</value>
        </property>
        <file>
        	<exists>file2.properties</exists>
            <missing>file1.properties</missing>
        </file>
    </activation>
    <!-- Maven 为了能够通过 profile 实现各不同运行环境切换,提供了一种资源属性过滤的机制。-->
    <!-- 通过属性替换实现不同环境使用不同的参数 -->
	<properties>
         <dev.jdbc.user>root</dev.jdbc.user>
         <dev.jdbc.password>root</dev.jdbc.password>
         <dev.jdbc.url>http://localhost:3306/db</dev.jdbc.url>
         <dev.jdbc.driver>com.mysql.jdbc.Driver</dev.jdbc.driver>
     </properties>
     <build>
         <resources>
             <resource>
                 <!-- 表示为这里指定的目录开启资源过滤功能 -->
                 <directory>src/main/resources</directory>
                 <!-- 将资源过滤功能打开 -->
                 <filtering>true</filtering>
             </resource>
         </resources>
     </build>
</profile>

三、maven命令

mvn clean  删除target目录
mvn compile 编译源代码,编译结果存放目录,target/classes
mvn test-compile  测试程序编译,编译结果存放目录, target/test-classes
mvn test	执行测试程序,程序的报告存放目录,tsrget/surefire-reports

mvn package		打包程序,存放目录,target

mvn install		安装jar包到本地仓库,在仓库中的路径对应项目的坐标

mvn deploy		部署jar包到远程仓库

mvn dependency:list 	查看当前工程所依赖的jar包列表

mvn dependency:tree		以树形结构查看当前工程的依赖信息

mvn help:active-profiles		列出所有激活的profile,以及它们在哪里定义

mvn compile -P  在编译时指定要激活的profile

四、依赖范围

main目录(空间)test目录(空间)开发过程(时间)部署到服务器(时间)
compile有效有效有效有效
test无效有效有效无效
provided有效有效有效无效

总结:

  1. compile:通常使用的 jar 包都是以 compile 范围进行依赖的,是默认值。
  2. test:测试使用的 jar 包,以 test 范围依赖进来。比如 junit。
  3. provided:在开发过程中需要用到的“服务器上的 jar 包”需要以 provided 范围依赖进来。比如 servlet-api、jsp-api。而这些范围的 jar 包之所以不参与部署是为了避免和服务器上已有的同类 jar 包产生冲突。
  4. runtime:用于编译时不需要,运行时需要的 jar 包。

五、依赖冲突

1、maven版本仲裁机制

  • 最短路径优先原则。
  • 路径相同的情况下先声明的优先。

2、解决办法

在冲突的jar包中选定一个,通过exclusions 排除依赖,或者是明确声明使用某个依赖。

3、排查依赖冲突的插件

  • IDEA的 maven helper 插件
  • maven 的 enforce 插件
<!-- 配置enforcer插件 -->
<build>
   <pluginManagement>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-enforcer-plugin</artifactId>
               <version>1.4.1</version>
               <executions>
                   <execution>
                       <id>enforce-dependencies</id>
                       <phase>validate</phase>
                       <goals>
                           <goal>display-info</goal>
                           <goal>enforce</goal>
                       </goals>
                   </execution>
               </executions>
               <dependencies>
                   <dependency>
                       <groupId>org.codehaus.mojo</groupId>
                       <artifactId>extra-enforcer-rules</artifactId>
                       <version>1.0-beta-4</version>
                   </dependency>
               </dependencies>
               <configuration>
                   <rules>
                       <banDuplicateClasses>
                           <findAllDuplicates>true</findAllDuplicates>
                       </banDuplicateClasses>
                   </rules>
               </configuration>
           </plugin>
       </plugins>
   </pluginManagement>
</build>

执行 enforcer插件的命令 : mvn clean package enforcer:enforce

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值