5. 使用Maven工程 

 5.1 项目构建

Maven可以用来管理项目的声明周期。

Maven定义的声明周期 包括了 清理、编译、测试、打包、安装、站点部署等一套完整的流程。

执行命令有几种方式:

- 打开cmd窗口,进入到这个module的根目录下,执行命令
- 打开idea,在右边有一个控件栏,打开lifecycle,双击执行对应的指令
- 打开idea,在下面有一个 terimal插件栏,打开,执行对应的命令

java启动命令指定maven配置 java执行maven命令_maven

maven的项目构建的流程是从validate开始的。

例如我们要去执行package,会先执行 validate -> compile -> test - > package

是有一个流程的先后顺序的。

  1. 清理 帮助我们去删除编译生成的target文件夹
    mvn clean
  2. 编译 编译其实就是帮助我们把.java 文件变成 .class文件,并且把对应的配置文件也复制过去
    mvn compile编译之后有对应的目录

 

java启动命令指定maven配置 java执行maven命令_java_02

java启动命令指定maven配置 java执行maven命令_开发语言_03

也就是从java和resources文件下开始都是同级到编译后的classes文件

3.测试 测试其实就是去运行这个项目中所有的测试类的测试方法

mvn test

在执行mvn test的时候,会先去编译,执行所有的测试类里面的测试方法

执行 mvn test 会执行测试类下的所有单元测试方法

java启动命令指定maven配置 java执行maven命令_maven_04

4.打包 打包其实就是把我们项目打包成 .jar (jar 包) 或者是 .war (war 包)

mvn package

默认是打jar包,如果需要打war包,那么就去修改 pom.xml文件的配置

 打成var包

java启动命令指定maven配置 java执行maven命令_java启动命令指定maven配置_05

5.安装 其实就是把打包生成的jar包复制到本地仓库中去

mvn install

怎么样去本地仓库中找对应的jar包呢?

通过坐标来 找

java启动命令指定maven配置 java执行maven命令_java启动命令指定maven配置_06

 

5.2.2 scope的传递范围

scope指的是这个依赖的包的作用域

  • compile
    这个是默认的作用域。在编译的时候起作用,在任何时候任何地方都是有效的。
  • provided
    编译的时候有效、测试的时候有效,但是运行的时候失效

比如mysql的驱动包只需要在运行起作用,就可以把范围改成runtine 

        provided:编译有效,测试有效,但是运行时失效

  • test
    这个是测试案例的作用域,这个test修饰的依赖只能在 src/test/java 路径下才能生效
  • runtime
    runtime修饰的jar包,在编译的时候,不起作用,只有在运行的时候,才会起作用
    典型的案例 就是mysql的驱动包。

java启动命令指定maven配置 java执行maven命令_java启动命令指定maven配置_07

 

5.2.3 依赖传递

java启动命令指定maven配置 java执行maven命令_maven_08

 

 

5.2.4 依赖冲突

在同一个项目中,对于同一个jar包的不同版本,我们应用只导入一个版本,如果导入了多个版本,就依赖冲突了。

  • 声明优先原则

java启动命令指定maven配置 java执行maven命令_开发语言_09

就近原则

因为依赖具有传递性,所有是谁传递次数比较少以谁为准  

 

java启动命令指定maven配置 java执行maven命令_开发语言_10

 先选先声明的,然后用就近原则替换

排除依赖

上面的两种方式其实都是不靠谱的。因为其实如果你需要使用声明优先原则来排除依赖的话,那么依赖的顺序就不能改变了。一般来说,我们不能使用声明优先原则和就近原则来排除依赖,对于冲突的依赖,我们应该手动排除

java启动命令指定maven配置 java执行maven命令_java启动命令指定maven配置_11

 6.自定义标签常量,来控制统一版本.

提取常量

提取常量是从根本上预防冲突依赖的问题

java启动命令指定maven配置 java执行maven命令_java启动命令指定maven配置_12

 

6. maven的插件

maven的插件是指我们maven运行的几个命令都是依赖于maven的插件来工作的。

java启动命令指定maven配置 java执行maven命令_java启动命令指定maven配置_13

 

 7.指定编译版本

java启动命令指定maven配置 java执行maven命令_maven_14

8. 使用maven来开发

和之前不一样的地方

  • 导包方式不一样
  • 代码写的位置、配置文件存放的位置不一样
  • 读取配置文件的输入流的方式不一样
    现在的读取方式:
// 初始化数据源
    static {

        Properties properties = new Properties();
        try {
            // 绝对路径的写法,不好
//            InputStream in = new FileInputStream("E:\\cskaoyan\\35workspace\\workspace_35\\druid-maven-demo\\src\\main\\resources\\druid.properties");

            // 我们在maven的项目中,需要使用类加载器去找文件的路径
            ClassLoader classLoader = DruidUtils.class.getClassLoader();

            // 类加载去找文件的时候,因为类加载是从classes文件夹开始加载的,所以会从classes文件夹下开始加载
            InputStream inputStream = classLoader.getResourceAsStream("druid/druid.properties");


//            URL url = classLoader.getResource("druid/druid.properties");
//            String path = url.getPath();
//
//            System.out.println("path:" + path);
            // /E:/cskaoyan/35workspace/workspace_35/druid-maven-demo/target/classes/druid.properties


            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        使用类加载器加载(因为文件都被映射到target里面了)

java启动命令指定maven配置 java执行maven命令_java_15

 

 相当于通过类加载器是从target下的classes的同级目录下开始查找

java启动命令指定maven配置 java执行maven命令_jar包_16

 

==

c3p0在src的配置文件 ,在maven里在哪里