欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java的项目构建工具Maven的配置和使用教程

程序员文章站 2024-03-11 14:20:37
一、maven是什么 maven是一个用java开发的项目构建工具, 它能使项目构建过程中的编译、测试、发布、文档自动化, 大大减轻了程序员部署负担。 二、安装mave...

一、maven是什么

maven是一个用java开发的项目构建工具, 它能使项目构建过程中的编译、测试、发布、文档自动化, 大大减轻了程序员部署负担。

二、安装maven

安装maven非常简单,访问maven官方页下载即可:http://maven.apache.org/download.cgi
下载完后配置m2_home环境变量, 然后终端运行mvn --version, 看到正确的输出提示,maven就安装完成了。

三、maven基本概念
maven的核心思想是pom, 即project object model(项目对象模型)。pom文件是以xml文件的形式描述一个maven项目所用到的资源(源码、依赖、测试等)。下图描述了pom文件的结构, 以及maven是如何调用pom文件的。

Java的项目构建工具Maven的配置和使用教程

当执行一条maven命令时, 会传入一个pom文件, maven会在该pom里面的描述的资源上执行

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/xsd/maven-4.0.0.xsd">
 <modelversion>4.0.0</modelversion>
 <!-- the basics -->
 <groupid>...</groupid>
 <artifactid>...</artifactid>
 <version>...</version>
 <packaging>...</packaging>
 <dependencies>...</dependencies>
 <parent>...</parent>
 <dependencymanagement>...</dependencymanagement>
 <modules>...</modules>
 <properties>...</properties>
 <!-- build settings -->
 <build>...</build>
 <reporting>...</reporting>
 <!-- more project information -->
 <name>...</name>
 <description>...</description>
 <url>...</url>
 <inceptionyear>...</inceptionyear>
 <licenses>...</licenses>
 <organization>...</organization>
 <developers>...</developers>
 <contributors>...</contributors>
 <!-- environment settings -->
 <issuemanagement>...</issuemanagement>
 <cimanagement>...</cimanagement>
 <mailinglists>...</mailinglists>
 <scm>...</scm>
 <prerequisites>...</prerequisites>
 <repositories>...</repositories>
 <pluginrepositories>...</pluginrepositories>
 <distributionmanagement>...</distributionmanagement>
 <profiles>...</profiles>
</project>

modelversion是pom模型版本, 4.0.0支持maven2和3
maven coordinates(maven坐标)

(1)groupid: 它是一个组织或者项目的唯一id, 大多数情况下会使用项目的java包的根名作为groupid, 例如com.pastqing

(2)artifactid:它是正在构建的项目名称, 例如一个支付系统artifactid是web-pay。artifactid 是maven仓库中groupid目录下的子目录名

(3)version:顾名思义项目发行的版本号

以上三项都是构建结果名称的一部分, 在项目构建后会生成一个jar包,位于maven仓库的路径就是maven_repo/com/pastqing/web-pay/1.0/web-pay-1.0.jar

四、一个用maven构建的hello world java项目

利用maven插件archetype构建一个项目:
在终端中打开工作目录
运行命令:

mvn archetype:generate

, 第一次运行时比较慢,原因是第一次需要从maven*仓库中下载相关项目原型。下载完毕后,会选择项目模型,以及输入groupid, artifactid,version等,构建完毕后会有成功提示。
打包项目:切换到项目根目录,运行mvn package。打包成功之后,项目会生成一个target文件夹,里面有生成好的jar文件和class文件。
运行jar文件:

java -cp target/helloworld-1.0-snapshot.jar com.pastqing.app

至此一个最简单maven构建的java项目就完成了。

五、一个用maven构建的java-web项目

生成一个web项目与生成java项目基本类似,只是用的模型不同而已。这里不再阐述。下面我们具体说说如何使用tomcat或者jetty插件运行web项目。这里我们以tomcat举例。

maven tomcat插件安装:  http://tomcat.apache.org/maven-plugin-2.2/ 
我们将如下插件信息加入到web项目中的pom文件中

<plugin>
  <groupid>org.apache.tomcat.maven</groupid>
  <artifactid>tomcat6-maven-plugin</artifactid>
  <version>2.2</version>
</plugin>
<plugin>
  <groupid>org.apache.tomcat.maven</groupid>
  <artifactid>tomcat7-maven-plugin</artifactid>
  <version>2.2</version>
</plugin>

这样我们集成了这个tomcat的maven插件, 只需要一个命令就可以部署、启动服务了。命令如下:

mvn tomcat:run

(tomcat6)

mvn tomcat7:run

(tomcat7)

使用tomcat maven插件自动部署到外部tomcat
以上自动部署,会使用maven内嵌的tomcat, 下面我们修改pom文件, 让项目部署到外部的tomcat中。

修改项目pom文件,添加服务器配置信息

<plugin>
<groupid>org.apache.tomcat.maven</groupid>
<artifactid>tomcat7-maven-plugin</artifactid>
<version>2.2</version>
<configuration>
  <url>http://localhost:8080/manager/text</url>
  <server>tomcat7</server>
  <username>admin</username>
  <password>admin</password>
</configuration>
</plugin>

其中server, username, password的值与%maven_home中的setting.xml中的server, username, password一一对应。

启动外部tomcat, 运行命令mvn tomcat7:redeploy

六、如何用maven构建多模块项目

1.父pom

所有的maven pom文件都继承自一个父pom, 如果没有指定父pom, 则该pom文件继承自根pom。pom文件的集成关系如下图所示:

Java的项目构建工具Maven的配置和使用教程

可以让一个pom文件显式地继承另一个pom文件。这样,可以通过修改公共父pom文件的设置来修改所有子pom文件的设置。这里我们使用parent标签来定义父pom。下面我们具体搭建一个多模块mavne项目

2.构建项目目录结构

我们创建一个maven-web项目, 名字叫educationcloud, 接下来我们在项目目录下创建几个文件夹用来划分我们的模块。它们分别是education-parent(父模块), education-core(业务), education-entity(实体), education-web(web服务)

Java的项目构建工具Maven的配置和使用教程

目录的划分可以根据需要进行, 我的划分如上

3.修改pom文件

我们用module标签来进行划分模块。打开根目录下的pom文件, 添加moudle标签。

<?xml version="1.0" encoding="utf-8"?>
<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">
  <modelversion>4.0.0</modelversion>
  <groupid>com.educationcloud</groupid>
  <artifactid>educationcloud</artifactid>
  <version>1.0-snapshot</version>
  <packaging>pom</packaging>
  <modules>
    <module>education-parent</module>
    <module>education-core</module>
    <module>education-entity</module>
    <module>education-web</module>
  </modules>
  <name>educationcloud</name>
</project>

这里我们说下packaging标签:最常见的就是打包为jar, war了。任何一个maven项目都需要定义pom文件中的packaging元素, 如果不声明该元素, 则默认打包为jar, 如果定义值为war那么就打包为war包。如果值为pom,那么什么包都不生成(通常用于父模块)。

给各个模块添加parent标签:
parent标签用来定义父pom的坐标位置的, 定义如下:

<parent>
  <groupid>com.educationcloud</groupid>
  <artifactid>educationcloud-parent</artifactid>
  <version>1.0-snapshot</version>
  <relativepath></relativepath>
</parent>

groupid, aritfactid, version是常规表示父pom位置信息的元素, relativepath是表示父pom位置的相对路径, 默认为../pom.xml, 这里需要注意的是groupid, aritfactid, version必须与父pom文件中的对应起来

使用dependencymanagement管理项目所有依赖
为了统一管理依赖,我们在父项目模块的pom文件中使用dependencymanagement来声明项目的所有依赖, 这样在其他的子项目中引用依赖时就可以省略版本号的编写, 修改起来也很容易。
编写**父项目模块**educationcloud-parent的pom文件, 添加如下:
使用pluginmanagement管理项目中的maven插件
为了统一管理项目中的maven插件, 如maven编译插件, 打包插件等及其配置信息, 在父项目 pom文件中添加pluginmanagement来管理, 这样在所有子模块中引用的插件都会统一处理, 添加如下:

<pluginmanagement>
  <plugins>
  <!-- complile插件的配置 -->
    <plugin>
      <groupid>org.apache.maven.plugins</groupid>
      <artifactid>maven-complier-plugin</artifactid>
      <version>3.3</version>
      <configuration>
        <source>1.7</source>
        <target>1.7</target>
        <encoding>utf-8</encoding>
      </configuration>
    <plugin>
  </plugins>
</pluginmanagement>

上面我们添加了maven编译插件的配置,用jdk1.7编译, 保存后我们可以在各个子模块的effective pom中看到相应的修改。

使用properties标签定义常量:
我们将各个依赖的版本号定义为不同的常量,这样方便以后的修改:

<properties>
  <jdkversion>1.7</jdkversion>
  <servletversion>3.1.0</servletversion>
  <mysqlversion>5.1.34</mysqlversion>
  <junitversion>4.12</junitversion>
  <defaultencoding>utf-8</defaultencoding>
</properties>

引用时用${jdkversion}的形式引用即可。

注,以上操作均可在ide中操作, 更加方便简单。