深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤

1:Maven的选择和配置

目前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,一般都会自己搭建私服,此节点配置私服地址(至于私服是什么可以稍后了解),如果自己用没有私服不用配置,如果想要了解更多,请到这里围观

 

 

2:创建简单项目

 

打开一个命令行窗口,切换到某一存放项目的目录(例 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表示成功编译成功,如图所示


深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤_第1张图片

 

使用以下命令验证该项目

 

D:\test_maven_project\hello-maven>java -cp target\hello-maven-1.0-SNAPSHOT.jar c
om.iteye.liubey.App

 打印出如图所示即表示项目建议成功!


3:POM

这时候大家可以围观一下项目根目录的pom.xml文件,他是Maven项目的核心文件,主要都是些理论知识,我就不讲解了,大家可以到这里 这里以及这里进行围观。

 

4:常用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
 

 

五:创建Web项目

本章主要讲利用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(谁有解决之道?)


深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤_第2张图片
 
深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤_第3张图片

此时利用Eclipse建立src/main/java,src/test/java,src/test/resources三个source folder,这时候此项目就完全符合Maven web的项目结构了,如图所示:


深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤_第4张图片

六:真实项目必不可少的Profile

真实项目中,每一个项目都会有多套环境,包括开发环境,测试环境,灰度机环境以及最终的生产环境,每一套环境对应着不同的配置参数,比如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项目,

执行结果如下所示:


深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤_第5张图片
 此时表示项目已经编译并打包成功,进入项目的target文件夹找到hello-maven-web2.war看看里面的变量是不是已经替换成这样了


深入浅出Maven:创建普通及Web项目、使用Profile进行资源过滤_第6张图片

七:结尾

Maven是一个学习曲线非常陡峭的工具,但是大家也看到了,如果在日常使用中采用将会带来许多许多好处,其实懂了本篇文章基本上就已经可以在工作中使用Maven了,简历中别忘了写上“精通”,你懂的,但本身Maven是非常复杂的,包括项目的坐标和依赖(包括依赖传递)已经仓库、生命周期和各种各样的插件、和Hudson的结合来达到一键部署等等,非常复杂。有机会再分享!

你可能感兴趣的:(profile)