包
-
JVM的⼯工作被设计地相当简单:
- 执⾏一个类的字节码。
- 假如这个过程中碰到了新的类,加载它。
-
类的全限定类名(目录层级)唯一确定了一个类。
-
包就是把许多类放在一起打的压缩包。
-
当多个同名类出现在一个 Classpath 中时,麻烦开始了。
包管理
-
What
- 包管理的本质就是告诉 JVM 如何找到所需的第三方类库。
- 成功地解决其中的冲突问题。
-
How
- ⼿动写命令进行编译运⾏
- Apache Ant
- Maven
Maven
- 首先 Maven 不仅仅是包管理工具,但这里只讨论其包管理能力。
- Maven 会有中央仓库和本地仓库两个仓库:
- 本地仓库默认位于~/.m2目录中,里面会放置一些经过下载的第三方包的缓存。
- 中央仓库一个包会含有
groupId
、artifactId
、version
三个字段,在中央仓库中,一个包存放的路径也是以这三个字段来存放的,具体会存放在groupId/artifactId/version
这个位置。
- 在
pom.xml
中添加包的信息,Maven 就会自动帮你下载这些包以及其相关依赖包到本地中缓存起来。
Maven 如何解决冲突
包冲突.jpg- 常见冲突报错:
- AbstractMethodError
- NoClassDefFoundError
- ClassNotFoundException
- LinkageError
- 方法 1 是 Maven 默认解决方式为。
- 原则:最近的胜出
- 方法 2 手动忽略最近的包,可由以下代码实现。
<dependency> <groupId>xxx</groupId> <artifactId>xxx</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>yyy</groupId> <artifactId>yyy</artifactId> </exclusion> </exclusions> </dependency>
- 方法 3 则手动创建了最近的包。
- 使用
Maven Helper
插件,帮助解决冲突。 -
pom.xml
文件中,可以通过设置scope
标签,来指定一个包是否可以被生产代码和测试代码所引用:-
complie
(生产代码以及测试代码均可见) -
test
(只有测试代码可见) -
provided
(只在编译的生产代码的时候生效,在运行时无效)
-
完。
网友评论