外部链接链轮的建设对于网站提杭州网站设计公司有哪些
【Java面试总结】Maven篇
- 1.Maven坐标是啥
- 2.Maven常见的依赖范围有哪些?
- 3.多模块如何聚合
- 4.对于一个多模块项目,如果管理项目依赖的版本
- 5.maven怎么解决版本冲突
- 6.Maven常用命令有哪些?
1.Maven坐标是啥
一般maven使用groupID
,artifactId
,version
,packaging
来表示一个项目的某个版本
2.Maven常见的依赖范围有哪些?
compile
:编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种都有效,即在编译、测试和运行的时候都要使用该依赖 Jar包。test
:测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试,而在编译和运行项目时无法使用此类依赖,典型的是JUnit,它只用于编译测试代码和运行测试代码的时候才需要。runtime
:运行时依赖范围,对于测试和运行有效,但是在编译主代码时无效,典型的就是 JDBC 驱动实现。provided
:此依赖范围,对于编译和测试有效,而对运行时无效。比如 servlet-api.jar 在 Tomcat中已经提供了,我们只需要的是编译期提供而已。system
:不从maven仓库获取该jar,而是通过systemPath指定该jar的路径
3.多模块如何聚合
配置一个打包类型为pom的聚合模块,然后在该pom中使用<module>
元素声明要聚合的模块
4.对于一个多模块项目,如果管理项目依赖的版本
通过在父模块中声明dependencyManagement
和pluginManagement
, 然后让子模块通过<parent>
元素指定父模块,这样子模块在定义依赖是就可以只定义groupId
和artifactId
,自动使用父模块的version
,这样统一整个项目的依赖的版本。
5.maven怎么解决版本冲突
单纯依赖 Maven 来进行依赖调解,在很多情况下是不适用的,需要我们手动排除依赖。
举个例子,当前项目存在下面这样的依赖关系:
依赖链路一:A -> B -> C -> X(1.5) // dist = 3
依赖链路二:A -> D -> X(1.0) // dist = 2
根据路径最短优先原则,X(1.0) 会被解析使用,也就是说实际用的是 1.0 版本的 X。
但是!!!这会一些问题:如果 D 依赖用到了 1.5 版本的 X 中才有的一个类,运行项目就会报NoClassDefFoundError
错误。如果 D 依赖用到了 1.5 版本的 X 中才有的一个方法,运行项目就会报NoSuchMethodError
错误。
如何解决呢? 我们可以通过exclusive
标签手动将 X(1.0) 给排除。
<dependency>......<exclusions><exclusion><artifactId>x</artifactId><groupId>org.apache.x</groupId></exclusion></exclusions>
</dependency>
6.Maven常用命令有哪些?
install
本地安装, 包含编译,打包,安装到本地仓库
编译 - javac
打包 - jar
, 将Java代码打包为jar文件
clean
清除已编译信息,删除工程中的target目录
compile
只编译。javac
命令
deploy
部署。常见于结合私服使用的命令。
相当于是install+上传jar到私服
。包含编译,打包,安装到本地仓库,上传到私服仓库。
package
打包。包含编译,打包两个功能