Maven入门与学习

来源:互联网 发布:imo是什么软件 编辑:程序博客网 时间:2024/06/06 16:32

以前做Java Web项目时,项目组长要求学习Maven,后来还是不了了之。此次看到这篇文章,觉得讲的很清楚,适合学习,故转载之。

本文转载于:http://blog.csdn.net/u013132051/article/details/52438086


Maven可以帮我们解决什么场景问题

  • 都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行?

  • 为什么在我的机器上可以正常打包,而配置管理员却打不出来?

  • 项目组加入了新的人员,我要给他说明编译环境如何设置,但是让我挠头的是,有些细节我也记不清楚了

  • 我的项目依赖一些jar包,我应该把他们放哪里?放源码库里?

  • 这是我开发的第二个项目,还是需要上面的那些jar包,再把它们复制到我当前项目的svn库里吧

  • 现在是第三次,再复制一次吧 —– 这样真的好吗?

  • 我写了一个数据库相关的通用类,并且推荐给了其他项目组,现在已经有五个项目组在使用它了,今天我发现了一个bug,并修正了它,我会把jar包通过邮件发给其他项目组,这不是一个好的分发机制,太多的环节可能导致出现bug

  • 项目进入测试阶段,每天都要向测试服务器部署一版。每次都手动部署,太麻烦了

Maven的概念

maven翻译为“专家”,“内行”。

Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具

Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理。

Maven的功能:

  • 项目构建

  • 依赖管理

什么是构建

这里写图片描述

为什么使用Maven

  • Eclipse
    手工操作较多,编译、测试、部署等工作都是独立的,很难一步完成
    每个人的IDE配置都不同,很容易出现本地代码换个地方编译就出错

  • Ant
    没有一个约定的目录结构
    必须明确让ant做什么,什么时候做,然后编译,打包
    没有生命周期,必须定义目标及其实现的任务序列
    没有集成依赖管理

  • Maven
    拥有约定,知道你的代码在哪里,放到哪里去
    拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情

Maven的模型

这里写图片描述

Maven的安装及配置

下载Maven

官方网站:http://maven.apache.org

本课程使用的maven的版本为3.0.5

Maven的安装

  1. 安装jdk,要求1.6或以上版本

  2. 解压maven的压缩包。解压目录最好不要有中文。
    这里写图片描述

  3. 配置系统环境变量,MAVEN_HOME

  4. 设置环境变量Path,将%MAVEN_HOME%\bin加入Path中,一定要注意要用分号;与其他值隔开

  5. 验证安装是否成功,打开cmd窗口,敲入mvn -v 查看
    这里写图片描述

Maven安装目录分析

  • bin:含有mvn运行的脚本

  • boot:含有plexus-classworlds类加载器框架。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更丰富的语法以方便配置,Maven使用该框架加载自己的类库。对于一般的Maven用户来说,不必关心该文件。

  • conf:含有settings.xml配置文件,此配置为maven的全局配置。

  • lib:含有Maven运行时所需要的java类库

Maven的配置

Maven的默认配置

在MAVEN_HOME下的配置文件:MAVEN_HOME/conf/settings.xml 是maven全局的配置。如果不对其修改的话,默认本地仓库的路径就是:当前用户路径C:\Users[UserName].m2

这里写图片描述

localRepository:用户仓库,用于检索依赖包路径

用户配置

配置方法:

  1. 在你想保存仓库的位置创建一个目录作为仓库目录。例如在d:盘创建一个MavenRepository目录

  2. 在其中创建一个名为“repository”的目录。

  3. 修改MAVEN_HOME\conf\settings.xml

    这里写图片描述

  4. 从MAVEN_HOME\conf中把settings.xml复制到MavenRepository目录。得到如下结构:
    这里写图片描述

  5. !注意:
    用户级别的仓库在全局配置中一旦设置,全局配置将不再生效,转用用户所设置的仓库,否则使用默认路径仓库

创建Maven工程

遵从Maven约定

src/main/java —— 存放项目的.java文件
src/main/resources —— 存放项目资源文件,如spring, hibernate配置文件
src/test/java —— 存放所有测试.java文件,如JUnit测试类
src/test/resources —— 测试资源文件
target —— 项目输出位置
pom.xml——maven项目核心配置文件

Project
|-src
| |-main
| | |-java —— 存放项目的.java文件
| | |-resources —— 存放项目资源文件,如spring, hibernate配置文件
| |-test
| |-java ——存放所有测试.java文件,如JUnit测试类
| |-resources —— 测试资源文件
|-target —— 目标文件输出位置例如.class、.jar、.war文件
|-pom.xml ——maven项目核心配置文件

创建maven工程

首先建立MavenHelloWorld项目同时建立Maven约定的目录结构

MavenHelloWorld
|-src
| |-main
| | |-java —— 存放项目的.java文件
| | |-resources —— (暂时省略)
| |-test
| |-java ——存放所有测试.java文件,如JUnit测试类
| |-resources —— (暂时省略)
|-target —— (不手工创建)
|-pom.xml ——maven项目核心配置文件

创建HelloWorld.java

在src/main/java/cn/change/maven目录下新建文件Hello.java

package cn.change.maven;public class HelloWorld {    public String sayHello(String name){        return "Hello World :" + name + "!";    }}

新建测试文件HelloTest.java

在/src/test/java/cn/change/maven目录下新建测试文件HelloTest.java

package cn.change.maven;import org.junit.Test;import static junit.framework.Assert.*;public class HelloWorldTest{    @Test    public void testHello(){        HelloWorld hello = new HelloWorld();        String results = hello.sayHello("maven");        assertEquals("Hello World :maven!",results);    }}

创建pom.xml

在项目MavenHelloWorld根目录建立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">  <modelVersion>4.0.0</modelVersion>  <groupId>com.bshinfo.el</groupId>  <artifactId>ccb_el_manager</artifactId>  <version>0.0.1-SNAPSHOT</version>  <name>ccb_el_manager Maven Webapp</name>  <url>http://maven.apache.org</url>  <packaging>war</packaging>  <build>    <finalName>ccb_el_manager</finalName>  </build>  <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.11</version>            <scope>test</scope>        </dependency>        <!-- spring jar -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context-support</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-tx</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-aop</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-beans</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jdbc</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework.security</groupId>            <artifactId>spring-security-core</artifactId>            <version>4.0.4.RELEASE</version>        </dependency>        <dependency>             <groupId>org.springframework.security</groupId>            <artifactId>spring-security-web</artifactId>            <version>4.0.4.RELEASE</version>        </dependency>        <dependency>             <groupId>org.springframework.security</groupId>            <artifactId>spring-security-config</artifactId>            <version>4.0.4.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework.security</groupId>            <artifactId>spring-security-cas</artifactId>            <version>4.0.4.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jms</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <!-- spring mvc jar -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-web</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>4.2.5.RELEASE</version>        </dependency>        <!-- mybatis jar -->        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis</artifactId>            <version>3.3.1</version>        </dependency>         <!-- mybatis-paginator jar -->        <dependency>            <groupId>com.github.miemiedev</groupId>            <artifactId>mybatis-paginator</artifactId>            <version>1.2.10</version>        </dependency>        <!-- mybatis-spring jar -->        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis-spring</artifactId>            <version>1.2.4</version>        </dependency>        <!-- mysql-connector-java jar -->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.38</version>        </dependency>        <!-- 数据库连接池 jar -->        <dependency>            <groupId>commons-dbcp</groupId>            <artifactId>commons-dbcp</artifactId>            <version>1.4</version>        </dependency>        <dependency>            <groupId>commons-pool</groupId>            <artifactId>commons-pool</artifactId>            <version>1.6</version>        </dependency>        <!-- log jar -->        <dependency>            <groupId>log4j</groupId>            <artifactId>log4j</artifactId>            <version>1.2.17</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>            <version>1.7.19</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>            <version>1.7.19</version>        </dependency>        <!-- jsp Template jar -->        <dependency>            <groupId>org.freemarker</groupId>            <artifactId>freemarker</artifactId>            <version>2.3.23</version>        </dependency>        <!-- apache servlet api jar -->        <dependency>            <groupId>org.apache.tomcat</groupId>            <artifactId>tomcat-servlet-api</artifactId>            <version>8.0.32</version>        </dependency>        <dependency>            <groupId>org.aspectj</groupId>            <artifactId>aspectjweaver</artifactId>            <version>1.8.9</version>        </dependency>        <dependency>            <groupId>org.aspectj</groupId>            <artifactId>aspectjrt</artifactId>            <version>1.8.9</version>        </dependency>        <dependency>            <groupId>org.aspectj</groupId>            <artifactId>aspectjtools</artifactId>            <version>1.8.9</version>        </dependency>        <!-- activemq -->        <dependency>              <groupId>org.apache.activemq</groupId>              <artifactId>activemq-core</artifactId>              <version>5.7.0</version>        </dependency>        <dependency>            <groupId>org.apache.activemq</groupId>            <artifactId>activemq-pool</artifactId>            <version>5.13.2</version>        </dependency>        <!-- cas security -->        <dependency>            <groupId>org.jasig.cas.client</groupId>            <artifactId>cas-client-core</artifactId>            <version>3.4.1</version>        </dependency>        <!-- end of cas security -->        <dependency>            <groupId>net.sf.json-lib</groupId>            <artifactId>json-lib</artifactId>            <version>2.4</version>            <classifier>jdk15</classifier>        </dependency>        <dependency>            <groupId>commons-codec</groupId>            <artifactId>commons-codec</artifactId>            <version>1.10</version>        </dependency>        <dependency>            <groupId>org.codehaus.jackson</groupId>            <artifactId>jackson-mapper-asl</artifactId>            <version>1.5.0</version>        </dependency>        <dependency>            <groupId>commons-fileupload</groupId>            <artifactId>commons-fileupload</artifactId>            <version>1.2.2</version>        </dependency>        <dependency>            <groupId>org.apache.commons</groupId>            <artifactId>commons-io</artifactId>            <version>1.3.2</version>        </dependency>    </dependencies></project>

测试maven命令

打开cmd命令行,进入Hello项目根目录(包含有pom.xml文件的目录)

mvn compile命令

执行 mvn compile命令
执行完毕后,生成了maven工程编译完成后字节码文件的生成目录target

mvn clean命令

cmd 中继续录入mvn clean命令
执行完毕后,字节码生成目录被删除

mvn test命令

cmd 中录入 mvn test命令
执行完毕后,字节码生成目录中生成了被测试类与测试类的编译字节码和测试执行过程日志与详细报告

mvn clean compile命令

cmd 中录入 mvn clean compile命令
组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类

mvn clean test命令

cmd 中录入 mvn clean test命令
组合指令,先执行clean,再执行test,通常应用于测试环节

mvn clean package命令

cmd 中录入 mvn clean package命令
组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前

执行过程:

清理————清空环境
编译————编译源码
测试————测试源码
打包————将编译的非测试类打包

mvn clean install命令

cmd 中录入 mvn clean install 查看仓库,当前项目被发布到仓库中
组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前

执行过程:

清理————清空环境
编译————编译源码
测试————测试源码
打包————将编译的非测试类打包
部署————将打好的包发布到资源仓库中

这里写图片描述

错误范例

说明:MAVEN 命令输入错误,命令名称显示在[ERROR] Unknown lifecycle phase “compoile”
引号中的内容为输入错误的名称
[ERROR] Unknown lifecycle phase “compoile”. You must specify a valid lifecycle p
hase or a goal in the format : or :

1 0