zoukankan      html  css  js  c++  java
  • Maven日常使用

    一、Maven简介

    Maven是属于apache软件基金会下一个开源免费的项目,是跨平台的项目管理工具, Maven采用了一种被称之为Project Object Model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理,可以在代码进行部署的过程中自动解决项目中代码的依赖环境,需要从maven的镜像仓库中进行下载依赖环境,通常下载比较慢,企业中会在公司内部搭建nexus(私服),将构建项目中的依赖环境保存到nexus服务器中,提高访问速度。

    POM项目对象模型,是Maven工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。
    执行任务或目标时,Maven会在当前目录中查找POM。读取POM,获取所需的配置信息,然后执行目标。

    POM中可以指定以下配置:项目依赖、插件、执行目标、项目构建profile、项目版本、项目开发列表、相关邮件列表信息。

    1.1 Maven的功能

    • mavne模型的Java项目对源代码、单元测试代码、资源、jar包等有规范和目录规划;
    • 解决项目间的依赖关系、版本不一致、版本冲突问题;
    • 合理的jar管理机制;

    1.2 Maven使用场景

    • 原来项目中的jar包必须手动复制、粘贴到WEB-INF/lib项目下,而借助maven,可以将jar包仅仅保存在仓库中,有需要使用的工程只需要引用这个文件,并不需要重复复制到工程中;
    • 原来的项目中所需要的jar包都是提前下载好的,而maven在联网状态下会自动下载所需要的jar包。首先在本地仓库中找,找不到就在网上进行下载;
    • 原来的项目中一个jar包所依赖的其他jar包必须手动导进来,而maven会自动将被依赖的jar包导进来;
    • 原来的项目一个项目就是一个工程,而借助maven可以将一个项目拆分成多个工程;

    项目构建过程包括:【清理项目】→【编译项目】→【测试项目】→【生成测试报告】→【打包项目】→【部署项目】这几个步骤,这六个步骤就是一个项目的完整构建过程。

    1.3 Maven仓库类型

    在Maven的专业术语中,仓库是指一个位置,Maven仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven仓库能帮助我们管理构件(主要是Jar),它就是放置所有JAR文件(WAR、ZIP、POM等等)的地方。

    Maven仓库有三种类型:

    • 本地
    • 中央
    • 远程
    1、本地仓库

    Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 ~/.m2/respository/ 的仓库目录。

    2、中央仓库

    Maven中央仓库是由Maven社区提供的仓库,其中包含了大量常用的库。maven内置了远程公用仓库:http://repo1.maven.org/maven2 。中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。

    3、第三方仓库

    第三方仓库又称为内部中心仓库,也称为私服。私服:一般是由公司自己设立的,只为公司内部共享使用。它既可以作为公司内部构件协作和存档,也可以作为公用类库镜像缓存,减少在外部访问和下载的频率(使用了私服就减少了对中央仓库的访问)。如需了解更多,可以移步这篇文档:Maven教程

    二、Maven简单使用

    安装Maven需依赖java环境,所以应实现部署jdk环境!

    2.1 安装部署jdk环境

    下载Linux环境下的jdk1.8,请去(官网)中下载jdk的安装文件;

    $ mkdir /usr/local/java/
    $ tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/java/
    $ vim /etc/profile
    export JAVA_HOME=/usr/local/java/jdk1.8.0_171
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    $ source /etc/profile
    $ java -version
    java version "1.8.0_171"
    Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
    

    2.2 maven安装

    Maven下载地址

    $ wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
    $ tar zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/
    $ ln -sf /usr/local/apache-maven-3.6.3/ /usr/local/maven
    $ vim /etc/profile
    export MAVEN_HOME=/usr/local/maven
    export PATH=$PATH:$MAVEN_HOME/bin
    $ source /etc/profile
    $ mvn -v
    Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
    Maven home: /usr/local/maven
    Java version: 1.8.0_171, vendor: Oracle Corporation, runtime: /usr/local/java/jdk1.8.0_171/jre
    Default locale: zh_CN, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
    

    2.3 更换maven使用的仓库地址

    由于使用maven官网的地址。下载较慢,所以直接更改为阿里云提供的maven仓库地址!

    $ vim /usr/local/maven/conf/settings.xml
    .......
     49   <!-- localRepository    # 本地仓库配置
     50    | The path to the local repository maven will use to store artifacts.
     51    |
     52    | Default: ${user.home}/.m2/repository
     53   <localRepository>/path/to/local/repo</localRepository>   # 可更换本地仓库目录位置
     54   -->
    .......
    159     <mirror>
    160       <id>aliyun</id>
    161       <mirrorOf>central</mirrorOf>
    162             <name>aliyun maven</name>
    163       <url>https://maven.aliyun.com/nexus/content/groups/public/</url>
    164     </mirror>
    165   </mirrors>    # 必须写在这个标签里面,这个大标签默认是存在的
    # mirror就是镜像,主要提供一个方便地切换远程仓库地址的途径
    # <mirrorOf>central</mirrorOf>里是要替代的仓库的id。代理原有仓库,如果填写*表示替换所有仓库  
    

    2.4 构建项目测试

    $ mkdir /tmp/test && cd /tmp/test
    $ mvn archetype:generate -DgroupId=com.lzj.maven.quickstart -DartifactIdk=test_app -DarchetypeArtifactId=maven-archetype-quickstart
    # 输入执行命令时指定的项目名称,接下来的直接按回车保持默认即可
                         ...........................#省略部分内容
    [INFO] Using property: groupId = com.lzj.maven.quickstart
    Define value for property 'artifactId': test_app # 需手动指定项目名称,可自定义,接下来保持默认即可! 
    Define value for property 'version' 1.0-SNAPSHOT: : 
    [INFO] Using property: package = com.lzj.maven.quickstart
    Confirm properties configuration:
    groupId: com.lzj.maven.quickstart
    artifactId: test_app
    version: 1.0-SNAPSHOT
    package: com.lzj.maven.quickstart
     Y: : y
    [INFO] ----------------------------------------------------------------------------
    [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
    [INFO] ----------------------------------------------------------------------------
    [INFO] Parameter: basedir, Value: /tmp/test
    [INFO] Parameter: package, Value: com.lzj.maven.quickstart
    [INFO] Parameter: groupId, Value: com.lzj.maven.quickstart
    [INFO] Parameter: artifactId, Value: test_app
    [INFO] Parameter: packageName, Value: com.lzj.maven.quickstart
    [INFO] Parameter: version, Value: 1.0-SNAPSHOT
    [INFO] project created from Old (1.x) Archetype in dir: /tmp/test/test_app
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  02:41 min
    [INFO] Finished at: 2021-03-10T10:44:40+08:00
    [INFO] ------------------------------------------------------------------------
    # 最后出现 BUILD SUCCESS 即表示成功!
    

    上述命令解释如下:

    • archetype:generate:创建一个简单的java项目;
    • archetype 也就是原型,是一个 Maven 插件,准确说是一个项目模板,它的任务是根据模板创建一个项目结构。使用 quickstart 原型插件创建一个简单的 java 应用程序
    • -DgroupId:组织名,公司网址的反写(反向域名)+项目名称;
    • -DartifactIdk:项目名或者模块名;
    • -DarchetypeArtifactId:指定 ArchetypeId,maven-archetype-quickstart,创建一个简单的 Java 应用;
    • -DinteractiveMode: 是否使用交互模式。

    2.5 生成的POM文件参数解释

    $ ls test_app/
    pom.xml  src
    $ cat test_app/pom.xml 
    
    <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/maven-v4_0_0.xsd">
      <!-- 根,这是对Project添加一些根元素的约束信息 -->
      <modelVersion>4.0.0</modelVersion>
      <!-- 指定当前maven模型的版本号 -->
      <groupId>com.lzj.maven.quickstart</groupId>
      <!-- 应该是公司名或者组织名。一般来说groupID有三个部分组成,每个部分之间以“.”分隔,第一部分是项目的用途,比如用于商业的就是com,用于非商业盈利性组织的就是org,第二部分是公司名,比如tentxun/baidu/alibaba,第三部分是你的项目名 -->
      <artifactId>test_app</artifactId>
      <!-- 可以认为是maven构建的项目名,比如你的项目中有子项目,就可以使用“项目名-子项目的命名方式 -->
      <packaging>jar</packaging>
      <!-- 指定生成的格式(jar/war/rar/pom/ear) -->
      <version>1.0-SNAPSHOT</version>
      <!-- SNAPSHOT意味快照,说明该项目还在开发中,是不稳定的版本 -->
      <name>test_app</name>
      <!-- 项目的名称, Maven产生的文档用 -->
      <url>http://maven.apache.org</url>
      <!-- 项目主页的url,Maven产生的文档用 -->
      <dependencies>
      <!-- 指定开发构建(jar包) -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <!-- JUnit是一个Java语言的单元测试框架 -->
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    </project>
    

    用户的家目录下也会生成一些依赖,用作本地仓库!

    $ ls ~/.m2/repository/
    antlr  asm  classworlds  commons-codec  commons-collections  commons-io  commons-lang  junit  net  org
    

    2.6 maven配置文件

    Maven 的配置文件名称为:setting.xml。它被存放在两个地方:

    • /usr/local/maven/conf/settings.xml #安装的目录;
    • ~/.m2/settings.xml #用户的家目录;

    其中,安装目录配置又是全局配置,用户目录配置被称为用户配置。如果两者都存在,他们的内容将被合并,并且用户范围的settings.xml优先。默认用户目录不存在配置文件,可以copy maven安装目录下的settings.xml到用户目录。

    关于settings.xml文件常用的的配置修改如下:

    • 修改本地仓库存储路径,默认值是~/.m2/repository 可在settings.xml中的localRepository修改成自己需要的目录;
    • 如果构建服务器因为网络故障或者安全问题不能与远程仓库相连,需要离线模式下,设置offline属性,设置为true,默认为false;
    • 修改中央仓库服务器,修改配置文件中便签,添加或修改镜像地址;
    • 设置代理地址,修改配置文件中proxy标签,定义代理服务器,实现maven的代理。

    由于中央仓库服务器是国外的,在国内使用的话,下载比较慢,所以建议国内用户使用阿里云仓库地址。

    2.7 maven常用命令

    $ cd /tmp/test/test_app/    # 进入刚才构建的项目目录下
    $ mvn compile # 编译(在编译的过程中,可以看到使用的是阿里云的仓库)
    [INFO] BUILD SUCCESS      # 只要在输出信息的最后几行中看到该行,则表示执行成功
    # 以后所有命令都一样,只要最后几行有上述信息,就表示执行成功
    $ ls    # 会看到目录下会生成新的目录target
    pom.xml  src  target
    # target:打包输出目录,如打包好的jar或war文件;
    # target/classes:编译输出目录;
    $ mvn test          # 测试命令
    $ ls target/test-classes/
    com
    # target/test-classes:测试编译输出目录
    $ mvn clean    # 清理命令(就是将编译和测试生成的目录删除)
    $ ls      # target目录已经不在了
    pom.xml  src
    $ mvn package  # 打包
    $ ls target/*.jar   # 会生成一个jar包
    target/test_app-1.0-SNAPSHOT.jar
    $ mvn install   # 安装命令(作用是将压缩文件jar包或者war包上传到本地仓库) 
    $ find ~/.m2/repository/ -name test_app-1.0-SNAPSHOT.jar
    /root/.m2/repository/com/lzj/maven/quickstart/test_app/1.0-SNAPSHOT/test_app-1.0-SNAPSHOT.jar
    # 确认上传的包
    $ mvn deploy      # 发布(将包上传到私服,现在我这里还没有私服,所以会失败)
    

    2.8 mvn命令的生命周期

    maven基于构建生命周期这个中心概念,这意味着构建和分布特定项目的过程被明确定义,具体如下:
    大致的生命周期图:

    cd97216227dc13657093e3e4500d8215

    详细的生命周期图:

    87f36b2635432b28fc7103a1fcf195ed

    三、maven实战

    3.1 编译生成war包

    $ mvn archetype:generate -DgroupId=cn.test.testweb -DartifactId=test_web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
    $ ls
    test_app  test_web
    $ cd test_web/
    $ mvn package
    $ ls target/*.war
    target/test_web.war
    

    3.2 安装tomcat

    $ wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz
    $ tar zxf apache-tomcat-9.0.43.tar.gz -C /usr/local/
    $ ln -sf /usr/local/apache-tomcat-9.0.43/ /usr/local/tomcat
    $ cp /tmp/test/test_web/target/test_web.war /usr/local/tomcat/webapps/
    $ /usr/local/tomcat/bin/startup.sh
    

    3.3 访问测试

    客户端访问移动到Tomcat网页根目录下的war包,地址:http://TomcatIP:8080/test_web 如图:

    2021-03-10_123731

    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    今日SGU 5.27
    今日SGU 5.26
    今日SGU 5.25
    软件工程总结作业
    个人作业——软件产品案例分析
    个人技术博客(α)
    结对作业二
    软工实践 二
    软工实践 一
    《面向对象程序设计》六 GUI
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/14510888.html
Copyright © 2011-2022 走看看