这里写自定义目录标题
hellowmaven 工程
|——src 源码
|——|——main 存放主程序
|——|——|——java 存放Java源码(dao、service、controller)
|——|——|——resources 存放框架或其他工具的配置文件(spring、mapper、jdbc。properties)
|——|——|——sql 存放.sql文件
|——|——|——webapp 存放index.jsp文件
|——|——|——|——resources
|——|——|——|——WEB-INF 存放web.xml文件
|——|——test 存放测试程序
|——|——|——java 存放java测试的原文件
|——|——|——resources 存放测试的配置文件
|——pom.xml maven工程的核心配置文件
maven常用命令:
mvn compile 编译,将Java 源程序编译成 class 字节码⽂件。
mvn test 测试,并⽣成测试报告
mvn clean 将以前编译得到的旧的 class 字节码⽂件删除
mvn pakage 打包,动态 web⼯程打 war包,Java⼯程打 jar 包。
mvn install 将项⽬⽣成 jar 包放在仓库中,以便别的模块调⽤
jar包依赖的范围 scope:
1.compile 范围依赖
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:参与
是否参与部署:参与
典型例⼦:log4j
2.test 范围依赖
对主程序是否有效:⽆效
对测试程序是否有效:有效
是否参与打包:不参与
是否参与部署:不参与
典型例⼦:Junit
3.provided 范围依赖
对主程序是否有效:有效
对测试程序是否有效:有效
是否参与打包:不参与
是否参与部署:不参与
典型例⼦:servlet-api.jar,⼀般在发布到 服务器中,⽐如 tomcat,服务器会⾃带 servlet-api.jar 包,所以provided 范围依赖只在编译测试有效。
runtime 范围依赖:在测试、运⾏的时候依赖,在编译的时候不依赖。例如:JDBC 驱动,项⽬代码只需要 jdk 提供的 jdbc 接⼝,只有在执⾏测试和运⾏项⽬的时候才需要实现 jdbc 的功能。
依赖的传递:
如我们创建三个 Maven ⼯程,maven-first,maven-second 以及 maven-third,⽽ third 依赖于second,second ⼜依赖于 first,那么我们说 second 是 third 的第⼀直接依赖,first 是 second 的第⼆直接依赖。⽽ first 是 third 的间接依赖。
总结
当第⼆依赖的范围是 compile 的时候,传递性依赖的范围与第⼀直接依赖的范围⼀致。
当第⼆直接依赖的范围是 test 的时候,依赖不会得以传递。
当第⼆依赖的范围是 provided 的时候,只传递第⼀直接依赖范围也为 provided 的依赖,且传递
性依赖的范围同样为 provided;
当第⼆直接依赖的范围是 runtime 的时候,传递性依赖的范围与第⼀直接依赖的范围⼀致,
但 compile 例外,此时传递的依赖范围为 runtime;
我们这⾥举个例⼦来看:
第⼆依赖范围是 test
依赖的排除
如果我们在当前⼯程中引⼊了⼀个依赖是 A,⽽ A ⼜依赖了 B,那么 Maven 会⾃动将 A 依赖的 B 引⼊当前⼯程,但是个别情况下 B 有可能是⼀个不稳定版,或对当前⼯程有不良影响。这时我们可以在引⼊ A 的时候将 B 排除。
exclusions:⽤来排除传递性依赖 标签
如何排除呢?我们在 Maven_second 的 pom.xml ⽂件中添加如下代码:
再次查看⼯程:Maven_second 的 commons-logging 已经移除了
依赖的冲突
在 maven 中存在两种冲突⽅式:⼀种是跨 pom ⽂件的冲突,⼀致是同⼀个 pom ⽂件中的冲突。
**跨 pom ⽂件,路径最短者优先。**
⽐如我们在 Maven_first 中的 Junit 是4.9版本的,Maven_second 中的 Junit 是4.8版本的,那么Maven_third 中的 Junit 将会是那个版本呢?
由于 Maven_second 是 Maven_third 的直接依赖,明显相⽐于 Maven_first 路径要短,所以 Maven_third 的 Junit 版本与 Maven_second 保持⼀致
**同⼀个pom.xml ⽂件,先申明者优先。**越往下,越优先声明!!!
可选依赖
Optional 标签标示该依赖是否可选,默认是 false。可以理解为,如果为 true,则表示该依赖不会传递下去,如果为false,则会传递下去。
在 Maven_second 的 pom ⽂件中设定 Junit 不可传递,那么Maven_third ⼯程中将不会有来⾃Maven_second 的 Junit 的传递。