pom.xml的说明
项目 对象 模型
想想地球仪。
pom对于项目来说是核心配置文件,所有构建相关的东西都在里面。
相当于web.xml对于动态web工程的作用。
坐标
数学中的一个概念。
两个向量 x y 来找到唯一的 平面点
maven 中的坐标
使用三个
groupid 域名的倒叙 由大到小的过程,就像是快递的地址 spirng的这个是org.springframework
artifactid 项目名+模块的名称 spring-core
version 三个确定唯一
目录就是这三个的名称,如果有点就加一个目录
最后文件的命名就是 名称+版本号。
坐标也跟本地目录关联,第一其实是用于下载。因为能区别唯一。所以在本地保存也没问题。
仓库
1,本地仓库
2,远程仓库
又分:私服 局域网的东西 相当于缓存的意思
中央仓库:为全世界服务的
中央的镜像:为了分担中央仓库的流量
仓库有啥?
1,maven 执行命令的一些插件。
2,第三方的jar 其实这个jar 和自己的jar 是一个道理。都是项目变成的。 第一方应该是jdk 第二方就是自己。
3,自己的项目 打成jar
其实上面的是统一的管理。都一样
出现错误要主动的阅读:
依赖
如果是依赖spring的jar 在本地找不到,会去网上找
如果是自己写的jar 在本地和网上都不会有
我们可以用install 命令来实现,在本地仓库的安装
依赖的范围
标签来控制
compile 所有位置有效
对主程序有效
对测试程序有效
是否参与打包
test 只对test有效。只test用,不打包 因为测试的时候会用到主程序的类。所以compile的会对test可见。
provided 她跟test的区别就是他在main中有效,不参与打包。 只用不打包
生命周期
各个命令的执行其实就像播放器的顺序执行。
因为每一步都有关联。
就像是爬山,等到一定的高度才能下一步。
执行特点,是从头开始执行。为了实现自动化。也就是第三部包含前两部。
mvn compile
resource
compile 经过了这两部
如果是
mvn test
之前的两步
+test resource
test compile
test
测试报告
mvn package
之前的6步
+jar
插件 和 目标相关的东西
maven中只定义了各个阶段要执行的人物
插件和任务对应
compile 都是maven的编译插件
test-compile
开发工具中maven 设置。eclipse中每次要新的工作空间都要从新设置
maven设置 installation 就是这只maven的主程序的位置
第二就是配置文件的位置,为了找到仓库。
如果想通过maven设置
编译的jdk版本
需要在setting文件中 设置profile
创建动态的web工程在maven中都是复杂的,web的路径什么的都要自己创建,无论是eclipse 还是idea
而且相关的依赖可以用provided了 默认都是compile的。
servlet-api 不参与部署的特例。
eclipse如果想要提示,必须报想应的jar 导进来
如果你把servlet-api设置成compile 会和容器的冲突。有两个容器无法选择。
如果是自己手动写的项目,导入eclipse 没有eclipse的属性文件,所以不认为是工程,无法导入。必须用maven的方式导入。导入一次过后,再倒入可以直接用默认的导入方法。
依赖问题
当自己写的依赖项目没有在本地库安装,在eclipse中pom.xml中依赖了,编码中是不报错的。但是编译的时候报错:
因为eclipse 有插件,将项目弄到了eclipse中。但是编译靠的maven ,所以失败。
比如在pom.xml中加入一个 spring-core 的的jar maven 会自动的将相关的依赖 commons loggin引入
一个项目依赖其它项目 如果其它项目已经有了很多pom的引入。
会把相关的jar也导入
dependency hieracr结构
依赖的传递性,有点像继承。
test 和provided的不能传递、
依赖的排除
我需要依赖,但是有些我不要。在依赖的pom文件下边
<exculusion
<gid
<arid
就OK了。这个依赖中排除这个jar
依赖的原则
maven自动的。
解决jar的冲突问题。
低:如果依赖的两个项目的一个jar 不同,我们就取离我们进的。这个就近原则,也就是如果你自己直接声明优先,就用声明的,虽然一样。
高:然后如果并列的化,看dependence 在上边的优先。 还是就近原则 第一步发生,然后才是第二步,因为是深度优先。
统一版本号控制,是不同jar的版本,有点像java的全局变量
值
引用就是 ${verson1}
继承问题的引入:为了相同jar版本的统一管理。
因为junit 这个是test 的不能传递。所以每个项目都有一个,这样看着很乱。
<?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>
<groupId>com.home</groupId>
<artifactId>one</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>../two</module>
<module>../three</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
<?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">
<parent>
<artifactId>one</artifactId>
<groupId>com.home</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../one/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>two</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
<?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">
<parent>
<artifactId>one</artifactId>
<groupId>com.home</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../one/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>three</artifactId>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
以上是继承的方法。
聚合:就是一键安装各个工程。
<modules>
<module>../two</module>
<module>../three</module>
</modules>
这个并不限制于是子工程,所有的工程都是可以的。上下的顺序也是无所谓的。智能识别了。
在父工程直接install 就ok了