maven学习

简介

  Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具 。   目前,绝大多数开发人员都把 Ant 当作 Java 编程项目的标准构建工具。遗憾的是,Ant 的项目管理工具(作为 make的替代工具)不能满足绝大多数开发人员的需要。通过检查 Ant 构建文件,很难发现项目的相关性信息和其它元信息(如开发人员/拥有者、版本或站点主页)。   Maven 除了以程序构建能力为特色之外,还提供 Ant 所缺少的高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目,而使用 Ant 则需要十几行。事实上,由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目现在使用 Maven,而且公司项目采用 Maven 的比例在持续增长。   Maven这个单词来自于意第绪语,意为知识的积累,最早在Jakata Turbine项目中它开始被用来试图简化构建过程。当时有很多项目,它们的Ant build文件仅有细微的差别,而JAR文件都由CVS来维护。于是Maven创始者开始了Maven这个项目,该项目的清晰定义包括,一种很方便的发布项目信息的方式,以及一种在多个项目中共享JAR的方式。 [1]

 

   用maven的好处:我感觉最主要就是自动下载jar包和它所依赖的包,这样可以保证了多人开发时jar版本不同的问题。再就是文件结构清晰,java文件,资源文件,测试文件都分的很清楚。

特点

  那么,Maven 和 Ant 有什么不同呢?在回答这个问题以前,我要强调一点:Maven 和 Ant 针对构建问题的两个不同方面。Ant 为 Java 技术开发项目提供跨平台构建任务。Maven 本身描述项目的高级方面,它从 Ant 借用了绝大多数构建任务。因此,由于 Maven 和 Ant 代表两个差异很大的工具,所以我将只说明这两个工具的等同组件之间的区别,如表 1 所示。[1]   Maven是一个项目管理工具 ,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期 (Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件 (plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。   Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。   此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。

常用命令

  mvn archetype:create 创建Maven项目

  mvn compile 编译源代码

  mvn test-compile 编译测试源代码

  mvn test 运行应用程序中的单元测试

  mvn site 生成项目相关信息的网站

  mvn clean 清除项目目录中的生成结果

  mvn package 根据项目生成的jar

  mvn install 在本地Respository中安装jar

  mvn eclipse:eclipse 生成eclipse项目文件

  mvn jetty:run 启动jetty服务

  mvn tomcat:run 启动tomcat服务

推荐书籍

  目前中文版对maven介绍比较全的书籍是《Maven实战》

环境配置

  现在Java新架构的不断出现,例如Struts,Spring,Hibernate等,项目的配置文件的增多,给开发人员带来很大麻烦。在实际的开发当中,Myeclipse中的project越来越庞大,所依赖的第三方Jar包越来越多,这显得Project很臃肿,给项目管理带来了很大不便,尤其是在一些大型项目。为了解决上述问题,Apache开源组织发布了Maven[2] ,它适用于大的Java项目。

 

1. Maven有一个重要的文件"settings.xml“,这个文件来源于apache-maven-2.0.8/conf/ 下,要放在windows下, Win7和Winxp还是有点不一样 , Win7 ---C:\Users\用户名\.m2 , Winxp ---C:\Documents and Settings\用户名\.m2 。   

 

2. 设置Maven的环境变量,基本上和设置Jdk环境变量相似,首先设置MAVEN_HOME,再加入Path 。  

 

3. 修改”settings.xml” 文件,在这个文件中找到<localRepository></localRepository>这一行,修改为<localRepository>${MAVEN_HOME}/repo</localRepository>。这一行代表了Maven的本地Jar包仓库的位置,下面放的都是项目所用到的jar包。  

   其中 <servers>

             <server>
             <id>nexus</id>
             <username>admin</username>
             <password>admin</password>
             </server>

          </servers>

    这个是配置私服,也就是远程服务器,当本地服务器不含有该JAR包时系统就自动去找,如果找到就从远程服务器上下载到本地服务器。如果是整个公司开发项目的话,最好配置私服,这样每个项目的使用者都可以从这里下载JAR包,保证了JAR包版本的统一且方便管理。

 <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>central</mirrorOf>
      <url>http://172.17.26.73:9091/nexus/content/groups/public</url>   <!-- 这个是私服的地址-->
    </mirror>
 </mirrors>

 

     如果所需要的JAR包是工程内部自己生成的供使用的,可以把它安装到本地仓库中,

 

mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file(JAR包路径)

 

     如果需要把这些JAR包上传到私服上:

mvn deploy:deploy-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools -Dversion=1.2.1 -Dpackaging=jar -Dfile=/path/to/file -Durl=http://xxx.ss.com/sss.xxx -DrepositoryId=release-repo

也可以去私服相应的管理页面,如在这里相应为:http://172.17.26.73:9091/nexus/index.html

 

   按如下步骤:

 

   
maven学习_第1张图片
 

 

第一步:点Repositories

第二步:点3rd party

第三步:点Artifact Upload,然后GAV Definition中选 GAV Parameters,Group,Artifact,Version可以自己设置名字,一般与JAR包名称相同

第四步:选择JAR包所在位置,其中Classifier可以不填,如果填的话表示相同JAR包名称的不同版本(区别于Version,比如有的JAR包相对应有JDK1.4版本,有的有1.5版本)

第五步:添加JAR包,然后点UploadArtifact就上传成功了。上传成功后点Refresh就可以看到刚上传的JAR包

想看上传的JAR包的POM信息,可以点Browse Storage,然后找到相应的文件夹,右边就可以显示相应的POM信息

 

 

 

4.安装maven插件

Eclipse->help->Install New Software, 弹出安装对话框

点击 Add 按钮,按图示输入,确定


maven学习_第2张图片

 

接下来按提示一直 next 下去,直到安装完毕。

 

5 点Windows-->Preference ,然后找到Maven,再找到Installations,点Add,找到Maven的安装位置,如果已经有则就 不用再添加

 

 

6. 建立Maven的project,File--new—other—Java Maven Project

     1)选择WorkSpace路径,点下一步

     2)Catalog选择Install, filter填webapp,再下面找到 maven-archetype-webapp, 点下一步

     3)填写相应的GroupId,Artifact信息,Artifact一般为项目名称。version可以把后面的SNAPSHOT去掉,点FINISH

 

7 右键点项目,点属性-->  project facets --> 在Project Facet 中的 Dynamic Web Module,Java,JavaScript三个前面打勾,其中Dynamic Web Module 选择 Version 版本为2.5,然后点OK。

 

8 设置部署程序集

   右键点项目,点属性--> Deployment Assembly

 

此处列表是,部署项目时,文件发布的路径。

1,我们删除test的两项,因为test是测试使用,并不需要部署。

2,设置将Maven的jar包发布到lib下。

Add -> Java Build Path Entries -> Maven Dependencies -> Finish

 

9 maven 项目中添加 jar

 

maven 可以管理项目依赖的 jar 包,通过 groupID artifactId 以及版本号可以唯一确定一个 jar 包。这样可以防止老式 Web 项目中 WEB-INF/lib jar 包不一致的问题。并且 maven 还会自动下载添加进的 jar 包所依赖的 jar 包。

 9.1 在pom.xml中添加所需要的jar包

使用Maven POM editor打开项目中的pom.xml文件,选择Dependencies,在Dependencies栏目点击Add进行,首先弹出一个搜索按钮,例如输入spring,就会自动搜索关于spring的jar包,或者点击pom.xml直接编辑pom.xml文件。这样可以直接copy过来 dependencies内容。如下图

 


maven学习_第3张图片

 

 

当添加进入一个 jar 包后,有一些属性需要设置,最重要的就是 scope ,它有以下几种取值:

1.          compile ,缺省值,适用于所有阶段,会随着项目一起发布。

2.          provided ,类似 compile ,期望 JDK 、容器或使用者会提供这个依赖。如 servlet.jar

3.          runtime ,只在运行时使用,如 JDBC 驱动,适用运行和测试阶段。

4.          test ,只在测试时使用,用于编译和运行测试代码。不会随项目发布。

5.          system ,类似 provided ,需要显式提供包含依赖的 jar Maven 不会在  Repository 中查找它。

点OK,就引入该JAR包了,在POM文件中可以看到相应的XML代码。

 

如果jar包或版本没有找到的话,可以去网站http://mvnrepository.com/ 查找。

 

10 POM概述

 

<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>xinhua</groupId>
	<artifactId>QuickRegister</artifactId>
	<packaging>war</packaging>
	<version>0.0.1</version>
	<name>QuickRegister Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  <!-- 为POM设置编码格式 -->
	</properties>
<dependencies>  <!-- 建立依赖 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
</dependencies>

<distributionManagement>  <!-- 设置私服,id 对应 setting 中的私服 id  -->
	   <repository>
	      <id>nexus</id>
	      <name>nexus</name>
	      <url>http://172.17.26.73:9091/nexus/content/groups/public</url>
	   </repository>
	   <snapshotRepository>  <!-- 表示的是快照的地址 -->
            <id>nexus</id>
            <name>nexus</name>
            <url>http://172.17.26.73:9091/nexus/content/groups/public</url>
        </snapshotRepository>
 </distributionManagement>
  
   <build>
    <finalName>QuickRegister</finalName>
     <plugins>  
            <plugin>  
                <groupId>org.apache.maven.plugins</groupId>  
                <artifactId>maven-war-plugin</artifactId>  
                <version>2.1.1</version>  
                <configuration>  
                    <!-- Run As Maven build : clean package 就可以发布到tomcat下了,并按照<warName>命名 -->  
                    <!-- 访问应用时,访问该地址即可:http://IP:Port/warName/ -->  
                    <warName>QuickRegister</warName>  
                    <outputDirectory>E:\tomcat6\apache-tomcat-6.0.35\webapps</outputDirectory>  
                </configuration>  
            </plugin>  

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.4.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>tomcat-maven-plugin</artifactId>
                <version>1.1</version>
                <configuration>
                   <url>http://localhost:8080/manager/html</url>
                   <username>admin</username>
                   <password>admin</password>
                </configuration>
            </plugin>
     
        </plugins>  
    
  </build>
</project>
 

 

 

11. 到现在为止,环境就算搞定了。

      这时候右键点项目,点Run-->As ,会看到多出几个Maven的命令,如果需要的命令没有在里面,可以自己添加。

      点Build...,然后在对话框中的Goals 中输入相应的Maven命令,如clean package

 

12.如果是Dynamic Web project项目转成Maven项目方法参见文章http://woshixushigang.iteye.com/blog/1290575

 

遇到过的问题

1  执行mvn tomcat:run时报错 

java.lang.ClassCastException: org.springframework.web.servlet.DispatcherServlet cannot be cast to javax.servlet.Servlet

 

问题出在servlet-api.jar上,tomcat部署springMVC项目时是不用这个包的,而用maven构建项目时需要,如果不引用该依赖就会不识别  HttpServletRequest等的类

解决方法是在maven引用servlet的依赖时,加上属性范围<scope>provided</scope>

如果还报错误,则在 引用javax.servlet.jsp的依赖时,也加上 属性范围<scope>provided</scope>

附:
依赖范围(scope) 主源码classpath可用 测试源码classpath可用 会被打包
compile 缺省值 TRUE TRUE TRUE
test FALSE TRUE FALSE
runtime FALSE TRUE TRUE
provided TRUE TRUE FALSE


2 install 和 deploy 的区别

  1. install
    负责将项目输出(install:install)或者某个指定的文件(install:install-file)加入到本机库%USERPROFILE%/.m2/repository中。可以用install:help 寻求帮助。
  2. deploy
    负责将项目输出(deploy:deploy)或者某个指定的文件(deploy:deploy-file)加入到公司库中。

目前没有解决的问题是1)deploy报错400  2)项目用eclipse无法debug,希望高手指教。

 

 

 

 

 

你可能感兴趣的:(maven)