Maven基础

本文详细介绍了Maven的基础知识,包括仓库种类及其关系、常用命令、解决jar包冲突的方法,强调了统一和锁定jar包版本的重要性。通过理解第一声明优先和路径近者优先原则,以及直接排除法,可以更有效地管理项目依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mac下的Maven配置安装,可以查看另一篇博客:传送门

目录

一、简述

maven是一个项目管理工具。

maven拆分思想:
maven解决代码可重用和便于维护问题上的解决方案:
maven把一个完成的项目,分成不同的独立模块,这些模块都有各自独立的坐标。哪个地方需要其中某个模块,就直接引用该模块的坐标即可。实际开发中,先考虑的问题不是dao、service、utils、domain如何编写,我们要考虑的是dao、service、utils、domain是否已经存在,如果存在直接引用。
maven聚合思想:可以把拆分独立的各个模块聚合到一起编写成一个完成的项目。

依赖管理:maven对项目中jar包的管理过程。pom文件管理jar包坐标。

  • 传统项目直接把jar包放置在项目中。
  • maven工程真正的jar包放置在仓库中,项目中只需要放置jar包的坐标。-- 当项目编译或运行时,项目会自动通过jar包坐标在仓库中找到所对应的jar包。

二、仓库

2.1 仓库种类

  • 本地仓库:只能通过安装的方式将jar包安装到本地仓库。拷贝到本地仓库的jar包是没有效果的。
  • 远程仓库【也称之为私服】-- 放置了公司内部开发所需要的jar包。若公司没有网络时,本地仓库没有jar包,我们可以通过局域网从远程下载jar包。
  • 中央仓库 – 安装了maven之后,自动就连着中央仓库,需要电脑连接着网络,才可以在中央仓库下载jar包。

2.2 仓库之间的关系

当我们启动一个maven工程的时候,maven工程通过pom文件中jar包的坐标去本地仓库找对应jar包。
默认情况下,如果本地仓库没有对应jar包,maven工程会自动去中央仓库下载jar包到本地仓库。
在公司中,如果本地没有对应jar包,会先从私服下载jar包。
如果私服也没有jar包,可以从中央仓库下载,也可以从本地上传。

三、常用命令

maven一键构建:maven自身集成了tomcat插件,可以对项目进行编译、测试、打包、安装、发布等操作。

maven常用命令:

  • clean 清理项目以前的构建信息
  • compile 对src/main/java 下的目录进行编译。
  • test 编译测试代码
  • package 把本地项目打包到了本地编译目录 target
  • install 把包安装到本地仓库
  • deploy 将本地做好的项目直接上传到私服

maven以上命令涉及了三套生命周期:

  • 清理生命周期
  • 默认生命周期
  • 站点生命周期

四、解决jar包冲突

maven工程要导入jar包坐标,就必须要考虑解决jar包冲突,解决jar包冲突的方式有如下三种:

4.1 第一声明优先原则

第一声明优先原则:哪个jar包的坐标在pom靠上的位置,这个jar包就是先声明的。
先声明的jar包坐标下的依赖包,可以优先进入项目中。

比如:
A 导入方式

<dependencies>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>5.0.2.RELEASE</version>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-beans</artifactId>
     <version>4.1.2.RELEASE</version>
   </dependency>
 </dependencies>

B 导入方式:

<dependencies>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-beans</artifactId>
     <version>4.1.2.RELEASE</version>
   </dependency>
 </dependencies>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>5.0.2.RELEASE</version>
   </dependency>

我们知道spring-beans的jar包依赖spring-core。此时spring-beans坐标位置会影响到spring-core的jar包的版本。
根据第一声明优先原则:
A导入jar包分别为:
spring-core版本5.0.2.RELEASE,spring-beans版本4.1.2.RELEASE

B导入jar包分别为:
spring-core版本4.1.2.RELEASE,spring-beans版本4.1.2.RELEASE

4.2 路径近者优先原则

首先,我们需要明确maven导入jar包中两个概念:
直接依赖:项目中直接导入的jar包,就是直接该项目的直接依赖包。
传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中。

路径近者优先原则:直接依赖路径比传递依赖路径近,那么最终项目进入的jar包是路径近的直接依赖包。

<dependencies>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-beans</artifactId>
     <version>4.1.2.RELEASE</version>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>5.0.2.RELEASE</version>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>4.2.8.RELEASE</version>
   </dependency>
 </dependencies>

此时,项目对spring-core是直接依赖。此时项目引入的jar包为:
spring-core版本4.2.8.RELEASE

4.3 直接排除法【推荐使用】

当我们要排除某个jar包下依赖,当配置exclusions标签的时候,内部可以不写版本号。
因为此时依赖包使用的版本号默认与本jar包一样。

该方式优于方式一、方式二。因为在多人开发时,此种方式可以避免其他人员移动jar包坐标带来的jar包版本问题。

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.1.2.RELEASE</version>
    <exclusions>
      <exclusion>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
</dependencies>

虽然spring-beans版本4.1.2.RELEASE,并依赖spring-core,而且坐标先声明,但是我们在spring-beans标签内移除了对spring-core版本4.1.2.RELEASE的依赖。此时项目导入的spring-beans版本是5.0.2.RELEASE。

五、统一、锁定jar包版本

统一jar包版本使用了properties标签,xml中能否使用什么标签,完全取决于xml中的约束。

锁定jar包版本的好处与原因

maven工程是可以分父子依赖关系的。
凡是依赖别的项目后,拿到的别的项目的依赖包,都属于依赖包。
比如:当前A项目,被B项目依赖。那么A项目中所有jar包都会传递到B项目中。
B项目开发者,如果再在B项目中导入一套ssm框架的jar包,对于B项目是直接依赖。
那么直接依赖的jar包就会把A项目传递过去的jar包覆盖掉。

为了防止以上情况的出现:我们可以把A项目中主要jar包的坐标锁住,那么其他依赖A项目的项目中,
即便是有同名jar包直接依赖,也无法覆盖。

项目标签约束:

<?xml version="1.0" encoding="UTF-8"?>

<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>
  
</project>

统一jar包版本:

<properties>
  <spring.version>5.0.2.RELEASE</spring.version>
  <slf4j.version>1.6.6</slf4j.version>
  <log4j.version>1.2.12</log4j.version>
  <shiro.version>1.2.3</shiro.version>
  <mysql.version>5.1.6</mysql.version>
  <mybatis.version>3.4.5</mybatis.version>
  <spring.security.version>5.0.1.RELEASE</spring.security.version>
</properties>

锁定jar包版本:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

添加项目依赖jar包

<dependencies>
  <!-- spring -->
  <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.6.8</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</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-context-support</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</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-core</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
  </dependency>
  <!-- log start -->
  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>${log4j.version}</version>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
  </dependency>
  <!-- log end -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
  </dependency>
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
  </dependency>
  <dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
    <type>jar</type>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring.security.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${spring.security.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>${spring.security.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>${spring.security.version}</version>
  </dependency>
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
  </dependency>
</dependencies>

添加tomcat7插件:

 <build>
   <plugins>
     <plugin>
       <groupId>org.apache.tomcat.maven</groupId>
       <artifactId>tomcat7-maven-plugin</artifactId>
       <version>2.2</version>
     </plugin>
   </plugins>
 </build>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值