Maven超详细笔记


更多文章和资源欢迎访问:SuperCoder Blog


超详细的Maven笔记


一、Maven安装配置

Maven官网地址:https://maven.apache.org/

下载地址:https://maven.apache.org/download.cgi
在这里插入图片描述下载到本地后解压即可。

1、配置本地仓库:

conf/settings.xml文件中配置maven本地仓库,找到如下代码块,配置localRepository

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

2、配置阿里云镜像:

由于maven中央仓库在国外,下载依赖速度慢,所以一般使用国内阿里云镜像仓库。在settings.xml中找到mirror标签,注释掉原本默认的,然后添加如下配置。

<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版本

如果按照默认配置运行,Java工程使用的默认JDK版本为1.5,而我们常用的JDK版本为1.8,所以可以修改默认配置。在profiles标签下添加如下profile代码块。

<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、安装JDK配置环境变量

maven是用java语言开发的,必须基于JDK运行,所以需要安装JDK并配置环境变量,详细操作此处略。
验证是否配置成功:
在这里插入图片描述
5、配置maven环境变量

mac系统配置如下:

export MAVEN_HOME=/Users/chaishuai/dev/apache-maven-3.2.3               
export PATH=$PATH:$MAVEN_HOME/bin

验证是否配置成功:
在这里插入图片描述
6、maven坐标查询网址
https://mvnrepository.com/

二、pom.xml 详解

此示例pom不是一个单独的pom,只是为了记录常见标签的作用


 <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命令

  1. mvn clean:删除target目录
  2. mvn compile:主程序编译,编译结果存放的目录:target/classes
  3. mvn test-compile:测试程序编译,编译结果存放的目录:target/test-classes
  4. mvn test:执行测试程序,测试的报告存放的目录:target/surefire-reports
  5. mvn package:打包程序,存放的目录:target
  6. mvn install:安装jar包到本地仓库,在仓库中的路径对应项目坐标
  7. mvn deploy:部署jar包到远程仓库
  8. mvn dependency:list:查看当前工程所依赖的 jar 包的列表
  9. mvn dependency:tree:以树形结构查看当前工程的依赖信息
  10. mvn help:active-profiles:列出所有激活的 profile,以及它们在哪里定义
  11. 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、排查依赖冲突的插件

  1. IDEA 的 Maven Helper
  2. Maven 的 enforcer 插件
<!-- 配置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

六、搭建私服

1、Nexus下载地址:https://help.sonatype.com/repomanager3/product-information/download
在这里插入图片描述

由于下载链接很难打开,所以此处提供Linux系统使用的安装包,大家可下载使用。

链接: https://pan.baidu.com/s/1_x3ShxUV3FO6eOUl_Kud2A 提取码: wdeo

2、上传压缩包到Linux服务器并解压

## 上传压缩包到LInux服务器
scp 本地文件路径 服务器登录名@服务器IP:文件存放路径
## 解压缩
tar -zxvf nexus-3.38.1-01-unix.tar.gz

3、进入解压后的文件夹的bin目录启动nexus

cd nexus-3.38.1-01/bin/
## 启动nexus  注意:需要具备jdk环境
./nexus run

注意:由于nexus默认初始化堆内存大小为2073M,如果机器内存不够,会启动失败,报如下错误,需要调整nexus默认jvm参数。

在这里插入图片描述
进入bin/nexus.vmoptions文件

## 修改如下参数为适合自己机器的值,由于我的服务器是2G内存所以此处修改为1500M
-Xms1500m
-Xmx1500m
-XX:MaxDirectMemorySize=1500m

修改完成后保存退出,重新启动,启动成功如图

在这里插入图片描述
或者也可以使用./nexus start命令启动,./nexus status查询状态

在这里插入图片描述
4、访问nexus

nexus默认端口为8081,IP:8081即可访问。

注意:一定要记得关闭防火墙,如果使用阿里云需要配置防火墙规则

# 关闭防火墙
systemctl stop firewalld
# 查看防火墙状态
systemctl status firewalld

在这里插入图片描述
添加阿里云防火墙规则

在这里插入图片描述
配置成功后即可访问nexus界面
在这里插入图片描述
查看登录密码,进入nexus压缩包解压后的另一个目录sonatype-work下的nexus3目录

cd sonatype-work/nexus3/
# 查看密码
cat admin.password

显示出来的即为初始登录密码,登录名为admin

在这里插入图片描述
登陆后需要给admin用户设置新的密码

在这里插入图片描述
选择禁用匿名登录后下一步就可以使用了

在这里插入图片描述
5、nexus仓库介绍
在这里插入图片描述
Type介绍:

仓库类型描述
proxy远程仓库的代理
group通过 Nexus 获取的第三方 jar 包
hosted部署团队自主开发的jar包

Name介绍:

仓库名称描述
maven-centralNexus 对 Maven 中央仓库的代理
maven-publicNexus 默认创建,供开发人员下载使用的组仓库
maven-releasseNexus 默认创建,供开发人员部署自己 releasse jar 包的仓库
maven-snapshotsNexus 默认创建,供开发人员部署自己 snapshots jar 包的仓库

6、本地使用nexus私服

在settings.xml中指定nexus服务器地址

<!-- 注释掉原来配置的阿里云仓库,添加如下配置 -->
<mirror>
	<id>nexus-mine</id>
	<mirrorOf>central</mirrorOf>
	<name>Private Nexus</name>
	<!-- 地址直接点对应仓库后面的copy就可以复制 -->
	<url>http://IP:8081/repository/maven-public/</url>
</mirror>

因为禁用了匿名访问,所以需要在settings.xml中配置用户名密码

<server>
  <!-- id需要与配置的nexus服务器地址id一样 -->
  <id>nexus-mine</id>
  <username>admin</username>
  <!-- 密码填自己设置的密码 -->
  <password>password</password>
</server>

将自己的jar包部署到nexus,需要在maven工程中pom.xml配置如下内容

<distributionManagement>
	<!-- snapshotRepository的id标签必须和settings.xml中指定的mirror标签的id一致 -->
    <snapshotRepository>
        <id>nexus-mine</id>
        <name>Nexus Snapshot</name>
        <url>http://ip地址:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
</distributionManagement>

配置完成后,执行mvn deploy即可部署到私服

7、修改私服代理的远程仓库地址

由于中央仓库下载jar包速度太慢,可以将私服代理地址修改为阿里云仓库,操作步骤如下:
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值