笔记: Maven 和 java 包(package)
笔记: Maven 和 java 包(package)
1. package
JVM 执行一个类的字节码,类的全限定类名(目录)确定了一个类在哪里。
java -classpath / -cp
classpath设置的目的,在于告诉java执行环境,在哪些目录下可以找到您所要执行的java程序所需要的类或者包。
包允许将类组合成较小的单元(类似文件夹),使其易于找到和使用相应的类文件,避免命名冲突。在使用许多类时,类和方法的名称很难决定。有时需要使用与其他类相同的名称。包基本上隐藏了类并避免了名称上的冲突。
2. Maven 包管理工具
解决:jar 包之间的依赖关系
Maven 按照一定的约定存储包:
- groupId
这是工程组的标识。它在一个组织或者项目中通常是唯一的。
- artifactId
这是工程的标识。它通常是工程的名称。groupId 和 artifactId 一起定义了在仓库中的位置。
- version(语义化版本)
这是工程的版本号。在仓库中,它用来区分不同的版本。
Maven本地仓库:
- 默认位于~/.m2
- 下载的包在该目录缓存
传递依赖的自动管理
不允许classpath出现同命不同版本的包
- 就近原则
- 路径相同,留下靠前的包
Scope
scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布。
- compile
默认scope为compile,表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包之时,会达到包里去。
- test
该依赖仅仅参与测试相关的内容,包括测试用例的编译和执行,比如定性的Junit。
- runtime
依赖仅参与运行周期中的使用。一般这种类库都是接口与实现相分离的类库,比如JDBC类库,在编译之时仅依赖相关的接口,在具体的运行之时,才需要具体的mysql、oracle等等数据的驱动程序。
此类的驱动都是为runtime的类库。
- provided
该依赖在打包过程中,不需要打进去,这个由运行的环境来提供,比如tomcat或者基础类库等等,事实上,该依赖可以参与编译、测试和运行等周期,与compile等同。区别在于打包阶段进行了exclude操作。
- system
使用上与provided相同,不同之处在于该依赖不从maven仓库中提取,而是从本地文件系统中提取,其会参照systemPath的属性进行提取依赖。
- import
这个是maven2.0.9版本后出的属性,import只能在dependencyManagement的中使用,能解决maven单继承问题,import依赖关系实际上并不参与限制依赖关系的传递性。
3. 解决Maven包依赖冲突
查看jar包的间接依赖:
- 命令行
[root]# mvn dependency:tree
-
IDEA:Maven界面
-
pom.xml
解决冲突
1. 将不需要的依赖exclude掉
<exclusion>
</exclusion>
2. 统一版本
为jar包指定一个版本,所有用到的都会是这个版本
说明
内容参考自硬核空间 ,菜鸟教程 及 百度文库 等

浙公网安备 33010602011771号