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(一些文档)
  • 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包冲突

  1. 第一声明优先原则:坐标pom上面先导入
  2. 就近原则:直接依赖比传递依赖路径近,最终是直接依赖的jar包进入项目。可以通过dependencyManagement来锁住jar包避免直接依赖,可以通过exclusion来排除jar包

# 直接依赖和传递依赖的区别:

a依赖b,b依赖c,则a直接依赖b,a传递依赖c

# dependencies和dependencyManagement的区别

dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项。dependencyManagement里只是声明依赖,并不实现引入。有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本

上次编辑于: 2021年12月21日 14:30