Maven
2021-12-20 大约 2 分钟
# Maven
# maven web目录结构
src
- main
- bin 脚本库
- java java源代码文件
- resources 资源库,会自动复制到classes目录里
- filters 资源过滤文件
- assembly 组件的描述配置(如何打包)
- config 配置文件
- webapp web应用的目录。WEB-INF、css、js等
- test
- java 单元测试java源代码文件
- resources 测试需要用的资源库
- filters 测试资源过滤库
- site Site(一些文档)
- main
target
LICENSE.txt
README.txt
# 依赖范围(dependencies scope):
- compile:为默认的依赖有效范围。如果在定义依赖关系的时候,没有明确指定依赖有效范围的话,则默认采用该依赖有效范围。此种依赖,在编译、运行、测试时均有效。
- provided:在编译、测试时有效,但是在运行时无效。例如:servlet-api,运行项目时,容器已经提供,就不需要Maven重复地引入一遍了。
- runtime:在运行、测试时有效,但是在编译代码时无效。例如:JDBC驱动实现,项目代码编译只需要JDK提供的JDBC接口,只有在测试或运行项目时才需要实现上述接口的具体JDBC驱动。 test :只在测试时有效,例如:JUnit。
# 生命周期
- clean
- compile
- test:编译test包下的代码
- package:编译java和test文件夹并打成wav包
- install:package后将wav包安装到本地maven仓库
- deploy:发布
# 解决jar包冲突
- 第一声明优先原则:坐标pom上面先导入
- 就近原则:直接依赖比传递依赖路径近,最终是直接依赖的jar包进入项目。可以通过dependencyManagement来锁住jar包避免直接依赖,可以通过exclusion来排除jar包
# 直接依赖和传递依赖的区别:
a依赖b,b依赖c,则a直接依赖b,a传递依赖c
# dependencies和dependencyManagement的区别
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项。dependencyManagement里只是声明依赖,并不实现引入。有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本