Maven入门

Maven入门

Maven简介

  • 概念模型:Maven[ˈmevən],是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 alt

    • 项目对象模型 ,一个 maven 工程有一个 pom.xml 文件,通过 pom.xml 文件定义项目的坐标、项目依赖、项目信息、 插件目标等。
    • 依赖管理系统,通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理。
    • 一个项目生命周期,使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程,maven 将这些 过程规范为一个生命周期。
    • 一组标准集合, maven 将整个项目管理过程定义一组标准,比如:通过 maven 构建工程有标准的目录结构,有 标准的生命周期阶段、依赖管理有标准的坐标定义等。
    • 插件目标,maven 管理项目生命周期过程都是基于插件完成的。
  • Maven的作用

    • 依赖管理:用maven管理的项目,需要jar包时,只需要在pom.xml中添加对应的jar包坐标即可。
    • 一键构建:项目从编译、测试、运行、打包、安装 ,部署整个过程都交给 maven 进行管理, maven 一个命令完成整个工作。

Maven仓库

本地项目会先到本地仓库查找项目需要jar包,如果有,直接使用,如果没有,会到远程仓库找,找到会下载到本地,没找到,会到中央仓库找,找到后本地仓库和远程仓库都会缓存一份。以便以后使用。当然如果没有远程仓库,则直接到中央仓库查找。

alt

  1. 本地仓库(自己维护)
    • 默认maven本地仓库位置在${user.dir}/.m2/repository,${user.dir}表示 windows 用户目录。形如C:\Users\ASUS.m2。
    • 修改maven的本地仓库位置,可以在maven安装目录/conf/settings.xml的根标签内设置上。
      <localRepository>D:\codetools\maven_repository</localRepository>
      
  2. 远程仓库(又称私服,公司维护)
    • 远程仓库可以在互联网内也可以在局域网内。
  3. 中央仓库(maven团队维护)

项目使用本地仓库的3种方式

  • 在maven安装目录下的有 conf/setting.xml文件,用于maven的所有project项目,它作为maven的全局配置,即使用这台机器的所有用户都是用这个配置。
  • 在${user.dir} /.m2/settings.xml文件,它作为maven的用户配置,即只有当前用户是这个配置。
  • pom.xml文件是所在项目的局部配置。
  • 配置优先级从高到低:pom.xml> User Settings > Global Settings 如果这些文件同时存在且有重复的配置,优先级高的配置会覆盖优先级低的。

Maven约定的目录结构

  • 目录结构说明 alt

    • src/main/java —— 存放项目的.java 文件
    • src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件
    • src/main/webapp —— 存放页面素材文件
    • src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类
    • src/test/resources —— 测试资源文件
    • target —— 项目输出位置,编译后的 class 文件会输出到此目录
    • pom.xml——maven 项目核心配置文件 注意:必须遵守以上的目录结构,即约定大于配置。如果是普通的 java 项目,那么就没有 webapp 目录
  • pom.xml基本配置

    • <project> :文件的根节点 .
    • <modelversion> : pom.xml 使用的对象模型版本
    • <groupId> :项目名称,一般写项目的域名
    • <artifactId> :模块名称,子项目名或模块名称
    • <version> :产品的版本号 .
    • <packaging> :打包类型,一般有 jar、war、pom 等
    • <name> :项目的显示名,常用于 Maven 生成的文档。
    • <description> :项目描述,常用于 Maven 生成的文档
    • <dependencies> :项目依赖构件配置,配置项目依赖构件的坐标
    • <build> :项目构建配置,配置编译、运行插件等

Maven的使用步骤

  1. jdk的安装与环境配置
  2. Maven软件的下载
  3. Maven软件的安装
    • 将Maven解压到一个没有中文,空格的路径下即可
    • Maven解压后的目录如下 alt
  4. Maven环境配置
    • 右击此电脑->属性->高级系统设置->高级选项卡->环境变量
    • 系统变量中,新建变量名:MAVEN_HOME,变量值:maven安装的路径(bin 目录之前一级目录)
    • 系统变量Path中,新加一行%MAVEN_HOME%\bin alt
  5. Maven软件版本测试
    • 在cmd输入mvn -v,成功看到maven版本及Java版本即安装成功。 alt

Maven的常用命令

执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录打开cmd输入命令:

后面的命令包含前面的命令的相关操作

  • mvn clean:删除target目录及内容,因为每个人的电脑开发环境不一定相同

  • mvn compile:将 src/main/java 下的文件编译为 class 文件输出到 target目录下

  • mvn test:将 src/test/java 下的文件编译为 class 文件输出到 target目录下

  • mvn package:对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war包。

  • mvn install:maven 打成 jar 包或 war 包发布到本地仓库。

alt

Maven生命周期

maven 对项目构建过程分为三套 相互独立的生命周期

生命周期的每一步都有底层的周期去执行

alt

Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。 Site Lifecycle 生成项目报告,站点,发布站点。

  • Clean Lifecycle
  • 执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段
生命周期阶段 描述
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作
  • Default Lifecycle
  • Maven 的主要生命周期,被用于构建应用,包括下面的 23 个阶段
生命周期阶段 描述
validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
initialize(初始化) 初始化构建状态,比如设置属性值。
generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。
process-sources(处理源代码) 处理源代码,比如说,过滤任意值。
generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件。
process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。
compile(编译) 编译项目的源代码。
process-classes(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。
generate-test-sources(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。
process-test-sources(处理测试源代码) 处理测试源代码,比如说,过滤任意值。
generate-test-resources(生成测试资源文件) 为测试创建资源文件。
process-test-resources(处理测试资源文件) 复制和处理测试资源到目标目录。
test-compile(编译测试源码) 编译测试源代码到测试目标目录.
process-test-classes(处理测试类文件) 处理测试源码编译生成的文件。
test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。
prepare-package(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。
package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
integration-test(集成测试) 处理和部署项目到可以运行集成测试环境中。
post-integration-test(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。
install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。
  • Site Lifecycle
  • Maven Site 插件一般用来创建新的报告文档、部署站点等。
生命周期阶段 描述
pre-site 生成项目站点之前需要完成的工作
site 生成项目站点文档
post-site 生成项目站点之后需要完成的工作
site-deploy 将项目站点发布到服务器

IDEA创建Maven项目

IDEA集成Maven插件

alt alt

使用模板创建maven的java项目

alt alt alt alt alt

不使用模板创建maven的java项目

alt

其他步骤与使用模板创建maven的java项目一致。

alt

因为不用模板创建maven的Java项目更接近标准目录结构,所以maven的Java项目一般建议不用模板。

使用模板创建maven的web项目

新建web项目

alt

其他步骤与使用模板创建maven的java项目一致。

alt

创建servlet并引入jar包坐标

在src/mian目录下创建java目录,使其出现Create New Servlet选项,可对该web项目指定web资源包

maven的web项目之指定资源包并允许创建servlet

在src/main/java目录下创建一个servlet,并接下来访问它

package com.simplek9.servlet;

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

public class Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        request.getRequestDispatcher("/hello.jsp").forward(request,response);
    }
}

在src/mian/webapp/WEB-INF/web.xml的根标签内配置servlet

<servlet>
  <servlet-name>Servlet</servlet-name><!--Create New Servlet预先创建好的-->
  <servlet-class>com.simplek9.servlet.Servlet</servlet-class>
</servlet>
<servlet-mapping><!--手动配置-->
  <servlet-name>Servlet</servlet-name>
  <url-pattern>servlet</url-pattern>
</servlet-mapping>

在pom.xml的根标签内导入jar包的坐标

  <!--放置项目运行所依赖的jar包-->
  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId><!--项目名称,定义为组织名+项目名,类似包名-->
      <artifactId>servlet-api</artifactId><!-- 模块名称 -->
      <version>2.5</version><!-- 当前项目版本号,snapshot 为快照版本即非正式版本,release 为正式发布版本 -->
      <scope>provided</scope><!--编译时起作用,项目运行时不起作用-->
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope><!--编译时起作用,项目运行时不起作用-->
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId><!--测试类所需jar包-->
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

解决jar包冲突

  • 问题:因为如上代码引入了jservlet-api,jsp-api,但是tomcat安装目录的lib文件夹下也存在一样的jar包,所以会产生冲突。

  • 解决办法:在pom.xml中引入jar包坐标时指定依赖范围

依赖范围 对于编译classpath有效 对于测试classpath有效 对于运行classpath有效 例子
compile Y Y Y spring-core
provided Y Y Junit
runtime Y Y servlet-api
test Y JDBC驱动
system Y Y 本地的,Maven仓库之外的类库
  • compile:默认依赖范围,会用在编译、测试、运行。
  • provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用。如servlet-api,jsp-api被 tomcat 容器提供。
  • system:system 范围依赖与 provided 类似,但是必须显式的提供一个对于本地系统中 JAR文件的路径,需要指定 systemPath 磁盘路径,system依赖不推荐使用。

IDEA运行maven指令

Maven中的Tomcat是6.0,这个版本的不支持jdk1.8的,所以根据 tomcat与jdk的配对关系 配置相应tomcat

添加 tomcat7 插件需要在pom.xml的中添加以下代码

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
</plugin>

alt

全部评论

相关推荐

头像
04-29 10:53
已编辑
东北大学 自动化类
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务