Maven-入门案例

来源:互联网 发布:淘宝网拍 编辑:程序博客网 时间:2024/06/18 07:18

maven项目工程目录约定

使用maven创建的工程称为maven工程,maven工程具有一定的目录规范

  • src/main/java:存放项目的.java文件
  • src/main/resources:存放项目资源文件,如spring,hibernate配置文件
  • src/main/webapp:webapp目录是web工程的主目录
  • src/main/webapp/WEB-INF
  • src/main/webapp/WEB-INF/web.xml
  • src/test/java:存放所有测试.java文件,如JUnit测试类
  • src/test/resources:测试资源文件
  • target:项目输出位置,存放一些.class文件
  • pom.xml:maven项目核心配置文件

例子

建立如下目录结构

  • example
    • src
      • main
        • java
        • resources
      • test
        • java
        • resources
    • target
    • pom.xml

在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/xsd/maven-4.0.0.xsd">  <!-- 模型版本号:4.0.0 -->  <modelVersion>4.0.0</modelVersion>  <!-- 群组ID:单位域名反写 -->  <groupId>cn.eaglezsx.maven</groupId>  <!-- 项目ID:一个单位只有一个域名,但是一个单位可以做多个项目 -->  <artifactId>HelloWorld</artifactId>  <!-- 当前项目版本号:每个工程发布后可以发布多个版本,依赖时调取不同的版本,使用不同的版本号 -->  <version>0.0.1</version>  <!-- 名称:可省略 -->  <name>Hello</name>  <!-- 依赖管理 -->    <dependencies>        <!-- 依赖设置 -->        <dependency>            <!-- 依赖组织名称 -->            <groupId>junit</groupId>            <!-- 依赖项目名称 -->            <artifactId>junit</artifactId>            <!-- 依赖版本名称 -->            <version>4.9</version>            <!-- 依赖范围:test包下依赖该设置 -->            <scope>test</scope>        </dependency>           </dependencies></project>

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

package cn.eaglezsx;public class Hello {    public String sayHello(String name){        return "Hello " + name + "!";    }}

在src/test/java/cn/eaglezsx中建立一个测试程序,HelloTest.java

package cn.eaglezsx;import org.junit.Test;import junit.framework.*;public class HelloTest {    @Test    public void testHello(){        Hello hello = new Hello();        String results = hello.sayHello("maven");        //断言测试        Assert.assertEquals("Hello maven!",results);//第一个值是预计的值,第二个值是真实返回的值         }}

然后打开cmd,进入到example文件中,输入mvn compile,进行编译。期间会下载很多东西(这个命令相关的插件(插件其实也是jar包,一段程序)和一些jar包)

最后的显示信息中有BUILD SUCCESS就说明编译成功了

[INFO] Changes detected - recompiling the module![WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent![INFO] Compiling 1 source file to E:\example\target\classes[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 17.245 s[INFO] Finished at: 2017-04-18T20:40:00+08:00[INFO] Final Memory: 11M/29M[INFO] ------------------------------------------------------------------------

之后可以在E:\example\target\classes\cn\eaglezsx文件目录中看到编译后的结果Hello.class。

之后输入mvn clean会把target文件删除掉

再输入mvn compile,target又会生成出来。其实这个文件不需要手动创建的,会自动生成的。

也可以直接输入 mvn clean compile,这样就会在清除之后就编译。

之后输入mvn test,开始也会下载一堆东西,最后显示

Running cn.eaglezsx.HelloTestTests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.06 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 2.476 s[INFO] Finished at: 2017-04-18T20:56:28+08:00[INFO] Final Memory: 7M/21M[INFO] ------------------------------------------------------------------------

里边写着测试结果,这个测试结果显示说,没有问题。

如果我把HelloTest.java中的”Hello maven!”字符改成”Hello maven1!”的话,再次测试的时候,测试结果就为

Running cn.eaglezsx.HelloTestTests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.063 sec <<< FAILURE!testHello(cn.eaglezsx.HelloTest)  Time elapsed: 0.011 sec  <<< FAILURE!junit.framework.ComparisonFailure: expected:<Hello maven[1]!> but was:<Hello maven[]!>

测试报告中显示测试失败(Failures),并给出了失败的地方<Hello maven[1]!> but was:<Hello maven[]!>预期目标比实际目标多了一个1。两者不相同

Errors就是程序出现了错误,比如我在HelloTest.java中填了一句int i=1/0;测试结果就为

Running cn.eaglezsx.HelloTestTests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.059 sec <<< FAILURE!testHello(cn.eaglezsx.HelloTest)  Time elapsed: 0.009 sec  <<< ERROR!java.lang.ArithmeticException: / by zero

有一处错误(Errors),是java.lang.ArithmeticException: / by zero(除零异常)

Skipped,跳过,就是说这个东西没有执行。

E:\example\target\surefire-reports中有相关的测试报告。

之后输入mvn package,打包。输入这条命令之后,会先测试一下,测试成功后才会打包。

打包之后在target中多了一个HelloWorld-0.0.1.jar.

之后输入mvn install,发布。发布之后,就可以在D:\Java\maven\repository\cn\eaglezsx\maven\HelloWorld\0.0.1中看到HelloWorld-0.0.1.jar这个文件了。发布之后大家就都可以用了。

总结一下构建的过程

清理(mvn clean),编译(mvn compile),测试(mvn test),报告,打包(mvn package), 部署(mvn install)

这么开发太累了。我们可以把maven集成到eclipse。

将maven集成到Eclipse

使用eclipse mars 2版本,此版本自带maven插件不用单独安装。

指定maven的安装目录,eclipse mars 2中已经内容了maven3.3.3版本,项目为了统一maven的版本不会使用eclipse内置的maven版本。

Window–》Preferences–》Maven–》Installations–》Add 然后找到maven的安装目录。

Window–》Preferences–》Maven–》User Settings 设置User Settings,找到本地仓库中settings.xml文件的位置。

如果修改了setting.xml文件需要点击Update Settings按钮对本地仓库重建索引,点击Reindex。

maven配置完成需要测试在eclipse中是否可以浏览maven的本地仓库,如果可以正常浏览maven本地仓库则说明ecplise集成maven已经完成。

找到Maven Repositories这个视图,找到Local respository,右键,Rebuild index重建索引,重建索引完成点击前边的“+”图标即可查看本地仓库的内容。

在Eclipse中构建maven工程

创建maven工程

File–>New–>Project…–>Maven Project点击下一步,

在Create a simple project(skip archetype selection)前边打上对勾

如果不跳过骨架,创建的maven工程目录不全,这里跳过骨架。当我们不跳过骨架点击“next”会进入骨架选择页面,如果eclipse中配置本地仓库正确则显示出骨架。选择webapp会创建一个maven工程(java web工程),选择quickstart会创建一个maven工程(java工程)。注意:使用骨架的问题是创建的maven工程目录不完整,所以不推荐使用,所以这里创建maven工程统一跳过骨架。

定义坐标

Group Id:cn.eaglezsx.maven

Artifact Id:maven-web-0120

Packaging:war(这里选择war,对web工程将要打成war包)

建立好项目之后,会报红叉,这时候需要手动添加一个WEB-INF/web.xml,添加web.xml,在src/main/webapp中添加WEB-INF/web.xml文件

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list></web-app>

设置编译版本,这里需要使用maven的插件来设置,在pom.xml中加入(插件写在build标签的plugins标签里边)

  <build>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-compiler-plugin</artifactId>            <configuration>                <source>1.7</source>                <target>1.7</target>                <encoding>UTF-8</encoding>            </configuration>        </plugin>    </plugins>  </build>

设置完编译版本之后,会报红叉,因为系统不知道,需要通知他一下,项目右击–>Maven–>Update Project Configuration,红叉即消失,并且会发现JRE System Library变成1.7。

添加servlet/jsp的jar包,在pom.xml中添加(依赖添加在dependencies标签里边)

  <!-- 添加servlet-api,jsp-api -->  <dependencies>    <dependency>        <groupId>javax.servlet</groupId>        <artifactId>servlet-api</artifactId>        <version>2.5</version>        <scope>provided</scope>    </dependency>    <dependency>        <groupId>javax.servlet</groupId>        <artifactId>jsp-api</artifactId>        <version>2.0</version>        <scope>provided</scope>    </dependency>  </dependencies>

编写servlet,在src/main/java中创建ServletTest.java,包名为cn.eaglezsx.maven.servlet

public class ServletTest extends HttpServlet{    @Override    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        resp.getWriter().write("Hello World");    }    @Override    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req,resp);    }}

在web.xml中配置servlet

  <!-- 配置servlet -->  <servlet>    <servlet-name>servletTest</servlet-name>    <servlet-class>cn.eaglezsx.maven.servlet.ServletTest</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>servletTest</servlet-name>    <url-pattern>/test</url-pattern>  </servlet-mapping>

项目右键,Run As,Maven build…,在Goals中输入tomcat:run,点击Run

maven内置tomcat的插件(org.codehaus.mojo.tomcat-maven-plugin),执行tomcat:run命令即可启动tomcat。

当控制台显示出“信息: Starting Coyote HTTP/1.1 on http-8080”代表项目启动成功。

之后在浏览器中访问http://localhost:8080/w/test

会在浏览器中显示Hello World

以后再启动的时候直接在菜单栏中的Run As按钮中选择项目名启动即可,没必要再在Maven build…里边再配一个tomcat:run了。

想看配置过的一些东西,可以在Run,Run Configurations..里边看到。

Run as采用mvn命令运行,Debug as采用mvnDebug命令调试方式运行(可打断点)

  • Maven clean :清理target目录
  • Maven test:执行单元测试
  • Maven install:将工程打包后发布到本地仓库
  • Maven build:将项目启动(就相当于在菜单栏中的Run As按钮中选择项目名启动)
  • Maven build…:手动输入命令内容(在Goals里边输入,不用输入mvn)