笔记: 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包的间接依赖:

  1. 命令行
[root]# mvn dependency:tree
  1. IDEA:Maven界面

  2. pom.xml

解决冲突

1. 将不需要的依赖exclude掉

<exclusion>  
</exclusion>  

2. 统一版本

为jar包指定一个版本,所有用到的都会是这个版本




说明

内容参考自硬核空间菜鸟教程百度文库

深入Maven:

菜鸟教程

posted @ 2019-11-16 14:40  带了1个小才艺  阅读(511)  评论(0)    收藏  举报