目前Maven主流版本包括Maven2和Maven3,但是官方推荐使用Maven3,可以到官方站点根据操作系统平台选择压缩包下载,页面下方有Maven的配置方法,原理跟JDK一样,按照步骤配置即可。
这里友情提示一下,win7下不定期出现不识别%M2_HOME%路径,如果CMD下mvn -v始终不好使,可以将%M2_HOME%\bin替换成盘符的绝对路径。
创建项目之前先简单配置下Maven,压缩包解压后会有Maven_PATH\conf\settings.xml文件,使用文本编辑器打开进行编辑(如公司已使用Maven,直接跟同事要一份覆盖自己的文件最方便快捷),自己配置的话主要就是配置几个节点:
localRepository节点:Maven本地仓库路径(将其理解为Maven存放jar包路径即可),我在本地将其配置为
<localRepository>E:/tools/apache-maven-3.0.3/local_repos</localRepository>
proxy节点:配置网络代理的,如有需要配置此节点
mirror节点:如在公司使用Maven,一般都会自己搭建私服,此节点配置私服地址(至于私服是什么可以稍后了解),如果自己用没有私服不用配置,如果想要了解更多,请到这里围观!
打开一个命令行窗口,切换到某一存放项目的目录(例 D:\test_maven_project),输入命令(不包括双引号)“mvn archetype:create -DgroupId=com.iteye.liubey -DartifactId=hello-maven -DpackageName=com.iteye.liubey”,等待Maven创建项目,如果输出包括 BUILD SUCCESS字眼表示项目建立成功,成功的项目目录结构如下所示
hello-maven |-- pom.xml `-- src |-- main | `-- java | `-- com | `-- iteye | `-- liubey | `-- App.java `-- test `-- java `-- com `-- iteye `-- liubey `-- AppTest.java
使用
mvn package
来进行打包,出现BUILD SUCCESS表示成功编译成功,如图所示
使用以下命令验证该项目
D:\test_maven_project\hello-maven>java -cp target\hello-maven-1.0-SNAPSHOT.jar c om.iteye.liubey.App
打印出如图所示即表示项目建议成功!
这时候大家可以围观一下项目根目录的pom.xml文件,他是Maven项目的核心文件,主要都是些理论知识,我就不讲解了,大家可以到这里 这里以及这里进行围观。
创建普通项目:
mvn archetype:create -DgroupId=com.iteye.liubey -DartifactId=hello-maven -DpackageName=com.iteye.liubey
创建WEB应用项目:
mvn archetype:create -DgroupId=com.iteye.liubey.web -DartifactId=hello-maven-webapp -DpackageName=com.iteye.liubey.web -DarchetypeArtifactId=maven-archetype-webapp
生成Eclipse项目文件:
mvn eclipse:eclipse
构建项目但不执行测试:
mvn install –Dmaven.test.skip=true
浏览依赖的项目(生成树状结构):
mvn dependency:resolve mvn dependency:tree
本章主要讲利用Maven命令行建立符合Eclipse WTP格式的项目(这个曾经纠结了我许久,建立的项目怎么也不符合Eclipse的web项目规范),笔者不用MyEclipse,所以只以Eclipse为例子。
1:通过cmd命令行进入workspace文件夹,输入以下命令
mvn archetype:generate -DgroupId=com.iteye.liubey -DartifactId=hello-maven-web2 -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
其中groupId和artifactId是自由输入,读者可以根据自己的意志进行更改,命令行输出BUILD SUCCESS字样表示项目建立成功
2:在cmd中切换进入刚建立的项目文件夹,输入命令生成符合Eclipse WTP规范的web项目:
mvn eclipse:eclipse -Dwtpversion=2.0
这一步最最关键,正常项目只要eclipse:eclipse就可以,但是web项目需要后面的参数!纠结了许久的地方就是这,就差一个参数。。。
3:利用Eclipse Import---Existing Projects into Workspace导入项目,我这里面会有一个错误出现,错误信息如下:Java compiler level does not match the version of the installed Java project facet.
我的解决之道是在项目上右键Properties---Project Facts将Java的version改成1.6,然后点击Apply后进入Java Build Path将Libraies中的JRE改成本机所装JRE(谁有解决之道?)
此时利用Eclipse建立src/main/java,src/test/java,src/test/resources三个source folder,这时候此项目就完全符合Maven web的项目结构了,如图所示:
真实项目中,每一个项目都会有多套环境,包括开发环境,测试环境,灰度机环境以及最终的生产环境,每一套环境对应着不同的配置参数,比如JDBC连接信息肯定会有所差别,如果发布到某一环境中就需要改写一次配置文件,只有一个jdbc.properties还可以接受,想象一下真实项目中的配置文件的数量头就大,更重要的是如果写错了某参数后果将不堪设想!此时利用Maven管理的的另一个长处变显现出来了,利用Maven可以为每一个环境配置一个Profile,编译的时候指定Profile的名字即可达到编译文件按需产生。
理论知识可以到这里 这里 这里 这里寻找,我就不多讲了,本身其实很简单的理论。
我将按照步骤教大家如何实现这一非常非常重要的功能。
1:更改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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.iteye.liubey</groupId> <artifactId>hello-maven-web2</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>hello-maven-web2 Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>hello-maven-web2</finalName> <resources> <resource> <!--配置过滤目录 --> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <!-- war包插件,指引web.xml文件所在位置 --> <configuration> <warSourceDirectory> ${basedir}/src/main/webapp </warSourceDirectory> <webXml>${basedir}/src/main/webapp/WEB-INF/web.xml</webXml> </configuration> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.3</version> <configuration> <!-- <encoding>UTF-8</encoding> --> <includes> <include>*.properties,*.xml</include> <encoding>UTF-8</encoding> </includes> <excludes> <exclude>*.txt</exclude> <encoding>GBK</encoding> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.8</version> <configuration> <wtpversion>2.0</wtpversion> <useProjectReferences>false</useProjectReferences> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skip>true</skip> <systemProperties> <property> <name>param</name> <value>${param}</value> </property> </systemProperties> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>properties-maven-plugin</artifactId> <version>1.0-alpha-1</version> <executions> <execution> <phase>initialize</phase> <goals> <goal>read-project-properties</goal> </goals> <configuration> <files> <file>env_files/properties/${param}.properties</file> </files> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> <properties> <param>dev</param> </properties> <profiles> <!-- 开发环境 --> <profile> <id>dev</id> <activation> <!-- 默认 --> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <!-- 测试环境 --> <id>test</id> <properties> <param>test</param> </properties> <build> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <warSourceDirectory> ${basedir}/src/main/webapp </warSourceDirectory> <webXml>${basedir}/src/main/webapp/WEB-INF/web.xml</webXml> </configuration> </plugin> <plugin> <!-- 可以运行一些命令 --> <artifactId>maven-antrun-plugin</artifactId> <executions> <execution> <id>1</id> <phase>integration-test</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>Deploying Hello Maven Web2</echo> <!-- <exec executable="/bin/rm"> <arg value="-rf" /> <arg value="/usr/local/webapps/HelloMavenWeb2" /> </exec> COPY WAR包并修改WAR包名称 <exec executable="/bin/cp"> <arg value="-r" /> <arg value="${basedir}/target/HelloMavenWeb2" /> <arg value="/usr/local/webapps/HelloMavenWeb2" /> </exec> --> <echo>Deploy Complete</echo> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> <!-- 生产环境 雷同于测试环境 --> <profile> <id>prod</id> <properties> <param>prod</param> </properties> </profile> </profiles> </project>
主要是加入了资源过滤以及profile支持,我共配置了dev,test以及prod三套profile。
2:为了验证Profile是否生效,需做如下步骤,在src/main/resources目录下加入jdbc.properties文件,里面写入代码如下:
className=${driverName} param=${param}
其中${}格式为Maven编译时可替换变量,其中driverName为在配置文件中声明的变量,param为在pom.xml中声明的变量,此处主要是展示变量可以有两种方式获取,然后再项目根目录创建env_files文件夹,进入env_files文件创建properties文件夹,在properties文件夹下建立两个文件dev.properties和test.properties,此处主要对应于Profile理论上将一个Profile对应一个properties文件:
dev.properties
driverName=Oracle
test.properties
driverName=MySQL
3:准备工作已经完成,此时切回cmd命令行窗口,输入
表示执行maven命令,首先clean项目 然后使用名字为dev的Profile来install项目,
执行结果如下所示:
此时表示项目已经编译并打包成功,进入项目的target文件夹找到hello-maven-web2.war看看里面的变量是不是已经替换成这样了
Maven是一个学习曲线非常陡峭的工具,但是大家也看到了,如果在日常使用中采用将会带来许多许多好处,其实懂了本篇文章基本上就已经可以在工作中使用Maven了,简历中别忘了写上“精通”,你懂的,但本身Maven是非常复杂的,包括项目的坐标和依赖(包括依赖传递)已经仓库、生命周期和各种各样的插件、和Hudson的结合来达到一键部署等等,非常复杂。有机会再分享!