资讯专栏INFORMATION COLUMN

使用Maven管理Java项目

yiliang / 1990人阅读

摘要:添加的的依赖,可以从项目的中拷贝使用命令编译项目。在子模块中我们可以这样使用引入父模块坐标三使用建立项目新建一个项目,选择,如图所示在中配置插件可参见官方文档。部署项目到即可。

一、Maven入门 1.下载maven

Maven是基于项目对象模型(Project Object Model),可以通过一小段描述信息来管理项目的构建、报告和文档的项目管理工具,提供了一个仓库的概念,统一管理项目所依赖的第三方jar包,最大可能避免了由于环境变量的不同在不同电脑之间无法运行的问题,Struts2、Hibernate都是采用maven部署的项目。它是Apache软件基金会的一个开源项目,下载地址是:Apache Maven 注意:Maven3.3要求jdk版本为1.7及以上。将压缩包解压到任意目录:可以看到如下的目录结构:

2.配置Maven环境

新建环境变量M2_HOME,其值为maven的解压目录,并在path环境变量中引用M2_HOME下的bin目录:

shellM2_HOME:D:Program Files (x86)apache-maven-3.3.3

Path:...;%M2_HOME%in

接下来在命令行输入mvn -v命令可以查看版本:

3.使用maven创建helloworld项目

首先创建如下的目录结构

src
    |----main
        |----java
            |----package
    |----test
        |----java
            |----package
    |----resources
pom.xml

main/java目录下创建我们的java源代码:

javapackage org.gpf.maventest01.model;

public class HelloWorld {
    public String sayHelloWorld(){
        return  "Hello World!";
    }   
}

test/java目录下创建我们的测试代码(使用了Junit4测试框架):

javapackage org.gpf.maventest01.model;

import org.junit.*;
import static org.junit.Assert.*;

public class HelloWorldTest {

    @Test
    public void testSayHelloWorld(){
        assertEquals("Hello World!",new HelloWorld().sayHelloWorld());
    }
}

接下来编写pom.xml(可以参见Struts2,如图所示)

将其拷贝到项目的根目录,并修改为如下:

xml



    4.0.0  

    
    org.gpf.maventest01
    maventest01  
    0.0.1SNAPSHOT    

    
    
        
            junit
            junit
            4.10
        
    

接下来在命令行进入我们的项目输入mvn compile命令(首次运行会下载第三方插件和maven依赖的jar,请耐心等待),对该项目进行编译。

最后使用mvn test命令运行我们的测试用例:

此时发现项目的根目录下多了一个target目录,其中class目录就是生成的类文件,reports目录就是一系列测试报告。

运行mvn package命令可以打包我们的项目,会生成maventest-0.0.1SNAPSHOT.jar

二、Maven核心知识 1.常用构建命令
  

mvn -v 查看maven版本
compile 编译
test 测试
package 打包
clean 删除target(字节码和测试报告)
install 安葬jar包到本地仓库

如果一个项目需要利用到其他项目的jar包,一种方式是拷贝jar包并拷贝到classpath中,maven提供了一个更简单的策略,直接在本地仓库中查找即可。例如我们一个新的项目maven02项目需要使用到之前的maven01项目的HelloWorld类中的sayHelloWorld方法,使用maven可以这样:

在maven01项目中运行mvn install命令安装jar包到本地仓库。

创建maven02项目,在其中导入maven01项目的类。

src/main

javapackage org.gpf.maventest02.util;

import org.gpf.maventest01.model.HelloWorld;

public class Speak {
    public String sayHi(){
        return  new HelloWorld().sayHelloWorld();
    }   
}

src/test

javapackage org.gpf.maventest02.util;

import org.junit.*;
import static org.junit.Assert.*;

public class SpeakTest {

    @Test
    public void testSayHi(){
        assertEquals("Hello World!",new Speak().sayHi());
    }
}

3.在pom.xml添加依赖。

xml



    4.0.0

    org.gpf.maventest02
    maventest02
    0.0.1SNAPSHOT

    
        
            junit
            junit
            4.10
        
        
        
            org.gpf.maventest01
            maventest01
            0.0.1SNAPSHOT
        
    

使用mvn compile命令编译maven02项目。

2.使用archetype插件自动创建符合maven的目录骨架

方式一:使用mvn archetype:generate根据提示一步步操作;

方式二:使用mvn archetype:generate -D命令一次性生成全部。

3.maven中的坐标和仓库
  

maven中任何一个依赖、插件都可以被称为构件。所有构件通过坐标作为其唯一标识。

  

仓库可以管理项目的依赖。仓库可以分为本地仓库和远程仓库,如果本地仓库中找不到就会在远程仓库中查找并下载,如果远程仓库找不到就会报错。maven远程仓库的地址可以在maven安装目录的lib目录的maven-model-builder-3.3.3.jar中找到,如图所示:

pom.xml打开。

镜像仓库

由于maven的中央仓库位于国外,速度慢,也有可能其他原因无法访问,我们可以使用国内的镜像仓库。配置镜像仓库需要修改conf/settings.xml,打开该文件修改mirror标签如下:

xml 
    
      
      maven.net.cn
      central
      central mirror in china
      http://maven.net.cn/content/groups/public
    
  

maven仓库默认是放在用户目录的.m2隐藏目录下的,Windows系统就是C:Users用户名.m2,我们需要将仓库迁移到其他目录,修改conf/settings.xml,如图所示:

settings.xml复制到E:/tmp/mavenproject/repo,这样更新maven就不需要重新配置settings.xml了。

4.在MyEclipse中使用maven

MyEclipse默认安装了maven插件,极大简化了操作。在使用MyEclipse创建项目之前需要进行如下的配置:

配置maven安装目录(自带的可能有错)

给jre添加一个运行时参数(错误-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.的解决方案)

使用MyEclipse创建Maven项目的步骤(注意选择合适的Junit版本,默认是3.8.1,我们需要该变成4.10)如下:



接下来在MyEclipse中运行maven项目,右键项目名---Run As会出现如下菜单:

在弹出的的对话框的Goals中输入maven命令(compile、test、package等)即可。

5.maven的生命周期和插件

maven有3个独立的阶段。

clean(清理)

pre-clean

clean

post-clean

default(构建、最核心)

compile

test

package

install

site(生成项目站点)

pre-site

site(生成项目的站点文档)

post-site

site-deploy(发布站点到服务器)

Maven是基于插件的,我们可以在http://maven.apache.org/plugins/index.html找到合适的插件,例如源代码打包插件source插件。

编辑pom.xml,配置source插件(可以参见source插件文档)

xml
  ...
  
        
        
          
          org.apache.maven.plugins
          maven-source-plugin
          2.4
          
          
            
                package
                
                    jar-no-fork
                
            
          
        
      
    
    ...

使用clean package命令,运行结果:

6.pom.xml文件解析
xml

  
  4.0.0

    
  org.gpf.maventest 
  maventest-demo
  0.0.1-SNAPSHOT
  jar

    
  maventest-demo
  http://maven.apache.org
  
  
  
  

  
    UTF-8
  

    
  
    
      junit
      junit
      4.10
      
      test
      
      
        
      
    
  

    
  
    
        
    
  

    
  
    
    
      
        org.apache.maven.plugins
        maven-source-plugin
        2.4
        
            
                package
                
                    jar-no-fork
                
            
        
      
    
  

  
  
  
  
    
  

7.依赖范围

maven提供了3种classpath(编译、测试、运行),例如上面的pom.xml的Junit框架的scope属性为test。http://maven.apache.org/guides/introduction/introduction-to-dependency...上提供了6种依赖范围:

compile:缺省值,编译、测试都有效

provided:编译,测试都有效,但是在运行时并不会加入。例如Servlet API,因为Web容器本身有,如果加入就会出现冲突。

runtime:测试、运行有效。

test:仅测试时有效。

system:与本机相关,可移植性差。

import:导入的依赖范围,仅适用在dependencyManager中,表示从其他pom导入dependency配置。

8.依赖传递

创建3个maven项目,grandfather、father、son,其中father依赖grandfather,son又依赖father,他们之间构成依赖。

例如在Father项目的pom.xml中添加对GradFather的依赖,只需要在dependency标签中指定GrandFather的坐标即可,就像下面这样:

xml
    
      junit
      junit
      3.8.1
      test
    
    
         com.maventest
        GrandFather
        0.0.1-SNAPSHOT
    

类似的在Son项目中添加对Father的依赖。现在构建Son需要先构建GrandFather和Father。对GrandFather和Father进行clean install命令,再对Son项目进行compile命令即可。构建完成后3个项目的目录结构如图:

此时发现Son依赖了2个项目GrandFather和Father,如果仅仅希望Son依赖Father可以将GrandFather的坐标进行依赖排除

xml
    
        com.maventest
        Father
        0.0.1-SNAPSHOT
        
            
                com.maventest
                GrandFather
            
        
    

9.依赖冲突

依赖冲突有2条原则:

短路优先(优先解析路径短的版本),例如有以下2个依赖:A-->B-->C-->x.jar,A-->D--x.jar(优先)

路径相同,先声明先优先。

10.聚合与继承

如果我们的项目要使用到以上的GrandFather、Father、Son3个模块,就可以使用聚合。新建一个relationship项目,修改其pom.xml如下:


  4.0.0

  com.maventest
  relationship
  0.0.1-SNAPSHOT

  pom

  relationship
  http://maven.apache.org

  
    UTF-8
  

  
    
      junit
      junit
      3.8.1
      test
    
  


  
    ../GrandFather
    ../Father
    ../Son
  
```

在relationship项目运行`clean install`命令将会依次生成3个jar并加入本地仓库。

在以上的项目中项目中每次都要配置Junit的依赖,我们可以向java编程那样将公共的模块抽取出来,这种方式叫做继承。新建一个maven项目,命名为common,其`pom.xml`配置如下:

```xml

  4.0.0

  com.maventest.common
  common
  0.0.1-SNAPSHOT
  pom

  common
  http://maven.apache.org

  
    UTF-8
    3.8.1
  


    
    
      junit
      junit
      ${junit-version}
      test
    
  



这是项目可能有红色的小叉,由于父模块不需要测试,我们可以删除src/test重新更新maven项目(右键项目-->Maven ForMyEclipse-->Update Project Configuration),发现红色的叉消失。在子模块中我们可以这样使用:

xml
  4.0.0

  com.maventest
  GrandFather
  0.0.2-SNAPSHOT
  jar

  GrandFather
  http://maven.apache.org

  
    UTF-8
  



    com.maventest.common
    common
    0.0.1-SNAPSHOT

  
    
      junit
      junit
    
  

三、使用Maven建立Web项目

新建一个maven项目,ArcheType选择webapp,如图所示:


pom.xml中配置tomcat插件(可参见Tomcat官方文档)。

xml
  4.0.0
  com.maventest.webdemo
  webdemo
  war
  0.0.1-SNAPSHOT
  webdemo Maven Webapp
  http://maven.apache.org
  
    
      junit
      junit
      4.10
      test
    
  

  
    webdemo
    
         
          org.apache.tomcat.maven
          tomcat7-maven-plugin
          2.2
        
    
  

clean-->package-->部署项目到Tomcat即可。

四、常见问题和解决方案 1.jdk版本不符合的问题

Eclipse中的jdk版本显示为1.5,但是编译使用的版本是1.7,可以参考以下的conf/settings.xml的配置:

xml
jdk-1.7
 
true
1.7 


 
1.7 
1.7 
1.7 
 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64421.html

相关文章

  • Maven就是这么简单

    摘要:软件项目的管理就会变得简单很多。比如说的驱动程序,,在是获取不到的,就需要手工上传到里是仓库组,在里没有这个概念,是特有的。 什么是Maven Maven是一个采用纯Java编写的开源项目管理工具, Maven采用了一种被称之为Project Object Model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中.. Maven是一款跨平台的项目...

    leonardofed 评论0 收藏0
  • maven介绍

    摘要:介绍简介编写的用于构建系统的自动化工具。文件的基本配置介绍什么是,项目对象模型。基本设置协作关系组织标识,例如,在目录下,将是目录。 1. Maven介绍 1.1. 简介 java编写的用于构建系统的自动化工具。 目前版本是2.0.9,注意maven2和maven1有很大区别,阅读第三方文档时需要区分版本。 1.2. Maven资源 • 见官方网站; • The 5 minu...

    xorpay 评论0 收藏0
  • Maven 模块化项目管理

    摘要:一什么是是一款软件项目管理和理解工具。基于项目对象模型的概念,通过添加一小段描述来管理项目的构建。另外如果子模块中指定了版本号,那么会使用子模块中指定的版本。 一、什么是Maven? Maven是一款软件项目管理和理解工具。基于项目对象模型(POM)的概念,通过添加一小段描述来管理项目的构建。 二、为什么要使用Maven? 以前在用Java开发一个项目时,往往需要引入几十或者上百个Ja...

    ethernet 评论0 收藏0
  • Maven 项目构建基础

    摘要:项目构建基础从属于笔者的现代开发基础系列文章,介绍了的历史背景与多种构建工具对比,以及的基本配置安装与使用本文涉及的参考资料声明在学习与实践资料索引以及学习与资料索引。 Maven 项目构建基础从属于笔者的现代 Java 开发基础系列文章,介绍了 Maven 的历史背景与多种构建工具对比,以及 Maven 的基本配置安装与使用;本文涉及的参考资料声明在 Java 学习与实践资料索引以及...

    2501207950 评论0 收藏0
  • Maven实战之Quick Start

    摘要:在之前,十个项目可能有十种构建方式,但通过,所有项目的构建命令都是简单一致的。有利于促进项目团队的标准化。手工劳动往往意味着低效,意味着容易出错。这在很大程度上消除了重复。默认情况下,该文件夹下放置了本地仓库。学习实战许晓斌著 Introduction Maven是一个异常强大的构建工具,能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。通过Maven,我们只需要...

    Yi_Zhi_Yu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<