本文将详述 maven 在软件项目中的使用。首先讲述 maven 的基本工作原理及环境的搭建。然后讲述开发及配置管理人员如何使用 maven,最后将介绍 maven 与 eclipse 集成使用。

maven 原理

maven 是人为制订的一套开发规范,该规范定义了开发一个 java 项目时的各个细节。maven 通过 pom.xml 这一配置文件来描述一个项目。以下将介绍 pom.xml 文件及 maven 的主要概念。

pom.xml

POM (Project Object Model) 是对一个项目定义的模型。通过该配置文件可以完整地定义一个项目所涉及的如:项目放在哪里,项目依赖哪些东西,项目的作者是谁,项目如何构建等信息。maven 将通过该文件定义的信息对项目进行构建。

以下是 POM 文件的概要(详细内容参考:http://maven.apache.org/pom.html):

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <!-- 项目基本设置 -->
  8. <groupId>...</groupId> <!-- 项目所在组、机构 -->
  9. <artifactId>...</artifactId> <!-- 项目产品名称 -->
  10. <version>...</version> <!-- 项目产品版本 -->
  11. <packaging>...</packaging> <!-- 项目包类型 -->
  12. <dependencies>...</dependencies> <!-- 项目依赖包 -->
  13. <parent>...</parent> <!-- 项目所继承的父项目 -->
  14. <dependencyManagement>...</dependencyManagement> <!-- 继承父系的依赖 -->
  15. <modules>...</modules> <!-- 所包含的子模块 -->
  16. <properties>...</properties> <!-- 定义变量 -->
  17.  
  18. <!-- 项目构建设置 -->
  19. <build>...</build>
  20.  
  21. <!-- 项目报告生成设置 -->
  22. <reporting>...</reporting>
  23.  
  24. <!-- 项目更多设置 -->
  25. <name>...</name> <!-- 项目名称 -->
  26. <description>...</description> <!-- 项目描述 -->
  27. <url>...</url> <!-- 项目网站 -->
  28. <inceptionYear>...</inceptionYear> <!-- 项目起始年份 -->
  29. <licenses>...</licenses> <!-- 项目许可 -->
  30. <organization>...</organization> <!-- 项目组织 -->
  31. <developers>...</developers> <!-- 项目开发人员 -->
  32. <contributors>...</contributors> <!-- 项目贡献者 -->
  33.  
  34. <!-- 环境设置 -->
  35. <issueManagement>...</issueManagement> <!-- 问题管理 -->
  36. <ciManagement>...</ciManagement>
  37. <mailingLists>...</mailingLists>
  38. <scm>...</scm> <!-- 代码管理 -->
  39. <prerequisites>...</prerequisites>
  40. <repositories>...</repositories> <!-- 指定依赖包所在的仓库 -->
  41. <pluginRepositories>...</pluginRepositories> <!-- 指定插件所在的仓库 -->
  42. <distributionManagement>...</distributionManagement> <!-- 指定发布位置 -->
  43. <profiles>...</profiles> <!-- 针对不同的环境使用不同的配置,如开发与生产环境的数据库是不同的 -->
  44. </project>

从概要可以看到 maven 可以做代码管理,代码测试报告,项目网站,项目依赖关系等管理。

maven 运作

  1. sample
  2. | pom.xml 项目定义文件
  3. \---src 项目源文件
  4. +---main 项目主文件
  5. \---test 项目测试文件

一个 maven 项目的目录结构如上所示,maven 通过项目定义文件(pom.xml)来对项目的源文件进行操作。源文件包含两部分,一部分是最终能够提供功能的主要文件(main),另一部分是用于测试主要功能的辅助文件(test)。

maven 程序的整个操作就是根据项目定义文件中的定义对源文件进行操作。maven 在 components.xml 文件中定义了一个项目的三种生命周期。每种生命周期有不同的阶段((详细参考 http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference))。

maven 的每个生命周期定义了不同的阶段,每个阶段都可以设置该阶段所使用的插件及插件中的任务。以下通过 maven 命令来举例说明:

  1. # 将项目设置到默认生命周期的 deploy 阶段
  2. # 这将使源码已经被编译、测试、安装及发布
  3. mvn deploy
  4.  
  5. # 直接通过 maven 运行 clean 插件的 clean 任务
  6. mvn clean:clean
  7.  
  8. # 先将项目设置到清理生命周期(clean)
  9. # 然后将项目设置到默认生命周期的编译阶段(compile)
  10. # 最后运行 jetty 插件的 run 任务
  11. mvn clean compile jetty:run

通过下面的配置(取自 components.xml )可以了解到一个生命周期是如何定义的,并且生命周期的每个阶段会执行哪些 plugin 的任务。

  1. <component>
  2. <role>org.apache.maven.lifecycle.Lifecycle</role>
  3. <implementation>org.apache.maven.lifecycle.Lifecycle</implementation>
  4. <role-hint>site</role-hint>
  5. <configuration>
  6. <id>site</id>
  7. <phases><!-- site 生命周期包括哪些阶段 -->
  8. <phase>pre-site</phase>
  9. <phase>site</phase>
  10. <phase>post-site</phase>
  11. <phase>site-deploy</phase>
  12. </phases>
  13. <default-phases>
  14. <site><!-- site 阶段使用 site-plugin 的 site 任务 -->
  15. org.apache.maven.plugins:maven-site-plugin:2.0.1:site
  16. </site>
  17. <site-deploy>
  18. org.apache.maven.plugins:maven-site-plugin:2.0.1:deploy
  19. </site-deploy>
  20. </default-phases>
  21. </configuration>
  22. </component>

maven 网络结构

maven 会将所有的公共 jar 包放置于公共的中心仓库(Center Repository)中。为了提高速度,各个网站会复制一份中心仓库的内容并且与中心仓库保持同步。这些复制的仓库称为镜像(Mirror)。在本地的电脑上,会有一个本地仓库,maven 根据项目的依赖关系从中心仓库或者镜像中下载所需要的 jar 包到本地仓库中,供不同的项目使用。

maven 环境搭建

maven 搭建

maven 安装

  1. 通过 http://maven.apache.org/download.html 下载 apache-maven-3.0.3-bin.zip
  2. 本地解压,设置 JAVA_HOME 及 PATH 保证 mvn 命令能够运行

maven 测试

新建一个测试目录,在命令行中进入该目录,运行:

  1. mvn archetype:generate

此时,会看到 maven 下载了很多东西到机器上来,最终会显示一个列表,并提示输入

  1. Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 163:

这是要用户选择创建什么类型的项目,maven 会根据选择将项目的基本框架搭建好。由于是为了测试 maven 这里可以直接选择默认的项目(直接按回车),接下来会提示输入

  1. Choose version:
  2. 1: 1.0-alpha-1
  3. 2: 1.0-alpha-2
  4. 3: 1.0-alpha-3
  5. 4: 1.0-alpha-4
  6. 5: 1.0
  7. 6: 1.1
  8. Choose a number: 6:

这是让用户选择版本,同样选择默认的版本(回车),接下来提示

  1. Define value for property 'groupId': :

这是让用户输入所在的组织,可以输入如 com.mycompany 或者 org.mygroup 等,这里输入本站的网址:

  1. Define value for property 'groupId': : com.lsi2

之后提示输入产出物的名称,后面类似:

  1. Define value for property 'artifactId': : sample
  2. Define value for property 'version': 1.0-SNAPSHOT: :
  3. Define value for property 'package': : : com.lsi2.sample
  4. Confirm properties configuration:
  5. groupId: com.lsi2
  6. artifactId: sample
  7. version: 1.0-SNAPSHOT
  8. package: com.lsi2.ssa
  9. Y: : y

以上步取可以通过一条命令搞定:

  1. mvn archetype:generate -DgroupId=com.lsi2.sample -DartifactId=sample -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

这样项目就创建完成,可以运行以下命令来测试项目

  1. cd sample
  2. mvn test

看到以下内容,说明 maven 安装成功

  1. -------------------------------------------------------
  2. T E S T S
  3. -------------------------------------------------------
  4. Running com.lsi2.sample.AppTest
  5. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.044 sec
  6.  
  7. Results :
  8.  
  9. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
  10.  
  11. [INFO] ------------------------------------------------------------------------
  12. [INFO] BUILD SUCCESS
  13. [INFO] ------------------------------------------------------------------------
  14. [INFO] Total time: 8.778s
  15. [INFO] Finished at: Sat Dec 31 01:59:43 CST 2011
  16. [INFO] Final Memory: 8M/20M
  17. [INFO] ------------------------------------------------------------------------

maven 配置

maven 配置包括以下三个层面:

  • Global (MAVEN_HOME/conf/settings.xml) 针对所有用户的配置
  • User (USER_HOME/.m2/settings.xml) 针对单个用户的配置
  • Project (PROJECT_ROOT/pom.xml) 针对单个项目的配置

对于单个项目的配置前文已有介绍(pom.xml)。现介绍 settings.xml((详细内容可以参考 http://maven.apache.org/settings.html))。

  1. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
  4. http://maven.apache.org/xsd/settings-1.0.0.xsd">
  5. <localRepository/> <!-- 指定本地仓库位置 -->
  6. <interactiveMode/> <!-- 指定 maven 的运行模式是否为交互模式 -->
  7. <usePluginRegistry/> <!-- 目前少用,指定插件配置文件 -->
  8. <offline/> <!-- 指定是否为离线模式,在不需要网络交互的时候使用 -->
  9. <pluginGroups/> <!-- 指定插件所在的路径,maven 将通过该路径查找插件 -->
  10. <servers/> <!-- 指定服务器的用户名、密码等,用于上传,下载文件等 -->
  11. <mirrors/> <!-- 指定 maven 主仓库的镜像 -->
  12. <proxies/> <!-- 网络代理配置,用于有代理的网络 -->
  13. <profiles/> <!-- pom.xml 中的 profile 能够用于公共配置的部分 -->
  14. <activeProfiles/>
  15. </settings>

nexus 搭建

默认情况下,maven 通过客户端机器直接与中心仓库进行网络通信,会存在以下两个主要的问题:

  1. 网络下载速度慢,团队使用 maven 时,带宽占用大。
  2. 直接进行网络通信,会暴露内部的一些信息,安全性降低。

为此,可以通过搭建一个代理服务器来解决以上问题。搭建代理服务器后的网络结构为:

搭建代理服务器之后,可以将开发成品(jar包)容上传到代理服务器上,并使用代理服务器来管理所有的团队共用 jar 包。

目前有两种流行的代理服务器:http://www.jfrog.com/products.php|artifactoryhttp://nexus.sonatype.org/|nexus。以下介绍 nexus 的安装配置。

nexus 安装

  1. http://nexus.sonatype.org/download-nexus.html 下载 nexus 到本地
  2. 解压 nexus
  3. 设置好 JAVA_HOME 及 PATH
  4. 运行 nexus\nexus-oss-webapp-1.9.2.3\bin\jsw\windows-x86-32((win32目录,其它环境的目录类同))\nexus.bat

nexus 测试

安装完成之后,可以访问以下网址:

  1. http://localhost:8081/nexus/

初始的用户名及密码:

  1. admin/admin123 用于管理系统
  2. deployment/deployment123 用于发布jar

基于 nexus 的 maven 配置

settings.xml

  1. <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  4. ...
  5. <servers>
  6. <server> <!-- 设置发布 jar 包时的用户名及密码 -->
  7. <id>deploymentRepo</id>
  8. <username>deployment</username>
  9. <password>deployment123</password>
  10. </server>
  11. </servers>
  12. ...
  13. <mirrors>
  14. <mirror> <!-- 设置 maven 的远程仓库为 nexus -->
  15. <id>nexus</id>
  16. <mirrorOf>*</mirrorOf>
  17. <name>Local Repository</name>
  18. <url>http://192.168.1.60:8081/nexus/content/groups/public</url>
  19. </mirror>
  20. </mirrors>
  21. ...
  22. <profiles>
  23. ...
  24. <profile> <!-- 设置 nexus 的路径等 -->
  25. <id>nexus</id>
  26. <repositories>
  27. <repository>
  28. <id>central</id>
  29. <name>local private nexus</name>
  30. <url>http://localhost:8081/nexus/content/groups/public</url>
  31. <releases><enabled>true</enabled></releases>
  32. <snapshots><enabled>true</enabled></snapshots>
  33. </repository>
  34. </repositories>
  35. <pluginRepositories>
  36. <pluginRepository>
  37. <id>central</id>
  38. <name>local private nexus</name>
  39. <url>http://localhost:8081/nexus/content/groups/public</url>
  40. <releases><enabled>true</enabled></releases>
  41. <snapshots><enabled>true</enabled></snapshots>
  42. </pluginRepository>
  43. </pluginRepositories>
  44. </profile>
  45. ...
  46. </profiles>
  47. ...
  48. <activeProfiles> <!-- 激活 nexus -->
  49. <activeProfile>nexus</activeProfile>
  50. </activeProfiles>
  51. ...
  52. </settings>

pom.xml

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. ...
  4. <distributionManagement> <!-- 设置发布 jar 包时所用到的 server 及路径 -->
  5. <repository>
  6. <id>deploymentRepo</id> <!-- 与 settings.xml 中的 server id 对应 -->
  7. <name>Uploadable Nexus Repo</name>
  8. <url>http://192.168.1.60:8081/nexus/content/repositories/snapshots/</url>
  9. </repository>
  10. </distributionManagement>
  11. ...
  12. </project>

maven 使用

以上介绍完 maven 的基本原理及相关配置,接下来举例说明 maven 的使用。

设置编译环境

在 pom.xml 中设置如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. ...
  4. <build>
  5. <plugins>
  6. <plugin>
  7. <groupId>org.apache.maven.plugins</groupId>
  8. <artifactId>maven-compiler-plugin</artifactId>
  9. <version>2.3.2</version>
  10. <configuration>
  11. <source>1.5</source>
  12. <target>1.5</target>
  13. <encoding>UTF-8</encoding>
  14. </configuration>
  15. </plugin>
  16. </plugins>
  17. </build>
  18. ...
  19. </project>

使用 eclipse

运行

  1. mvn eclipse:eclipse

如果需要在 eclipse 中能够查看到依赖包的源码,可以配置 eclipse 插件如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. ...
  4. <build>
  5. <plugins>
  6. <plugin>
  7. <groupId>org.apache.maven.plugins</groupId>
  8. <artifactId>maven-eclipse-plugin</artifactId>
  9. <version>2.8</version>
  10. <configuration>
  11. <downloadSources>true</downloadSources>
  12. <downloadJavadocs>true</downloadJavadocs>
  13. </configuration>
  14. </plugin>
  15. </plugins>
  16. </build>
  17. ...
  18. </project>

使用 jetty 插件

jetty 可以进行热部署,在开发时可以不用频繁启动服务,从而提高开发效率。使用 jetty 的配置如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. ...
  4. <build>
  5. <plugins>
  6. <plugin>
  7. <plugin>
  8. <groupId>org.mortbay.jetty</groupId>
  9. <artifactId>maven-jetty-plugin</artifactId>
  10. <version>6.1.10</version>
  11. <configuration>
  12. <scanIntervalSeconds>10</scanIntervalSeconds>
  13. <stopKey>foo</stopKey>
  14. <stopPort>9999</stopPort>
  15. <webDefaultXml>src/test/resources/webdefault.xml</webDefaultXml>
  16. </configuration>
  17. <executions>
  18. <execution>
  19. <id>start-jetty</id>
  20. <phase>pre-integration-test</phase>
  21. <goals>
  22. <goal>run</goal>
  23. </goals>
  24. <configuration>
  25. <scanIntervalSeconds>0</scanIntervalSeconds>
  26. <daemon>true</daemon>
  27. </configuration>
  28. </execution>
  29. <execution>
  30. <id>stop-jetty</id>
  31. <phase>post-integration-test</phase>
  32. <goals>
  33. <goal>stop</goal>
  34. </goals>
  35. </execution>
  36. </executions>
  37. </plugin>
  38. </plugins>
  39. </build>
  40. ...
  41. </project>

同时,还需要修改 jetty 的配置文件 webdefault.xml

  1. <web-app
  2. xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. metadata-complete="true"
  6. version="2.5">
  7. ...
  8. <servlet>
  9. <servlet-name>default</servlet-name>
  10. <servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class>
  11. ...
  12. <init-param>
  13. <param-name>useFileMappedBuffer</param-name>
  14. <param-value>false</param-value> <!-- 不缓存文件,文件修改之后马上使用新文件 -->
  15. </init-param>
  16. ...
  17. </servlet>
  18. ...
  19. </web-app>

该文件可以从 jetty 插件中找到,修改后可以放置于以下目录中,在测试时使用。

  1. src/test/resources

清除所有编译的内容

运行下列命令,可以清除所有已经编译的产出。

  1. mvn clean:clean

项目开发之使用 maven的更多相关文章

  1. SpringMVC+Hibernate 项目开发之一(Maven环境搭建)

    Maven环境搭建网上一大堆文章,直接引用leiOOlei同学的了:http://www.cnblogs.com/leiOOlei/p/3359561.html Maven版本:apache-mave ...

  2. 第一章 企业项目开发--maven+springmvc+spring+mybatis+velocity整合

    说明:本系列文章主要是对自己在一家大型互联网公司实习的过程中对所学知识的总结!参与的是实际中使用的上线项目. 代码的github地址:https://github.com/zhaojigang/ssm ...

  3. Hadoop项目开发环境搭建(Eclipse\MyEclipse + Maven)

    写在前面的话 可详细参考,一定得去看 HBase 开发环境搭建(Eclipse\MyEclipse + Maven) Zookeeper项目开发环境搭建(Eclipse\MyEclipse + Mav ...

  4. Hive项目开发环境搭建(Eclipse\MyEclipse + Maven)

    写在前面的话 可详细参考,一定得去看 HBase 开发环境搭建(Eclipse\MyEclipse + Maven) Zookeeper项目开发环境搭建(Eclipse\MyEclipse + Mav ...

  5. 利用maven开发springMVC项目——开发环境搭建(版本错误解决)

    申明:部分内容参见别人的博客,没有任何的商业用途,只是作为自己学习使用.(大佬博客) 一.相关环境 - eclipse :eclipse-jee-oxygen-3-win32-x86_64(下载地址) ...

  6. 微信开发准备(一)--Maven仓库管理新建WEB项目

    转自:http://www.cuiyongzhi.com/post/13.html 在我们的项目开发中经常会遇到项目周期很长,项目依赖jar包特别多的情况,所以我们经常会在项目中引入Maven插件,建 ...

  7. 转】[1.0.2] 详解基于maven管理-scala开发的spark项目开发环境的搭建与测试

    场景 好的,假设项目数据调研与需求分析已接近尾声,马上进入Coding阶段了,辣么在Coding之前需要干马呢?是的,“统一开发工具.开发环境的搭建与本地测试.测试环境的搭建与测试” - 本文详细记录 ...

  8. IDEA 学习笔记之 Maven项目开发

    Maven项目开发: 配置Maven: 新建Maven项目: 选择webapp: 和eclipse一样,设置: 修改maven配置,添加一个新属性,可以加快项目创建速度: 完成: 新建java和tes ...

  9. 《Maven在Java项目开发中的应用》论文笔记(十七)

    标题:Maven在Java项目开发中的应用 一.基本信息 时间:2019 来源:山西农业大学 关键词:Maven:Java Web:仓库:开发人员:极限编程; 二.研究内容 1.Maven 基本原理概 ...

随机推荐

  1. ReferenceQueue<T>随笔

    参考资料: ReferenceQueue食用手册 java引用食用手册 ReferenceQueue源代码里面很好的展示了java队列的实现思路, 以及多线程观察者的实现思路 多线程观察者实现思路: ...

  2. 结合阿里云服务器,设置家中jetson tk1随时远程登陆

    前提条件: 1.路由配置dmz主机为tk1的ip ,设置路由器中ssh 端口22的访问权限 2.有一台远程服务器,服务器安装了php可以运行php文件(我使用的是阿里云) 家中tk1配置: 脚本pyt ...

  3. QQ邮箱发送邮件,出现mail from address must be same as authorization user错误

    之前做的一个系统,有个发送邮件的功能,一直能正常使用,今天同事说QQ邮箱发送不了. 立马着手调试,发现服务器一直出现“mail from address must be same as authori ...

  4. 深入研究C语言 第一篇

    一. 研究过程 1.第一章:创建编译环境: 我们首先下载TC2.0,找到其中与编译连接相关的程序和文件: (1) 编译器:TCC.exe (2) 连接器:tllike.exe (3) 相关文件:c0s ...

  5. CAD二次开发

    用C#有一段时间了,由于单位需要,开始接触CAD二次开发,网上一搜,加入CAD开发的群,零零碎碎看了一些文章和博客,没有系统地的知识,能解决一些小问题.最近开始系统学习,再次推荐两本书,一本事纸质版的 ...

  6. mysql +ibatis

    1.返回插入ID a.xml <insert id="insert" parameterClass="klcQuestion"> insert in ...

  7. zabbix server配置文件

    这样的错误日志,并且在web端也没有画出图来. 解决方法: ①编辑zabbix服务器端的配置文件/etc/zabbix/zabbix_server.conf找到"Timeout"把 ...

  8. Openlayers+Geoserver(一):项目介绍以及地图加载

           项目验收完,趁着事情不是很多,对这个项目进行梳理.我主要负责地图模块,网站其他模块主要有两个,一个是报表,主要是100多张报表,技术没有难度,主要是工作量的问题.另一个是数据的校验,就是 ...

  9. Spring绑定表单数据

    Spring提供了一些jsp页面常用的form标签,很大程度上提高了我们开发的速度,不用再一个个的标签去绑定属性,而且后台接收数据也很简单,可以直接接收object对象作为属性.官方form标签介绍的 ...

  10. JMeter HTTP Cookie管理器的跨域使用

    Jmeter的一个测试计划只能有一个cookie管理器,当多个manager同时存在时,无法指定是用的哪一个manager.如果想让cookie manager跨域使用,修改JMeter.proper ...