【Java之Maven】

Maven

功能

项目构建

项目构建是指一个项目从编写代码,到编译,到测试,到打包,到上线等一系列的步骤。

依赖管理

项目管理其实就是可以帮助我们去管理我们的项目。

其实就是管理我们的项目的依赖。帮助我们把项目的依赖集中的管理起来。

安装Maven

下载

注意,Maven的版本和Idea的版本以及JDK的版本是对应的。

JDK: JDK8

IDEA: 2018.3.6

Maven: 3.5.3

解压

安装的软件的解压路径里面不要有中文,不要有特殊字符(例如空格 等等)

配置环境变量

在path中添加根目录的路径名

mvn -v用来检测

配置maven

  • 本地仓库

  • 中央仓库

  • 配置本地仓库

在maven的根目录下的conf文件夹中有一个settings.xml配置文件,需要配置一个 本地仓库

<localRepository>D:\maven\repo</localRepository>
  • 配置中央仓库

在 标签里面加入以下内容

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

配置idea中maven的配置

创建maven工程

手动

maven项目的要求:

1. 所有的源代码都放在 src/main/java 路径下
2. 所有的配置文件都放在 src/main/resources 路径下
3. 所有的测试案例源代码都放在 src/test/java路径下
4. 所有的测试需要的配置文件都放在 src/test/resources 路径下
  1. 每一个maven项目在项目的根目录下必须得有一个pom.xml文件
  2. maven的项目编译的文件存放的路径必须是 项目根目录下的target文件夹
  • 新建一个java项目

  • 新建文件夹

  • 标记对应的文件夹

    在项目结构中标记

  • 新建一个pom.xml文件

    在项目的跟目录下去新建一个pom.xml文件,文件里面配置一下内容

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
        <!-- 上面的这些路径其实就是一些 约束文件
            这些约束文件其实就是定义了这个xml文件中可以出现什么标签,以及标签出现的顺序
        -->
        <!-- 不用改 -->
        <modelVersion>4.0.0</modelVersion>
    
        
        <!-- maven 项目的坐标 -->
        
        <!-- 组织名 通常来说是域名反转-->
        <groupId>com.cskaoyan</groupId>
        
        <!-- 应用名 你这个项目的名字 -->
        <artifactId>mybatis-demo</artifactId>
        
        <!-- 版本号 0.0.1 
        0.x 的版本通常来说是不稳定版
        x.x.x-beta 线上测试版(不稳定的)
        x.x.x- SNAPSHOT 快照版 可以理解为稳定版
        -->
        <version>1.0.0</version>
    </project>
    
    • 让idea识别你的项目为maven工程
      • 右键 pom.xml文件,add as maven project

使用idea来创建

只需要注意项目名称和artifactId保持一致

使用Maven工程

项目构建

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

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

执行命令有几种方式:

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

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

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

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

  1. 清理 帮助我们去删除编译生成的target文件夹

    mvn clean

  2. 编译 编译其实就是帮助我们把.java 文件变成 .class文件,并且把对应的配置文件也复制过去

    mvn compile

    编译之后有对应的目录

    注意在编译完成后,所有的java文件和配置文件都会放入classes文件中

    java文件相当于是源代码路径,这和普通的src是一致的

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

    mvn test

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

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

    mvn package

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

<!-- 默认配置的是 jar -->
<packaging>war</packaging>

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

mvn install

  1. 部署 站点生成,其实就是帮助我们把本地仓库中的jar包上传到服务器上去

    mvn deploy

    这个命令不是重点,因为在公司中,一般不采用mvn来部署项目(jenkins\ docker \ k8s )

依赖管理

如何导包

  • 找到对应jar包的坐标

    去maven的网站中搜索 https://mvnrepository.com/

  • 复制坐标到pom.xml文件中

scope的传递范围

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

  • compile

    这个是默认的作用域。在编译的时候起作用,在任何时候任何地方都是有效的。

  • provided

    编译的时候有效、测试的时候有效,但是运行的时候失效

  • test

    这个是测试案例的作用域,这个test修饰的依赖只能在 src/test/java 路径下才能生效

  • runtime

    runtime修饰的jar包,在编译的时候,不起作用,只有在运行的时候,才会起作用

    典型的案例 就是mysql的驱动包。

依赖传递

项目A的依赖中有项目B,项目B的依赖有项目C,所以项目A的依赖中也有项目C

依赖冲突

在同一个项目中对于同一个jar包的不同版本,我们只需要一个版本,如果导入多个版本就会造成冲突

  • 声明优先原则

    谁写在前面就以谁为准

  • 就近原则

    谁的传递次数最少以谁为准

  • 手动排除

  • 提取常量

补充配置

需要把以下的配置添加到 settings.xml文件中,主要是去指定我们使用maven编译的时候jdk的版本

<profile>
    <id>jdk-1.8</id>
    <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
    </activation>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
</profile>

解决test方法乱码

<build>
        <plugins>
            <!-- 解决maven test命令时console出现中文乱码乱码 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.7.2</version>
                <configuration>
                    <forkMode>once</forkMode>
                    <argLine>-Dfile.encoding=UTF-8</argLine>
                    <!-- <systemProperties> -->
                    <!-- <property> -->
                    <!-- <name>net.sourceforge.cobertura.datafile</name> -->
                    <!-- <value>target/cobertura/cobertura.ser</value> -->
                    <!-- </property> -->
                    <!-- </systemProperties> -->
                </configuration>
            </plugin>
        </plugins>
    </build>

使用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();
        }

project和module的区别与联系

  • project

    一个项目是IDEA开发工作的顶级组织单位。在其完成的形式中,一个项目可能代表一个完整的软件解决方案

    项目是以下内容的集合:

    • 你的工作成果:源代码、脚本、配置文件、文档、工件等。
    • 用于开发、编译、运行和测试代码的SDK和库。
    • 在项目上下文中表示你的工作偏好设置

    一个项目有一个或者多个模块作为其部件

  • module

    • 模块是项目的一部分,你可以独立的编译、运行、测试和调试。
    • 模块是一种在维护公共项目配置的同事降低大型项目复杂性的方法。
    • 模块可以重复使用:如果需要,可以再多个项目中包含一个模块。

总结一下:Project是IDEA的最顶级的结构单元,project只是起到了一个项目定义的功能,类似于工作空间的概念,这个工作空间可以去配置你的IDEA的一些公共配置,例如SDK、代码库等。module是project的一部分,可以用来单独编译运行等,每一个module项目运行的时候都是一个单独的Java进程。IDEA创建项目的时候会默认创建一个同名的module,实际上我们开发写代码都是在开发这个module。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值