晚自习-Maven

晚自习-Maven

mvn的默认仓库地址:C:\Users\ASUS.m2,若需要修改,在maven的conf目录下,打开配置文件settings.xml,修改第55行 仓库地址即可。

配置镜像仓库,在下配置

maven命令

  • mvn compile 将项目编译,会生成target目录,保存编译结果
  • mvn clean 清除编译的东西,即target目录
  • mvn clean compile 清理后编译
  • mvn test 测试自动跑测试类
  • mvn package 打包
  • mvn install 将项目安装到仓库中

pom指的是 Project Object Model

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0"xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><!--pom模型标准版本--><modelVersion>4.0.0</modelVersion><!--groupId:表明当前项目是哪个公司开发的,公司网址的反转--><groupId>com.ihrm</groupId><!--artifactId说明当前开发的模块名--><artifactId>ihrm_parent</artifactId><!--当前模块的版本号--><version>1.0-SNAPSHOT</version><!--工程名--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>

依赖范围

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version><!--compile:默认值,在编译项目、测试和运行时都可以用test:只在测试范围用,最终打包和部署忽略这个jar包 如junitprovided:告诉maven这个jar包未来在服务器中有,不需要将它打包到工程中,在实际打包的时候,lib文件夹中maven导入的provided都没有,如servlet--><scope>compile</scope>
</dependency>
  • 默认是compile,表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。

  • scope为test表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。如果在a项目中引入了这个依赖,在b项目引入了a项目作为依赖,在b项目中这个注解不会生效,因为scope为test时无法传递依赖。

  • provided意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。

在使用maven打包时,注意指定web.xml文件的范围

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.2</version><configuration><!-- 指定web.xml的路径  --><webXml>web\WEB-INF\web.xml</webXml></configuration></plugin></plugins></build>

依赖的传递

排除依赖

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-nop</artifactId><version>1.7.2</version><!--排除依赖--><exclusions><exclusion><artifactId></artifactId><groupId></groupId></exclusion></exclusions>
</dependency>

jar包的依赖原则

  • 若两个模块A和B,A导入了log4j的jar包,B依赖A,且B也导入了不同版本的log4j的jar,则B用的是自己的log4j,

  • 若有三个模块。C依赖B,B依赖A,且B和A有相同的jar,则C依赖的是B的,规则是最短路径原则

  • 若有三个模块。C依赖于B,C依赖于A,且A和B有相同的jar,则依赖原则是优先顺序

版本统一管理

<!--自定义标签-->
<properties><fastjson.version>1.2.47</fastjson.version>
</properties><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version>
</dependency>

工程的几种方式

  • jar:打包成一个普通的jar
  • war:打包成一个web工程的war包
  • pom:当前工程不会被打包成什么,这个工程就是保存一些配置

子工程里面的配置可以是继承于父工程(打成pom,一般用来写配置,专门被子工程继承)

表示当前工程继承于父工程
<parent><artifactId>ihrm_parent</artifactId><groupId>com.ihrm</groupId><version>1.0-SNAPSHOT</version>
</parent>子工程的gav坐标除过artifactId外,其他的都可以继承于父工程的,父工程统一管理jar

为了防止子工程不继承父工程的全部jar,可以在父工程中使用

父工程
<dependencyManagement><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot-starter-web-version}</version></dependency>
</dependencyManagement>子工程 直接用就可以,不需要确定版本,版本统一由父工程设置
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

子工程安装的maven仓库中时需要将父工程安装进仓库

安装到仓库的时候,先安装被依赖的这些包,在安装到工程

为了解决上诉依赖复杂问题,聚合,在父工程中使用标签,在父工程中聚合子工程,要clean一起clean,