Maven

目录

Maven的简介

Maven的环境配置

Maven目录结构

Maven的优化

        1.修改默认仓库位置

        2.更换阿里镜像,加快依赖下载

cmd下编译和运行

        1.编译java文件

         2.执行main方法

Maven命令

常用命令

命令参数

 -D传入属性参数

 -P使用指定的Profile配置

IDEA编辑器集成Maven环境

Maven项目的创建

        创建Java项目

        编译项目

        打包项目

         创建JavaWeb项目

        启动项目

                一、修改配置

                        1.修改jdk版本

                        2.设置单元测试的版本

                        3.删除pluginManagement标签

                二、添加web部署的插件

                        1.Jetty插件

                        2.Tomcat插件

                三、启动

                        1.jetty启动

                        2.Tomcat启动

                pom.xml

Maven仓库

Maven环境下构建多模块项目

        一、创建项目

                        1.创建maven_parent项目

                        2.创建maven_dao模块

                        3.创建maven_service模块

                        4.创建maven_controller模块

        二、修改子模块的配置文件信息

        三、设置模块之间的依赖

                        1.maven_dao

                        2.maven_service

                        3.maven_controller

        四、添加Tomcat插件

        五、启动项目

Maven的打包

                一、建立对应的目录结构

                                1.添加Java源文件夹

                                2.添加资源文件夹

                                3.添加对应的文件夹目录

                 二、添加Profile配置

                 三、设置资源文件配置

                 四、执行打包操作

Maven依赖的基本概念

        依赖的基本配置

        依赖范围

        传递性依赖


 

Maven的简介

Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。

Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。


Maven的环境配置

要求
JDKMaven 3.3 要求 JDK 1.7 或以上
Maven 3.2 要求 JDK 1.6 或以上
Maven 3.0/3.1 要求 JDK 1.5 或以上

cmd控制台查看

c:\> java -version

Maven 下载地址:http://maven.apache.org/download.cgi

 新建系统变量 MAVEN_HOME,变量值为maven的解压目录下的bin目录

 编辑系统变量 Path,添加变量值:;%MAVEN_HOME%\

检查maven是否配置成功

cmd控制台运行

mvn -v

 


Maven目录结构


Maven的优化

         maven目录\conf\settings.xml

        1.修改默认仓库位置

                添加仓库配置位置

<localRepository>要修改的仓库地址</localRepository>

 

        2.更换阿里镜像,加快依赖下载

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


cmd下编译和运行

cmd下进入项目根目录

        1.编译java文件

        mvn compile

 

         2.执行main方法

mvn exec:java -Dexec.mainClass="com.xxxx.demo.Hello"

 

 
 

第一次下载会比较慢

如果编译不成功,可能出现的问题

1.不是使用管理员权限执行dos命令
2.JDK环境配置有问题,重装DK
3.代码编写时,类里面没设置包名(如果编译时类没加包名,执行时也不需要加包名)


Maven命令

Maven的命令格式如下:

    mvn [plugin-name] : [goal-name]

命令代表的含义:执行plugin-name插件的 goal-name目标

常用命令

命令描述
mvn -version显示版本信息
mvn clean清理项目生产的临时文件,一般是模块下的target目录
mvn compile编译源代码,一般编译模块下的src/main/java目录
mvn package项目打包工具,会在模块下的target目录生成jar或war等文件
mvn test  测试命令,或执行src/test/java/下junit的测试用例
mvn install将打包的jar/war文件复制到你的本地仓库中,供其他模块使用
mvn deploy 将打包的文件发布到远程参考,提供其他人员进行下载依赖
mvn site生成项目相关信息的网站
mvn eclipse:eclipse 将项目转化为Eclipse项目
mvn dependency:tree打印出项目的整个依赖树
mvn archetype:generate 创建Maven的普通java项目
mvn tomcat7:run 在tomcat容器中运行web应用
mvn jetty:run 调用Jetty插件的Run目标在Jetty Servlet容器中启动web应用

注意:
        运行maven命令的时候,首先需要定位到maven项目的目录,也就是项目的pom .xml文件所在的目录。否则,必需通过参数来指定项目的目录。

命令参数

        上面列举的只是比较通用的命令,其实很多命令都可以携带参数以执行更精准的任务。

       

 -D传入属性参数

         例如:

mvn package -Dmaven.test.skip=true


以-D开头,将maven.test.skip的值设为true ,就是告诉maven打包的时候跳过单元测试
同理,mvndeploy-Dmaven.test.skip=true代表部署项目并跳过单元测试。

 -P使用指定的Profile配置

比如项目开发需要有多个环境,一般为开发,测试,预发,正式4个环境。

        通过maven可以实现按不同环境进行打包部署,例如:

                        mvn package -Pdev -Dmaven.test.skip=true

        表示打包本地环境,并跳过单元测试


IDEA编辑器集成Maven环境

1、IDEA 2018

            位置:在file ⇨ Other Settings ⇨ Default Settings

2、IDEA 2019

            Other Settings没有改变,Default settings变成了Settings for New Projects

            位置:在file ⇨ Other Settings ⇨ Settings for New Projects

3、IDEA 2020

            Other Settings变成了New Projects Settings

            位置:在file ⇨ New Projects Setup ⇨ Settings for New Projects

 


Maven项目的创建

        创建Java项目

                

 

注:右下角弹出的提示框,选择"Enable Auto-Import"(Maven启动自动导入)


        编译项目

 


        打包项目


         创建JavaWeb项目


        启动项目

                一、修改配置

                        1.修改jdk版本

                        2.设置单元测试的版本

                        3.删除pluginManagement标签


                二、添加web部署的插件

                          在build标签中添加plugins标签

                        1.Jetty插件

      <!--设置在plugins标签中-->
      <!--Jetty插件-->
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
        <version>6.1.25</version>
        <configuration>
          <!--热部署,每10秒扫描一次-->
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <!--可指定当前项目的站点名-->
          <contextPath>/maven03</contextPath>
          <connectors>
            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
              <port>9090</port> <!--设置启动的端口号-->
            </connector>
          </connectors>
        </configuration>
      </plugin>

                        2.Tomcat插件

      <!--Tomcat插件-->
      <!--设置在plugins标签中-->
      <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.1</version>
      <configuration>
        <port>8081</port> <!--启动端口默认:8080 -->
        <path>/test</path> <!--项目的站点名,即对外访问路径-->
        <uriEncoding>UTF-8</uriEncoding> <!--字符集编码默认:ISO-8859-1 -->
        <server>tomcat7</server> <!--服务器名称 -->
      </configuration>
    </plugin>

                三、启动

                        1.jetty启动

 

如果要设置在启动时指定端口号

        1.注释端口号的配置

         2.添加命令

 


                        2.Tomcat启动


                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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xxxx</groupId>
  <artifactId>maven03</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>maven03 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>https://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>maven03</finalName>
    <plugins>
      <!--设置在plugins标签中-->
      <!--Jetty插件-->
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
        <version>6.1.25</version>
        <configuration>
          <!--热部署,每10秒扫描一次-->
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <!--可指定当前项目的站点名-->
          <contextPath>/maven03</contextPath>
          <connectors>
            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
              <port>9090</port> <!--设置启动的端口号-->
            </connector>
          </connectors>
        </configuration>
      </plugin>

      <!--Tomcat插件-->
      <!--设置在plugins标签中-->
      <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.1</version>
      <configuration>
        <port>8081</port> <!--启动端口默认:8080 -->
        <path>/test</path> <!--项目的站点名,即对外访问路径-->
        <uriEncoding>UTF-8</uriEncoding> <!--字符集编码默认:ISO-8859-1 -->
        <server>tomcat7</server> <!--服务器名称 -->
      </configuration>
    </plugin>


    </plugins>
  </build>
</project>

Maven仓库

对于Maven来说,仓库只分为两类:本地仓库远程仓库

远程仓库分为三种:中央仓库,私服,其他公共库


中央仓库是默认配置下,Maven下载jar包的地方。
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。
其他公共库:常用的阿里云仓库配置。

maven依赖查询 https://mvnrepository.com/

                          https://search.maven.org/


Maven环境下构建多模块项目

这里以四个模块为例来搭建项目,以达到通俗易懂的初衷
模块maven_parent --基模块,就是常说的parent (pom)
模块maven_dao --数据库的访问层,例如jdbc操作(jar)
模块maven_service --项目的业务逻辑层(jar)
模块maven_controller --用来接收请求,响应数据(war)

        一、创建项目

                        1.创建maven_parent项目

                        2.创建maven_dao模块

                        3.创建maven_service模块

                                        创建maven_service模块的步骤与maven_dao模块一致。

                        4.创建maven_controller模块

                                        创建maven_controller模块的步骤与maven_dao模块基本一致,只需要将第一步选择Maven模板设置为web项目即可。(模板类型: maven-archetype-webapp)


        二、修改子模块的配置文件信息

  • 设置JDK版本
  • 设置单元测试JUnit版本
  • 删除多余的配置

        三、设置模块之间的依赖

                        1.maven_dao

                                新建包

                                在包中创建UserDao类

                                在类中添加方法

package com.xxxx.dao;

public class UserDao {
    public static void testDao(){
        System.out.println("UserDao Test....");
    }
}

                        2.maven_service

                                添加maven_dao的依赖

                                        dependencies标签中添加

<!--引入maven_dao模块的依赖-->
    <dependency>
      <groupId>com.xxxx</groupId>
      <artifactId>maven_dao</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

                                在项目中添加UserService类,并添加方法

                       

package com.xxxx.service;

import com.xxxx.dao.UserDao;

public class UserService {
    public static void testService(){
        System.out.println("UserService Test...");
        //调用maven_dao模块的方法
        UserDao.testDao();
    }
}

                        3.maven_controller

                                添加maven_service模块的依赖

                                        dependencies标签中添加

<!--引入maven_service模块的依赖-->
        <dependency>
            <groupId>com.xxxx</groupId>
            <artifactId>maven_service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

                                添加Servlet的依赖

<!--引入servlet的依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

                                新建Java类,继承HttpServlet类,并重写service方法

package com.xxxx.controller;

import com.xxxx.service.UserService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/user")
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("UserServlet Test....");
        //调用maven_service模块的方法
        UserService.testService();
    }
}

        四、添加Tomcat插件

                        在maven_controller中添加Tomcat插件

<!--Tomcat插件-->
      <!--设置在plugins标签中-->
      <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.1</version>
      <configuration>
        <port>8081</port> <!--启动端口默认:8080 -->
        <path>/test</path> <!--项目的站点名,即对外访问路径-->
        <uriEncoding>UTF-8</uriEncoding> <!--字符集编码默认:ISO-8859-1 -->
        <server>tomcat7</server> <!--服务器名称 -->
      </configuration>
    </plugin>

        五、启动项目

 

        如果启动失败,先将模块install

 

 


Maven的打包

                一、建立对应的目录结构

                      使用idea创建项目,目录结构可能会缺失,需要通过手动添加对应的目录
                                

                                1.添加Java源文件夹

                                2.添加资源文件夹

                                 3.添加对应的文件夹目录

                              以及添加不同环境下对应的配置文件。(本地环境、测试环境、正式环境)

                 二、添加Profile配置

                                 在pom.xml中添加Profile配置

<!--打包环境配置 开发环境 测试环境 正式环境-->
  <profiles>
      <profile>
        <id>dev</id>
        <properties>
          <env>dev</env>
        </properties>
        <!--未指定环境时,默认打包dev环境-->
        <activation>
          <activeByDefault>true</activeByDefault>
        </activation>
      </profile>
      <profile>
        <id>test</id>
        <properties>
          <env>test</env>
        </properties>
      </profile>
      <profile>
        <id>product</id>
        <properties>
          <env>product</env>
        </properties>
      </profile>
    </profiles>

                  三、设置资源文件配置

                                项目资源文件的配置放在build中 

<!--对于项目资源文件的配置放在build中-->
        <resources>
          <resource>
            <directory>src/main/resources/${env}</directory>
          </resource>
          <resource>
            <directory>src/main/java</directory>
            <includes>
              <include>**/*.xml</include>
              <include>**/*.properties</include>
              <include>**/*.tld</include>
            </includes>
            <filtering>false</filtering>
          </resource>
        </resources>

                   四、执行打包操作

                                        最简单的打包

                                        指定环境

clean compile package -P指定环境 -Dmaven.test.skip=true

不同的项目打包的文件不一样,一般来说,普通java项目打成jar包,web项目打成war包。


Maven依赖的基本概念

        依赖的基本配置

        根元素project下的dependencies可以包含多个dependence元素,以声明多个依赖。每个依赖都应该包含以下元素:

1.groupld, artifactld, version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。

2.Type:依赖的类型,大部分情况下不需要声明。默认值为jar

3.Scope:依赖范围(compile,test,provided,runtime,system)

  •     compile:编译依赖范围。

        如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。

  •     test:测试依赖范围。

        使用依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。典型的例子就是JUnit,它只有在编译测试代码及运行测试的时候才需要。

  •     provided:已提供依赖范围。

        使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍(如: servlet-api)。

  •     runtime:运行时依赖范围。

        使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。

  •     system:系统依赖范围。

        该依赖与三种classpath的关系,和provided依赖范围完全一致。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。

4.Optional:标记依赖是否可选

5.Exclusions:用来排除传递性依赖。

        依赖范围

        首先需要知道,Maven在编译项目主代码的时候需要使用一套classpath。比如:编译项目代码的时候需要用到spring-core,该文件以依赖的方式被引入到classpath中。其次,Maven在执行测试的时候会使用另外一套classpath。如: junit。


        最后在实际运行项目时,又会使用一套classpath,spring-core需要在该classpath中,而junit不需要。 

        那么依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试classpath,运行时classpath)的关系,Maven有以下几种依赖范围:

Compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译,测试,运行都有效。

Test:测试依赖范围。只在测试的时候需要。比如junit

Provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试有效,但在运行时无效。典型的例子是servlet-API,编译和测试项目的需要,但在运行项目时,由于容器已经提供,就不需要Maven重复地引入一遍。

Runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行有效,但在编译代码时无效。典型的例子是: jdbc驱动程序,项目主代码的编译只需要jdk提供的jdbc接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体jdbc驱动。

System:系统依赖范围。一般不使用。

        传递性依赖

        传递依赖机制,让我们在使用某个jar的时候就不用去考虑它依赖了什么。也不用担心引入多余的依赖。Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前项目中。
        注意:传递依赖有可能产生冲突!!
冲突场景:

A-->B--->C (2.0)
A-->E--->C (1.0)

如果A下同时存在两个不同version的C,冲突! !(选取同时适合A、B的版本)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟火9092

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值