1.依赖的传递性
maven导入包的传递性,makefriend工程依赖于helloFriend工程 又依赖于hello工程,但是 他们又分别引用了不同版本的log4j,
因为Maven中内置了两条依赖原则:最短路径者优先和先声明者优先,上诉最短路径为HelloFriend,上述问题MakeFriend工程会自动使用log4j.1.2.14.jar。 如果路径相同,那么在pom里面先声明,即采用。
2.模块的依赖性
随着JavaEE项目的规模越来越庞大,开发团队的规模也与日俱增。一个项目上千人的团队持续开发很多年对于JavaEE项目来说再正常不过。那么我们想象一下:几百上千的人开发的项目是同一个Web工程。那么架构师、项目经理该如何划分项目的模块、如何分工呢?这么大的项目已经不可能通过package结构来划分模块,必须将项目拆分成多个工程协同开发。多个模块工程中有的是Java工程,有的是Web工程。
比如环境模块,只负责我们java包的依赖,公共模块就是一些工具类,组件模块就是开发的controller service
dao。
按照业务分模块。把每个模块分为一个项目,分布式开发。
3.maven构建
web工程和其编译结果的目录结构对比如下:
构建环节
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。
⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
3Maven的核心概念
①POM pom.xml
②约定的目录结构 结构比较固定,不能更改 就和WEB工程师一样的
③坐标 定位仓库中的jar等
④依赖管理 传递性
⑤仓库管理 本地 私服 镜像服务器 maven服务
⑥生命周期 maven运行的整个过程,
⑦插件和目标 插件和具体的操作
⑧继承 建立父工程与子工程 相互依赖,子工程继承父工程的jar包
⑨聚合 一键安装,很多个项目一起安装
3.maven的安装
4.maven的仓库地址配置
~\.m2\repository目录。~\.m2\repository目录。
maven默认仓库为~\.m2\repository 目录 ~为c盘用户中你登录的用户 建议不要放在默认地址,否则系统重装 maven消失
在maven的安装目录 下
\ D:\DevInstall\apache-maven-3.2.2\conf\settings.xml setting配置文件中加入
<localRepository>D:\RepMaven</localRepository> 路径用\linux和window都可以通用 java环境中不可用
本地安装地址
5.POM的含义
POM project object model 项目对象模型
- cmd 中继续录入mvn clean命令,然后再次查看根目录变化 删除target中的文件
- cmd 中录入 mvn clean compile命令, 查看根目录变化 删除并编译项目到target文件中
- cmd 中录入 mvn test-compile命令,查看target目录变化 编译到target\test-classes中 test目录中的字节码 先编译main再编译test
- cmd 中录入 mvn clean test命令,查看target目录变化 运行测试程序 先编译main再编译test
- cmd 中录入mvn clean package命令,查看target目录变化 先编译main再编译test然后生成jar
- cmd中录入mvn source:jar命令,查看target目录变化 生成源码包
约定>配置>编码
maven目录结构
项目名
src
main
java
resources
test
target
classes
test-classes
surefire-reports(测试报告)
以及打包的jar
pom.xml
约定>配置>编码 尽量不要硬编码 约定比如1为什么意思 配置将配置写在配置文件中 编码写在代码中需要重构代码
6.maven坐标
group为公司组织的域名倒序+当前项目名称
artifactId为当前项目的模块名称
version为当前模块的版本
gav
<groupId>com.atguigu.maven</groupId>
<artifactId>Hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
如何查找 将gav三个向量连接起来
com/atguigu/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar 这就是在maven仓库中的位置
我们自己的maven工程需要执行安装操作才能到maven仓库中
这时我们需要使用自己的maven 这里我们已经为我们的maven指定了使用的仓库
然后去修改maven的配置文件地址 ,配置为我们刚才修改的那个setting.xml即可
7.maven的依赖关系
如果A依赖于B,B依赖于C那么A依赖于C
在导入的时候需要指定依赖范围
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
scope就是依赖范围
①compile (所有的都可以用)
[1]main目录下的Java代码可以访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时要放在WEB-INF的lib目录下
例如:对Hello的依赖。主程序、测试程序和服务器运行时都需要用到。
②test (仅仅test下面可以用)
[1]main目录下的Java代码不能访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
例如:对junit的依赖。仅仅是测试程序部分需要。
③provided(main和test都可用但是不会打包到tomcat中 比如项目中和tomcat中都由这个包的时候)
[1]main目录下的Java代码可以访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下
例如:servlet-api在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不需要。
④runtime[了解]
[1]main目录下的Java代码不能访问这个范围的依赖
[2]test目录下的Java代码可以访问这个范围的依赖
[3]部署到Tomcat服务器上运行时会放在WEB-INF的lib目录下
例如:JDBC驱动。只有在测试运行和在服务器运行的时候才决定使用什么样的数据库连接。
⑤其他:import、system等。
type
是指依赖的类型,一般都jar(比如我们想要调用其中的方法)、war 、 pom(不会导入jar包)
A依赖于B B分别依赖于CDE 那么是否对A可见
依赖的排除 排除的依赖不用写版本号
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>Survey160225_4_Environment</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 依赖排除 -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
排除的意义在于 他依赖的包可能不是我们想要的版本 ,这样我们可以自行声明 需要哪个版本的包
统一管理jar版本号
<properties>
<spring.version>4.1.1.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
8.仓库
1.本地仓库
2.远程创库
私服(架设在当前局域网环境下,为当前局域网范围内的所有maven工程服务)
中央仓库(架设在Internet上,为全世界所有Maven工程服务)
中央仓库的镜像(架设在各个大洲,为中央仓库分担流量)
9maven生命周期
●Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了。
●Maven有三套相互独立的生命周期,分别是:
①Clean Lifecycle在进行真正的构建之前进行一些清理工作。
②Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等。
③Site Lifecycle生成项目报告,站点,发布站点。
再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean,这个clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。
11.2 clean生命周期
Clean生命周期一共包含了三个阶段:
①pre-clean 执行一些需要在clean之前完成的工作
②clean 移除所有上一次构建生成的文件
③post-clean 执行一些需要在clean之后立刻完成的工作
11.3 Site生命周期 生成一个站点网页,有一些关于你项目的描述信息
①pre-site 执行一些需要在生成站点文档之前完成的工作
②site 生成项目的站点文档
③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
④site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
11.4 Default生命周期(默认生命周期)
Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如JAR。
pre-integration-test
integration-test
post-integration-test
verify
install将包安装至本地仓库,以让其它项目依赖。
deploy将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
当你执行靠后的命令 前面的命令都会自动执行
10.插件与目标
可以发现进行编译测试和编译test时使用的工具都是一样的 实际上就是执行了javac 进行了编译
11.maven聚合
将多个工程拆分为模块之后,需要多次安装,清除操作,才能进行部署
在工程中使用module标签 可以直接使用视图模式进行勾选即可
<modules>
<module>../Hello</module>
<module>../HelloFriend</module>
<module>../MakeFriends</module>
</modules>
12.mavenweb工程
创建选择war包即可,可以发现pom报错,这时因为eclipse认为他是一个动态的web工程但是没有web.xml文件,缺少了要素
+
https://mp.csdn.net/postedit/89136178
依赖:子工程可以获取父工程的所有依赖 包括 provided ,但是通过依赖传递的非子工程不能获得其他的依赖
我们可以到http://mvnrepository.com/搜索需要的jar包的依赖信息。
http://search.maven.org/
补充:
配置我们的文件是否进行打包
<!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.conf</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.conf</include>
<include>**/*.ftl</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
maven共有三个仓库,本地仓库,中央仓库,远程仓库,当本地仓库不存在导入的文件时,会去中央仓库中寻找,当中央仓库中没有时,会查看pom文件中是否有配置远程仓库的地址,如果没有,那么报错,如果有,那么去远程仓库继续寻找,配置远程仓库如下:
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
补充:
关于
<packaging>pom</packaging> 的使用
在maven中有三种形式的packaging的标签 分别为pom jar war 对于父工程一般当然用pom对于service 用jar 发布的工程可以用war 但是现在springboot也不需要用war打包了,默认为jar包