1_Maven

一. 引言

1.1 项目管理问题

  • 项目中jar包资源越来越多, jar包的管理越来越沉重
1.1.1 繁琐
  • 要为每个项目手动导入所需的jar, 需要搜集全部的jar
1.1.2 复杂
  • 项目中的jar如果需要版本升级, 就需要重新搜集jar
1.1.3 冗余

相同的jar在不同的项目中保存了多份

1.2 项目管理方案

  • Java项目需要一个统一的便捷的管理工具: Maven

二. Maven介绍

  • Maven这个单词来自意第绪语(犹太语), 意为知识的积累
  • 是一个基于项目对象模型(POM)的概念的纯Java开发的开源的项目管理工具

  • 主要用来管理java项目, 进行依赖管理

  • jar包依赖管理
  • 项目构建
  • 项目编译, 打包, 测试, 部署
  • 分块开发
  • 提高开发效率

三. Maven安装

3.1 下载

下载链接: https://maven.apache.org/docs/history.html

下载apache-maven-3.5.4-bin.zip (适用于Windows系统), 然后解压

有如下目录

  • bin: 含有mvn运行的脚本
  • boot: 含有plexus-classworlds类加载器框架, Maven使用该框架加载自己的类库
  • conf: 含有setting.xml配置文件
  • lib: 含有maven运行时所需要的java类库

3.2 配置环境变量

  • 系统环境变量下:
  • 新增:
    • 变量名: MAVEN_HOME
    • 值: D:\Program Files\Maven_shine\apache-maven-3.5.4 (自己Maven的解压目录)
  • 点击path
    • 最后方加上;%MAVEN_HOME\bin%
  • 测试
  • 命令行下输入 mvn -v 查看版本信息

四. Maven配置

  • Maven的conf目录下的setting.xml配置

4.1 本地仓库

<localRepository>D:\Program Files\Maven\repositorylocalRepository>

4.2 JDK配置

  • 在标签中 增加一个标签 ,限定Maven项目默认的jdk版本

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

<activeProfiles>
    <activeProfile>jdk-1.8activeProfile>
activeProfiles>

五. 仓库

5.1 概念

  • 存储依赖的地方, 体现形式就是本地的一个目录
  • 仓库中不仅存放依赖, 而且管理着每个依赖的唯一标识(坐标), Java项目凭坐标获取依赖

5.2 仓库分类

  • Maven仓库
  • 本地仓库
  • 远程仓库
    • 中央仓库
    • 公共仓库
    • 私服

当需要依赖时, 会从仓库中查找, 优先顺序为
本地仓库>私服(如果配置了的话)>公共仓库(如果配置了的话)>中央仓库

5.3 本地仓库

  • 即在settings.xml 中配置的目录
  • 使用过了的依赖都会自动存储在本地仓库中, 后续可以复用

5.4 远程仓库

5.4.1 中央仓库
  • Maven的中央仓库是由Maven社区提供的仓库, 不用任何配置, Maven中内置了中央仓库的地址, 其中包含了绝大多数流行的开源Java构件
  • https://mvnrepository.com/ 可以搜索需要的依赖的相关信息(仓库搜索服务)
  • https://repo.maven.apache.org/maven2/ 中央仓库地址
5.4.2 公共仓库[重点]
  • 除中央仓库之外, 还有其他远程仓库, 比如aliyun仓库(https://maven.aliyun.com/nexus/content/groups/public)
  • 中央仓库在国外, 下载依赖速度过慢, 所以都会配置一个国内的公共仓库代替中央仓库
  • 在setting.xml中添加以下配置

<mirror>
    <id>aliyunid>

    <mirrorOf>centralmirrorOf>
    <name>Nexus aliyunname>

    <url>https://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
  • 或者可以配置华为镜像, 配置如下:
<mirror>
    <id>huaweicloudid>

    <mirrorOf>CentralmirrorOf>
    <name>Nexus huaweicloudname>

    <url>https://mirrors.huaweicloud.com/repository/maven/url>
mirror>
5.4.3 私服[了解]
  • 公司范围内共享的仓库, 不对外开放
  • 可以通过Nexus来创建, 管理一个私服

六. IDEA-Maven

6.1 在IDEA中关联Maven

  • 在IDEA中关联本地安装的Maven, 后续就可以通过IDEA使用Maven, 管理项目了
  • settings for new projects–>Build, Execution, Deployment–>Build Tools–>Maven
  • Maven home directory
    • Maven的安装路径
  • User settings file
    • Maven的配置文件settings.xml路径, 在Maven的conf目录下
  • Local repository
    • Maven的本地仓库路径

1_Maven
  • 因为现在阿里云不支持http访问, 支持https, 所以有SSL证书验证的问题
  • [重要]所以还需要在IDEA中添加一个配置
  • 在Maven下的Importing的VM options for importer下导入
  • -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

1_Maven

6.2 创建Maven项目

6.2.1 新建项目
  1. 新建项目, 选择Maven
  2. 确认自己的JDK是否已经选上
  3. 点击Next
6.2.2 项目位置
  • Name: 项目名称
  • Location: 项目保存位置
6.2.3 指定项目名
  • GroupId: 项目标识,通常是公司域, 例: com.baidu
  • ArtifactId: 项目名称
  • Version: 项目版本号, 默认为1.0-SNAPSHOT
6.2.4 项目结构
  • src/main/java 存放源代码, 建包, 放项目中的代码(service, dao, servlet…)
  • src/main/resources 书写配置文件, 项目中的配置文件(jdbc.properties)
  • src/test/java 书写测试代码, 项目中测试案例代码
  • src/test/resources 书写测试案例相关配置文件
  • 根目录/pom.xml(project object model) Maven项目核心文件, 其中定义项目构建方式, 声明依赖等
  • 注意: 项目中的建包, 建类, 执行, 都和普通项目无差异
6.2.5 项目类型
  • 根据项目类型, 在pom.xml中做出对应配置, 添加配置: war或者jar

<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.0modelVersion>

    <groupId>com.dzgroupId>
    <artifactId>MavenProjectartifactId>
    <version>1.0-SNAPSHOTversion>

    <packaging>warpackaging>
project>
6.2.6 设置编译编码格式
<properties>

    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>

6.3 导入依赖jar

  • 创建好项目后, 需要导入需要的jar, 要通过 坐标
  • 每个构件都有自己的坐标, GroupId + ArtifactId + Version = 项目标识 + 项目名 + 版本号
  • 在Maven项目中只需要配置坐标, Maven便会自动加载对应依赖, 删除坐标则会自动移除依赖
6.3.1 查找依赖
6.3.2 导入依赖
  • 在项目的pom.xml文件中, 增加依赖
    <packaging>warpackaging>
    <properties>

        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>

        <dependency>

            <groupId>javax.servletgroupId>
            <artifactId>jstlartifactId>
            <version>1.2version>
        dependency>
    dependencies>
6.3.3 同步依赖
  • 引入坐标后, 同步依赖, 确认导入
  • 在我们引入坐标后, IDEA通常会自动弹出导入依赖的选项, 我们点击即可 或者在IDEA的最右侧边框处有Maven, 在此处刷新

6.4 创建web项目

6.4.1 打包方式
  • pom.xml中设置war
<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.0modelVersion>

    <groupId>com.dzgroupId>
    <artifactId>MavenProjectartifactId>
    <version>1.0-SNAPSHOTversion>

    <packaging>warpackaging>
project>
6.4.2 web依赖
  • 导入servlet 和 JSP 和 JSTL依赖, 使项目具有web编译环境

<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.0modelVersion>

    <groupId>com.dzgroupId>
    <artifactId>MavenProjectartifactId>
    <version>1.0-SNAPSHOTversion>

    <packaging>warpackaging>
    <properties>

        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>

        <dependency>

            <groupId>javax.servletgroupId>
            <artifactId>jstlartifactId>
            <version>1.2version>
        dependency>

        <dependency>

            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>3.1.0version>
            <scope>providedscope>
        dependency>

        <dependency>

            <groupId>javax.servletgroupId>
            <artifactId>jsp-apiartifactId>
            <version>2.0version>
            <scope>providedscope>
        dependency>

    dependencies>
project>
折叠
6.4.3 webapp目录
  • 按照Maven规范, 在main目录下新建web项目的特有目录 webapp
  • webapp目录下新建WEB-INF目录
  • WEB-INF目录下新建web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
web-app>
6.4.4 定义Servlet和JSP
  • main–>java–>com.dz–>servlet下新建TestServlet
package com.dz.servlet;

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;

public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Test Servlet!");
        request.getRequestDispatcher("/index.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
  • webapp目录下新建index.jsp
"text/html;charset=UTF-8" language="java" %>

    Title

    "color: red">Hello World!

6.5 部署web项目

6.5.1 新增Tomcat
  1. 点击Edit Configuration(运行图标的左侧)
  2. 点击+, 找到Tomcat Server下的Local
  3. 点击OK
  4. 在Server下自定义Tomcat名称 Name:
  5. 点击configure, 选择Tomcat的安装目录
  6. 点击OK即可
6.5.2 部署web项目
  1. 还是点击Edit Configuration(运行图标的左侧)
  2. 然后找到Deployment并点击
  3. 在右侧点击+, 选择Artifact, 然后选项目名:war exploded, 这表示我们把此项目成功部署到了Tomcat下
  4. Deployment下的Application context是项目默认访问路径; 可以自定义, 建议和项目同名, 比如: /MavenProject, 或者为了访问简单, 可以直接设置: /
  5. 最后点击OK即可
6.5.3 启动Tomcat
  • 方法一: 点击IDEA上方的运行图标
  • 方法二: 在IDEA最下一行找到Services, 点开后在此处运行Tomcat
  • 最后等待弹出浏览器框: 路径: localhost:8080/MavenProject/, 这个默认是自动跳转到webapp下index.jsp中, 我们在网址后方加上test, 就访问到我们创建的TestServlet了

6.6 依赖生命周期

6.6.1 概念
  • Jar包生效的时间段, 即Jar的生命周期
6.6.2 使用方式
  • 项目中导入的依赖可以做生命周期的管理
<dependencies>
    <dependency>

        <groupId>javax.servletgroupId>
        <artifactId>jstlartifactId>
        <version>1.2version>
    dependency>
    <dependency>

        <groupId>javax.servletgroupId>
        <artifactId>javax.servlet-apiartifactId>
        <version>3.1.0version>

        <scope>providedscope>
    dependency>
    <dependency>

        <groupId>javax.servletgroupId>
        <artifactId>jsp-apiartifactId>
        <version>2.0version>

        <scope>providedscope>
    dependency>
dependencies>
6.6.3 生命周期详解
  • compile
  • 缺省值, 适用于所有阶段(测试运行, 编译, 运行, 打包)
  • provided
  • 类似compile, 期望JDK, 容器或使用者会提供这个依赖, 如servlet-api.jar; 适用于(测试运行, 编译)阶段
  • runtime
  • 只在运行时使用, 如MySQL的驱动jar, 适用于(运行, 测试运行)阶段
  • test
  • 只在测试时使用, 适用于(编译, 测试运行)阶段, 如junit.jar
  • system
  • Maven不会在仓库中查找对应依赖, 而在本地磁盘目录中查找; 适用于(编译, 测试运行, 运行)阶段

七. Maven指令

7.1 命令行

  • 通过IDEA打开命令行, 然后执行Maven命令
  • 也就是在Terminal中执行Maven命令, 例如输入:
  • mvn -v 查看Maven版本号
  • mvn clean 清除上次编译的结果(target)

7.2 Maven面板

  • IDEA中有Maven面板(IDEA最右侧边框上), 其中可以快速执行Maven指令
  • 双击即可快速执行
  • maven常用命令:
  • mvn clean 清空产生的项目( target)
  • mvn compile 编译源代码
  • mvn package 打包, 默认打包jar包, 如果配置了war则打包war包
  • mvn install 在本地repository中安装jar(包含mvn compile,mvn package,然后上传到本地仓库)
  • mvn deploy 上传到私服(包含mvn install,然后,上传到私服)
  • mvn test 运行测试
  • mvn site 产生site
  • mvn test-compile 编译测试代码
  • mvn -Dtest package 只打包不测试
  • mvn jar:jar 只打jar包
  • mvn test -skipping compile -skipping test-compile 只测试而不编译,也不测试编译
  • mvn source.jar 源码打包

八. 私服

8.1 概念

  • 私服是架设在局域网的一种特殊的远程仓库, 目的是代理远程仓库及部署第三方构件
  • 有了私服后, 当Maven需要下载依赖时, 直接请求私服, 私服上存在则下载到本地仓库; 否则, 私服请求外部的远程仓库, 将构件下载到私服, 再提供给本地仓库下载
  • 私服可以解决在企业做开发时每次需要的jar包都要在中心仓库下载, 且每次下载完只能被自己使用, 而不能被其他开发者使用的问题
  • 所谓私服就是一个服务器, 但是不是本地层面的, 是公司层面的, 公司中所有的开发人员都在使用同一个私服

8.2 架构

  • 无私服时
  • 本地仓库–>远程仓库
  • 有私服时
  • 本地仓库–>私服–>远程仓库
  • 我们可以使用专门的Maven仓库管理软件来搭建私服, 比如:Apache Archiva, Artifactory, Sonatype Nexus, 这里我们使用Sonatype Nexus

8.3 Nexus安装[了解]

8.3.1 下载
8.3.2 安装
  • 下载nexus-2.x-bundle.zip, 解压即可

8.4 启动[了解]

  • 解压后在bin目录中执行(或者直接为Nexus配置环境变量, 和Maven同理):(以管理员身份运行cmd)
  • nexus install 在系统中安装nexus 服务
  • nexus uninstall 卸载nexus 服务
  • nexus start 启动服务
  • nexus stop 停止服务

8.5 Nexus 登陆[了解]

8.6 仓库列表[了解]

  • 仓库类型
  • group: 包含多个仓库, 通过group库的地址可以从包含的多个仓库中查找构件
  • hosted: 私服服务器本地的仓库, 其中存储诸多构件
  • proxy: 代理仓库, 其会关联一个远程仓库, 比如中央仓库, aliyun仓库, 向该仓库查找构件时, 如果没有会从其关联的仓库中下载
  • 仓库名
  • Releases: 存放项目的稳定发布版本, 一个模块做完后如果需要共享给他人, 可以上传到私服的该库
  • Snapshots: 对应不稳定的发布版本
  • 3rd party: 存放中央仓库没有的, 如ojdbc.jar, 可以上传到私服的该库中

8.7 Maven中配置私服[重点]

  • 在Maven中配置私服, 使得Maven可以从私服上获取构件
8.7.1 仓库组
  • 而此时就有问题, 私服中有很多仓库, 每个仓库都有自己的url, 那么项目中配置哪个仓库呢?

  • 私服中有一个仓库组, 组中包含多个仓库, 可以指定仓库组的url, 即可以从多个仓库中获取构件

  • 点击仓库central–>Configuration–>Remote Storage Location
  • 把此路径换成华为云的:https://mirrors.huaweicloud.com/repository/maven/ 国内镜像下载速度很快, 也可换成阿里的, 都很快
  • 然后把 Download Remote Indexes设置为True, 这是下载远程索引, 为了以后更好更方便的使用依赖
  • 点击仓库Public Repositories–>Configuration
  • 将3rd party从左侧的Ordered Group Repositories移到右侧的Avaliable Repositories(通过点击右箭头的方式)
  • 左侧的Ordered Group Repositories重新排序, Central排到第一位(鼠标拖拽), 此顺序代表提供依赖的仓库优先级, 现在的Central(已关联华为云)第一优先提供依赖
8.7.2 Maven关联私服
  • 配置setting.xml, 设置私服地址, 认证等信息
  • 复制时不要复制两头的大标签, 例如< servers>< /servers>, 只需把其内容复制到对应大标签下
<servers>

    <server>
        <id>nexus-publicid>
        <username>adminusername>
        <password>admin123password>
    server>
servers>

<mirrors>
    <mirror>

        <id>huaweicloudid>

        <mirrorOf>CentralmirrorOf>
        <name>Nexus huaweicloudname>

        <url>https://mirrors.huaweicloud.com/repository/maven/url>
    mirror>
mirrors>

<profiles>

  <profile>
    <id>nexusid>
    <repositories>
        <repository>

            <id>nexus-publicid>

            <name>Naxus Release Snapshot Repositoryname>

            <url>http://localhost:8081/nexus/content/groups/public/url>
            <releases><enabled>trueenabled>releases>
            <snapshots><enabled>trueenabled>snapshots>
        repository>
    repositories>

    <pluginRepositories>
        <pluginRepository>

            <id>nexus-publicid>

            <url>http://localhost:8081/nexus/content/groups/public/url>
            <releases><enabled>trueenabled>releases>
            <snapshots><enabled>trueenabled>snapshots>
        pluginRepository>
    pluginRepositories>
  <profile>
profiles>

<activeProfiles>
  <activeProfile>nexusactiveProfile>
activeProfiles>
折叠
  • 至此, Maven项目需要依赖时, Maven会从私服中下载

8.8 Maven项目部署到私服

  • 执行: mvn deploy 即可将项目部署到私服对应的仓库中, 此时项目中的打包方式多为jar
  • 但需要提前在项目的 pom.xml中配置 部署私服仓库位置, 如下

<distributionManagement>
    <snapshotRepository>
        <id>nexus-publicid>
        <name>User Project Snapshotname>

        <url>http://localhost:8081/nexus/content/repositories/snapshots/url>
        <uniqueVersion>trueuniqueVersion>
    snapshotRepository>
    <repository>
        <id>nexus-publicid>
        <name>User Project Releasename>

        <url>http://localhost:8081/nexus/content/repositories/releases/url>
    repository>
distributionManagement>
  • 注意: 如上的id依然要和setting.xml中配置的server中的id保持一致, 才能通过私服的验证
  • 项目部署到Snapshots仓库中还是Releases仓库中取决于我们 < version>1.0-SNAPSHOT< /version> 中写的是 SNAPSHOT还是 RELEASE(或者不写,默认就是这个)

Original: https://www.cnblogs.com/qimu666/p/16565702.html
Author: 柒木木木
Title: 1_Maven

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598766/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球