??xml version="1.0" encoding="utf-8" standalone="yes"?>
Maven 出现到现在也有很长时间了Q初识它的感觉至今仍清晰的印在脑中。现在想来,当时?Ant UL Maven 的想法其实很朴素Q就是因?Maven 可以以网站的形式展现与项目相关的信息Q如开发h员列表、各U?Report。这U方式ؓ目的构建带来了极大的方便,其?Report 的。试惛_于生的 Junit-Report、JavaDoc、CheckStyle、PMD {报告,如果没有一个统一的入口,每次切换目录是多么o人厌烦的事情Q?
Maven 无疑是相当成功的Q这一点从来多的开源项目开始?Maven 可以看出。Maven 取得成功的原因很单:在简化构本的同时Q功能ƈ没有~水Q反而有所增强Q提供汇集项目信息的工具Qƈ以相当友好的方式呈现Q丰富的插g化了工作。如此有力的工具出现Q自然是争相使用?
新特?
如今 Maven2 已经推出QMaven 的官方网站称QMaven2 相对?Maven1 是一个相当大的{变,甚至不惜牺牲兼容性来辑ֈq一目的。(Z Maven1 的用L惻IMaven1 仍在l箋他的使命。)如此大的变动到底换来了什么样的结果?
1Q?更快、更?
比v Maven1 那不急不慢的q行速度QMaven2在速度上有了质的飞跃,甚至与Ant相比也毫不逊色Q当Ӟ下蝲不算Q。除此之外,"化工作,使用业界公认的最佛_?也是?Maven2 的另一大主题,其他的新Ҏ无处不在体?Maven2 为简化工作而做出的努力?
2Q?更少的配|文?
Maven1 ?Maven2 主要配置文g的对比:
Maven1Qproject.xml、maven.xml、project.properties和build.properties?
Maven2Qpom.xml和settings.xml?
POM是Maven的核心对象模型,在Maven2中POM已由project.xml转移到pom.xml中用,版本也由3升?。对于项目,一般只需要pom.xmlp了?
在Maven2中不需要也不提倡用maven.xmlQ原因如下:
plugin的易用性的增强?
散布于maven.xml中的内容难以在不同项目间׃nQ也不利于维护。在Maven2中徏议用自定义的plugin来封装这些内宏V?
如果仍期望能够用类似maven.xml的功能,?lt;preGoal>Q请参考Inserting non-standard build steps using preGoals and postGoals?
在Maven2中,配置使用settings.xmlQ它取代了原有的project.properties和build.properties。配|在Maven2中存在两U别:
用户U,针对操作pȝd用户而言。一般在$home/.m2/Q对于windows用户Q就是目录:C:\Documents and Settings\用户名\.m2\settings.xml?
全局U:一般在%M2_HOME%/conf/settings.xmlQM2_HOME是Maven2的根目录环境变量名?
在settings.xml中可以配|,如本地Repository、proxy{等Q关于settings.xml的结构可以从Maven的官方网站上获取?
3Q?Plugin语言更换
在Maven2中,~写plugin的语a由jelly变更为Java和BeanShell。Java在速度上更有优势,而且开发h员的熟悉E度更高。对于其他的行脚本Q如groovyQMaven的官方网站的意见是,{待其更成熟时再考虑
?
4Q?提供预定义的目录模板
好的目录l构可以使开发h员更Ҏ理解目Qؓ以后的维护工作也打下良好的基。Maven2Ҏ业界公认的最佳目录结构,为开发者提供了~省的标准目录模ѝMaven2的标准目录结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
目?
pom.xml
src/
main/ 目M目录
java 源代码目?
resources 所需 资源目录
fileters 资源qo文g目录
assembly
config 配置文g目录
test/
main/
java
resources
fileters
site 与site相关的资源文?
target/ 输出目录
classes 目主题输出目录
test-classes 试输出目录
site Ҏsite输出目录
使用目录模板Q可以pom.xml更简z。因为Maven2已经Ҏ~省目录Q预定义了相关的动作Q而无需人工的干预。以resources目录ZQ?
src/main/resourcesQ负责管理项目主体的资源。在使用Maven2执行compile之后Q这个目录中的所有文件及子目录,会复制到target/classes目录中,Z后的打包提供了方ѝ?
src/test/resourcesQ负责管理项目测试的资源。在使用Maven2执行test-compile之后Q这个目录中的所有文件及子目录,会复制到target/test-classes目录中,为后l的试做好了准备?
q些动作?Maven1 中,是需要在 maven.xml 中?lt;preGoal>?lt;postGoal>来完成的。如今,完全不需要在pom.xml中指定就能够自动完成。在src?test都用resourcesQ方便构建和试Q这U方式本已是前人的l验。通过使用Maven2Qɘq个l验在开发团队中得到普及?
创徏标准目录模板Q可以通过如下命oQ?
1
mvn archetype:create -DgroupId=com.codeline.commons -DartifactId=codelineCommons
groupId和artifactId的含义与Maven1中的含义一P参数artifactId的g作ؓ目根目录的名字。除了徏立相应的目录之外QMaven2q会创徏~省的pom.xml?
Maven2也考虑刎ͼ不同cd的项目需要拥有不同的目录l构。如创徏web目Q可以用命令:
1
2
3
4
mvn archetype:create -DgroupId=com.mycompany.app
-DartifactId=my-webapp
-DarchetypeArtifactId=maven-archetype-webapp
5Q?生命周期的引?
在Maven2中有了明的生命周期概念Q而且都提供与之对应的命oQ得项目构建更加清晰明了。主要的生命周期阶段Q?
validateQ验证工E是否正,所有需要的资源是否可用?
compileQ编译项目的源代码?
test-compileQ编译项目测试代码?
testQ用已~译的测试代码,试已编译的源代码?
packageQ已发布的格式,如jarQ将已编译的源代码打包?
integration-testQ在集成试可以q行的环境中处理和发布包?
verifyQ运行Q何检查,验证包是否有效且辑ֈ质量标准?
installQ把包安装在本地的repository中,可以被其他工E作Z赖来使用
deployQ在整合或者发布环境下执行Q将最l版本的包拷贝到q程的repositoryQ得其他的开发者或者工E可以共享?
generate-sourcesQ生应用需要的M额外的源代码Q如xdoclet?
如果要执行项目编译,那么直接输入Qmvn compile卛_Q对于其他的阶段可以cL。阶D之间是存在依赖关系QdependencyQ的Q如test依赖test-compile。在执行 mvn testӞ会先q行mvn test-compileQ然后才是mvn test?
6Q?新增Dependency Scope
在POM 4中,<dependency>中还引入?lt;scope>Q它主要理依赖的部|Ӏ目?lt;scope>可以使用5个|
compileQ缺省|适用于所有阶D,会随着目一起发布?
providedQ类似compileQ期望JDK、容器或使用者会提供q个依赖。如servlet.jar?
runtimeQ只在运行时使用Q如JDBC驱动Q适用q行和测试阶Dc?
testQ只在测试时使用Q用于编译和q行试代码。不会随目发布?
systemQ类似providedQ需要显式提供包含依赖的jarQMaven不会在Repository中查扑֮?
<scope>的用D例:
1
2
3
4
5
6
7
8
<dependency>
<groupId>hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
7Q?传递依赖,化依赖管?
在Maven1中,需要把依赖所需要的包也一q列出。这对于使用cM如Hibernate的用h说所操的心太多了Q而且也不方便。在Maven2中实C传递依赖,如此对于Hibernate所依赖的包QMaven2会自动下载,开发h员只需兛_Hibernate卛_?
注意Q只有得到Maven支持的依赖,通常是plugin形式出现Q才能获得这个特性。而且对于一些老的pluginQ可能由于时间的关系不支持传递依赖。如臛_在Maven 2.0.1中,对于Hibernate 2.1.2Q仍焉要显式列出Hibernate 2.1.2所依赖的包?
[/img]
文章来自: developerworks
]]>
<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>PM_Member_EAR</groupId>
<artifactId>PM_Member_EAR</artifactId>
<packaging>ear</packaging>
<version>0.1-SNAPSHOT</version>
<description></description>
<dependencies>
<dependency>
<groupId>com.newegg.lab</groupId>
<artifactId>MemberWeb</artifactId>
<version>0.1-SNAPSHOT</version>
<type>war</type>
</dependency>
<dependency>
<groupId>com.newegg.lab</groupId>
<artifactId>frontWeb</artifactId>
<version>0.1-SNAPSHOT</version>
<type>war</type>
</dependency>
</dependencies>
<build>
<finalName>newegg</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<configuration>
<modules>
<webModule>
<groupId>com.newegg.lab</groupId>
<artifactId>MemberWeb</artifactId>
<contextRoot>
/MemberWeb
</contextRoot>
</webModule>
<webModule>
<groupId>com.newegg.lab</groupId>
<artifactId>frontWeb</artifactId>
<contextRoot>
/frontWeb
</contextRoot>
</webModule>
</modules>
</configuration>
</plugin>
</plugins>
</build>
</project>
]]>
]]>
]]>
一个简单的而完全可操作的pom.xml如下所C:
<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> <!--maven2-->
<groupId>ctzj_bss</groupId> <!-- q个目所属组的idQ一般是目所在的公司或组l的域名 -->
<artifactId>NRC</artifactId> <!-- 目的id,和groupId一L成这个项目的一个唯一idQ以用在别的maven2工程?-->
<packaging>jar</packaging> <!-- 最后这个工E的打包cd,在这里是打成jar?-->
<version>1.0</version> <!-- 版本?-->
<name>kenan nrc batch</name> <!-- 目? 区别于artifactId-->
<description>insert a nrc in kenan db</description> <!-- 目描述,会出现在生成的工E站点上 -->
<build> <!-- 目的构Z?-->
<sourceDirectory>src</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
<outputDirectory>target\classes</outputDirectory>
<testOutputDirectory>target\test-classes</testOutputDirectory>
<directory>target</directory> <!-- 构徏后生成文?jar,site{?所在位|?-->
</build>
<dependencies> <!-- 目的依赖外接包,maven的优势之一 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<reporting> <!-- 目报表,有很多插件可供选择 -->
<outputDirectory>target/site</outputDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
</plugins>
</reporting>
</project>
在你配置了你的pom文g后,你就可以使用如下命o来运行maven2
mvn compiler:compile ~译你的原文?br />
mvn jar:jar 打包
mvn site:site 生成目站点
接下来逐个介绍pom.xml的各个要?br />
developor,organization and mail lit
build
dependencies
reporting
1.developor,organization and mail list
可以在pom中加入开发h员列?目所属组l信?邮g列表,q些信息会出现在生成的项目站点上
<organization>
<name>CTZJ BSS</name>
</organization>
<developers>
<developer>
<name>Chen Lin</name>
<organization>ZJHCsoft</organization>
<email>chenlin@zjhcsoft.com</email>
</developer>
</developers>
<mailingLists>
<mailingList>
<name>${pom.name} Dev List</name>
</mailingList>
<mailingList>
<name>${pom.name} User List</name>
</mailingList>
</mailingLists>
2. build
配置目的构Z?主要有指定目?包括源代码、测试源代码、输出目录、资源目录等.如果没有Ҏ需求以上的pom已经_?br />
3. dependencies
配置目要用到的jar?自认为maven对jar包的理是它的一个重要特?下面是一个jar包的配置:
<dependency>
<groupId>concurrent</groupId>
<artifactId>concurrent</artifactId>
<version>1.3.4</version>
<scope>compile</scope>
</dependency>
groupId: 没有特定的含?一般来自同一l织的jar包会有相同的groupId?br />
artifactId: q个jar的id,一般是q个jar包的名称
version: jar包的版本?一般情况下,artifactId-version.jar是q个jar包的文g?br />
scope: q个jar所影响的范?compile指它会在~译源代码时用到.q有test,provide,runtime{?br />
如果你不知道jar包的groupId和artifactIdQ可以到http://www.mavenregistry.com/ q行查询
一旦指定后,当你q行~译Ӟ它就会到你的本地资源?br />
?如果你引入本地包Q则需要先行将它安装到本地资料?repository),使用如下命o
mvn install:install-file -DgroupId=%groupId% -DartifactId=%artifactId% -DgeneratePom=true -Dfile=%file% -Dpackaging=jar -Dversion=%version%
4. reporting
通过使用相应的report plug-in可以生成各种各样的report.如javadoc,junit test report,代码查等
常用的常见有
<plugin>
<groupId>org.apache.maven.plugins</groupId> <!--java doc -->
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId> <!-- 代码?-->
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<configLocation>config/sun_checks.xml</configLocation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId> <!-- test l果报表 -->
<artifactId>surefire-report-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId> <!-- 源代码的HTML?-->
<artifactId>jxr-maven-plugin</artifactId>
</plugin>
在maven的官方网站有可以扑ֈ更多的report plugin
最后一个比较完整的pom.xml看v来像q样Q?br />
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>CutoverModule</name>
<groupId>ctzj_batch</groupId>
<artifactId>eai_cutover</artifactId>
<url>http://134.98.83.137:8081/scarab/issues</url>
<inceptionYear>2006</inceptionYear>
<organization>
<name>CTZJ BSS</name>
<url>http://www.zjhcsoft.com</url>
</organization>
<version>1.0</version>
<description>97 cutover batch module:invoke eai-adapter to update the phone number or value of
c4/c5</description>
<developers>
<developer>
<name>Chen Lin</name>
<organization>ZJHCSoft</organization>
<email>chenlin@zjhcsoft.com</email>
</developer>
</developers>
<mailingLists>
<mailingList>
<name>${pom.name} Dev List</name>
</mailingList>
</mailingLists>
<build>
<sourceDirectory>src</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
<outputDirectory>target\classes</outputDirectory>
<testOutputDirectory>target\test-classes</testOutputDirectory>
<directory>target</directory>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.1</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.1</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.1.2</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.0</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.1</version>
</plugin>
</plugins>
</build>
<ciManagement>
<system>continuum</system>
<url>http://localhost:8080/continuum/servlet/continuum</url>
</ciManagement>
<scm>
<connection>scm:local|E:/eclipseworkshop|EAIBatch</connection>
</scm>
<dependencies>
<dependency>
<groupId>ctzj_batch</groupId>
<artifactId>Eaiadapter</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ctzj_batch</groupId>
<artifactId>ta</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ctzj_batch</groupId>
<artifactId>grnds-common</artifactId>
<version>4.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>concurrent</groupId>
<artifactId>concurrent</artifactId>
<version>1.3.4</version>
<scope>compile</scope>
</dependency>
</dependencies>
<reporting>
<outputDirectory>target/site</outputDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<configLocation>config/sun_checks.xml</configLocation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>surefire-report-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jxr-maven-plugin</artifactId>
</plugin>
</plugins>
</reporting>
</project>
]]>
]]>
]]>
Maven和ANT是Apache 推出的大名鼎鼎的Build和工E管理工P国内有h他做了汉化工作Qƈ推出了maven手册汉化工作Q其中手册已l完工,对广大程序员可是一大帮助?a href="http://http//maven.huangdong.com/">q入该网?/a>
用户手册
forEach
Now attaining goal number ${goalNumber}, which is ${goal}
forEach标签提供单@环功能,节点值就是@环体?
forEach 标签的节点DZ一些在处理q程中的关于目标的文本,q?attainGoal werkz 标签来获?执行?)q些目标?
Maven 配置
属性的处理机制
Maven按下面的序依次dproperties文gQ?
d的属性遵?#8220;最后的定义有效”原则。也是_Maven依次dproperties文gQ以新的定义 覆盖旧的定义?{user.home}/build.properties是Maven最后处理的文g。我们把 q些文gUCؓMaven处理的标准属性文仉?
另外Q上qproperties文g处理完毕后,Maven才会开始处理系l属性。所以,如果在命令行中??Dproperty=valueq样的Ş式来指定的属性,它会覆盖先前定义的同名属性?
插g的属?/a>
上述属性文件处理完后,Maven才会开始调用插Ӟ但是 PluginManager 会禁止插?覆盖已经讄的属性倹{这和Maven一般的属性处理方式是相反的,q是因ؓ插g只能在Maven内部?其他部分初始化完毕后才能处理Q但是我们又希望以这样顺序去处理属性:
q样一来,即插g处于属性处理链的后端,也能覆盖插g的Q何缺省属性。例如,Checkstyle插g 定义了如下~省属性:
maven.checkstyle.format = sun
你可能已l猜出来了,Checksytle插g把Sun的编码规范作为缺省的格式。但是我们仍然可以在标准属?文g集的M一个文件中覆盖q个属性。所以如果在${project.home}/project.properties 文g定义了如下属性|
maven.checkstyle.format = turbine
Checkstyle׃使用Turbine的编码规范?
行ؓ属?/a>
下面的这些属性可以改变Maven?#8220;行ؓ方式”?
属?
描述
~省?
maven.build.dest
目录名,存放~译生成的类
${maven.build.dir}/classes
maven.build.dir
存放构徏l果的目录,如类文gQ文档,单元试报告{等?
注意Q?/strong> ?{user.home}/build.properties文g中改变maven.build.dir 的缺省值或怼得到一?较ؓ个性化的目录布局。但是,q会q扰Maven׃源码开始的~译工作Q因为它假设jar?会被创徏?{basedir}/target/目录中?
${basedir}/target
maven.build.src
源码目录
${maven.build.dir}/src
maven.conf.dir
配置文g目录
${basedir}/conf
maven.docs.dest
html格式报告的输出目?
${maven.build.dir}/docs
maven.docs.omitXmlDeclaration
产生的文档所应包含的xml声明_如:
false
maven.docs.outputencoding
生成文档的缺省编?
ISO-8859-1
maven.docs.src
用户提供的文档目?
${basedir}/xdocs
maven.gen.docs
xdocs文档转换成html后的输出目录
${maven.build.dir}/generated-xdocs
maven.home.local
maven用于写入用户信息的本机目录,如解开插g包、缓冲数据?
${user.home}/.maven
maven.mode.online
是否q接internet
true
maven.plugin.dir
插g的存攄?
${maven.home}/plugins
maven.plugin.unpacked.dir
用于展开安装插g的目?
${maven.home.local}/plugins
maven.repo.central
在进行dist:deploy处理的时候,发行包所要部|的目标机器
login.ibiblio.org
maven.repo.central.directory
在进行dist:deploy处理的时候,发行包所要部|的目标目录?
/public/html/maven
maven.repo.local
本机repositoryQ用于存储下载的jar包?
${maven.home.local}/repository
maven.repo.remote
q程repositoryQ如果本机repository没有的jar包,maven会从q里下蝲?
http://www.ibiblio.org/maven
maven.repo.remote.enabled
是否使用q程repository?
true
maven.scp.executable
用于安全拯的可执行E序
scp
maven.src.dir
基础源代码目?
${basedir}/src
maven.ssh.executable
q程命o可执行程?
scp
使用代理
如果你只能通过代理讉KQ不要紧QMavenZ提供了下列属性:
代理属?
描述
maven.proxy.host
代理的IP地址
maven.proxy.port
代理端口
maven.proxy.username
如果代理需要认证的话,在这里填写用户名?User name if your proxy requires authentication.
maven.proxy.password
如果代理需要认证的话,在这里填写密码?
如果你实在需要代理,最好在${user.home}/build.properties文g中指定?
## ----------------------------------------------------------
## ${user.home}/build.properties
## ----------------------------------------------------------
.
.
maven.proxy.host = my.proxyserver.com
maven.proxy.port = 8080
maven.proxy.username = username
maven.proxy.password = password
.
.
使用多个q程Repositories
你可以在MMaven可以处理的属性文件中指定使用多个q程RepositoriesQ如Q?
maven.repo.remote = http://www.ibiblio.org/maven/,http://www.mycompany.com/maven/
目讄
开始一个新目
如果你是W一ơ用MavenQ或者开始一个新的项目,你可以用GenApp来自动创建Maven目树?
maven -Dpackage=com.mycompany.app genapp
执行该命令后Q屏q显C如下:
__ __
| / |__ Jakarta _ ___
| |/| / _ V / -_) ' ~ intelligent projects ~
|_| |___,_|_/___|_||_| v. 1.0-beta-9
[mkdir] Created dir: /genapp/src/java/com/mycompany/app
[copy] Copying 1 file to /genapp/src/java/com/mycompany/app
[mkdir] Created dir: /genapp/src/test/com/mycompany/app
[copy] Copying 3 files to /genapp/src/test/com/mycompany/app
[copy] Copying 2 files to /genapp
[copy] Copying 1 file to /genapp/src/conf
BUILD SUCCESSFUL
Total time: 3 seconds
执行完毕Q即生成下面的完整项目目录树Q?
.
|-- project.properties
|-- project.xml
`-- src
|-- conf
| `-- app.properties
|-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- com
`-- mycompany
`-- app
|-- AbstractTestCase.java
|-- AppTest.java
`-- NaughtyTest.java
构徏
Maven采用了集中管理库的理c所有用于构建的jar包都是从集中理的中心库上取出。目前, 我们的中心库攑֜q儿 Ibiblio. 在一个典型的Maven目中,构徏所需?jar包会从中心库下蝲。Maven只会取回依赖链条上缺q包。如果你使用Maven来构建几个项目, q些目可能会共享一些依赖包QMaven可以在Q意个目中共享同一个包Q而无d同一pȝ 中保持一个jar包的多个拯?
构徏生命周期
在CVS中存放jar文g
我们不推荐你在CVS中存放jar包。Maven提倡在本机repository中存攄于构建共享的jar包或 和其他项目包。许多项目都依赖于诸如XML解析器、标准例E,q在Ant构徏中,l常会被复制 多䆾。在Maven中,q些标准例程存攑֜本地repository中,供Q何项目构Z用?
重蝲已声明的依赖?/a>
你可能会发现Q在某些情况下允讔R载POM中已l声明的依赖包会很方便,甚至很有必要?你可能会希望使用文gpȝ中的某个JAR包,或者你希望单重新指定某个包的版本。对?q样的情况,Maven提供了一U简单的方式Q允怽选择构徏所需的jar包。我们严重徏?) 你设|本机repositoryQ但是在单至上,或在由ant构徏q移的情况下QJAR包重载特?会显得非常方ѝ?
Z使用JAR包重载特性,你必dmaven.jar.override 属性设|ؓ on?只要讄了这个属性,可以在Mmaven处理的属性文件中重蝲JAR包?
关于JAR重蝲的指令有两种。第一U允怽指定某个特定的包的\径,作ؓJAR包;的二U?允许你指定某个特定的JAR包(q个jar包必dl存在于本机repositoryQ。下面是q两 U方式:
maven.jar.artifactId = [path]
maven.jar.artifactId = [version]
下面是一个用JAR重蝲指o的属性文件例子:
# ------------------------------------------------------------------------
# M A V E N J A R O V E R R I D E
# ------------------------------------------------------------------------
maven.jar.override = on
# ------------------------------------------------------------------------
# Jars set explicity by path.
# ------------------------------------------------------------------------
maven.jar.a = ${basedir}/lib/a.jar
maven.jar.b = ${basedir}/lib/b.jar
# ------------------------------------------------------------------------
# Jars set explicity by version.
# ------------------------------------------------------------------------
maven.jar.classworlds = 1.0-beta-1
使用SNAPSHOT依赖
在Maven中,SNAPSHOP是某个特定项目的最新构建的jar包。如果你的项目依赖于另一个频J变?的项目,你可以在你的POM中声明SNAPSHOP依赖Q以保持与那个项目的同步。例如,在你的POM?q样写,你可以与Jelly保持 同步更新?
...
commons-jelly
commons-jelly
SNAPSHOT
...
上述语句的含义是QL使用Maven repository中最新的Jelly构徏包。SNAPSHOT依赖 MD依赖p|。在q种情况下,Maven׃去Maven repository取得一个SNAPSHOT 依赖包的拯。如果你正在ȝ工作QMaven׃发出警告Q?#8220;SNAPSHO依赖包可能已l?q期”?
多项目构建和Reactor
在Maven中,Reactor是一个用于控制多目构徏的工兗Reactor用Werkz?q根据每个项?各自定义的依赖关pL安排构徏序。Reactor的意囑֜于:鼓励创徏/重构h更小、更松散?更有一致性单元的目。r源于面向lg~程Q在向组件编E中Q整个系l由许多松散的个?构成Q这些个体需要聚合v来作Z个整体进行部|Ӏ?
Reactor可以为某个项目集执行一个Q意编排的目标列表。所以,如果使用Reactor的话Q它 可以用来做项目站点生成,Ljar包生成这L事情?
目前 db.apache.org 站点是攉了其子项目的 丰富信息、ƈ与一pd?a >Velocity 模板合成的。这一q程是由 Jelly Velocity 标签库来完成的?a > q里是其中的机制Q有兴趣可以看看?
Plexus(一个基于Avalon的容?lg的manifest是遍历所有Plexuslg、ƈ聚合而成的。这?使用的还是Velocity模板和Jelly Volocity标签库?q里是其中的机制Q有兴趣可以看看?
q里是一个用Reactor标签Q遍历一pdlgQ最后生项目站点的例子Q?
... Do whatever you want with the harvested information ...
如果你需要聚合N个项目的文档QŞ成一个统一的视图,你可以参?db.apache.org站点Q它从所有的子项目中攉 信息Q最lŞ成一个有D条,邮g列表Q开发者列表和源码repositoryl一的站炏V这解决 了在攉子项目信息过E中的冗余、易于生错误的问题。db.apache.org的子目只需x 自n的信息,却可以自动的集成到高层的目站点中?
ȝ构徏
如果你需要离U构建,你得在命令行中用离UK项Q?
maven -o jar:jar
q等同于Q?
maven -Dmaven.mode.online=false jar:jar
或者你可以?a >属性文?/a>中设|?maven.mode.online 属性ؓfalse?
在联机模式下QmavenL下蝲 SNAPSHOT 依赖? 请参?使用SNAPSHOT依赖。如果本机repository 上的当前版本比服务器上的q要斎ͼ你也怸想maven覆盖你的当前版本。如果不想下载,你可?讄属性:
maven.repo.remote.enabled=false
在maven beta 9版本中,q个属性ƈ没有起作?新版本已l解决了q个问题)。可以这h清空 maven.repo.remote 属性:
maven.repo.remote.enabled=
在命令行或属性文件中讄都一栗?
在下面的情Ş中,你需要同时设|maven.repo.remote.enabled=false maven.mode.online=trueQ希望javadoc插g?-link"选项起作用,而又不希?下蝲M(包括snapshot)包?
命o行选项介绍
如果你用命o行来构徏Q这里提供了一个关于命令行选项的快速参考?
Options:
-D,--define arg 定义一个系l属?
-E,--emacs 输出z的日志信息
-X,--debug 输出debug信息
-b,--nobanner 止 logo banner
-d,--dir arg 讄指定的工作目?
-e,--exception 输出异常堆栈信息
-f,--find arg 通过搜寻目文g来确定执行的目文g及其工作目录
-g,--goals 昄可用的目?
-h,--help 昄帮助信息
-i,--info 昄pȝ信息
-o,--offline ȝ构徏
-p,--pom arg 指定目文g
-v,--version 昄版本?
试
试资源
通常情况下,你需要在试c\径上为测试指定某些资源。你可以在POM中?
下面的例子说明了如何递归的包含在${basedir}/src/test目录中所有以.xml?properties为扩展名 的文Ӟ
...
...
...
${basedir}/src/test
**/*.xml
**/*.properties
下面的例子说明了如何递归的包含在${basedir}/src/test目录中所有以.xml?properties为扩展名 的文Ӟ但naughty.properties文g除外。请注意增加的project/build/unitTest/resources/excludes 节点Q?
...
...
...
${basedir}/src/test
**/*.xml
**/*.properties
naughty.properties
q行一个单独的试
下面的命令运行了一个单独的试Q?
maven -Dtestcase=org.foo.bar.MyTest test:single-test
打包
JAR 资源
...
${basedir}/src/conf
*.xml
*.properties
${basedir}/src/messages
org/apache/maven/messages
messages*.properties
部v
固化SNAPSHOT依赖
在开发时使用SNAPSHOT依赖包非常方便,但是在部|的时候,你需要把所有的SNAPSHOT依赖?固定下来Q以便发布一个包含固定jar的版本。如果你发布了一个含SNAPSHOT依赖包的目Q?q些SNAPSHOT在项目发布后发生了变_你可能很快就会发现这个版本没法儿工作?
当SNAPSHOT以时间戳为版本号部v到Maven上时QMaven可以识别foo-SNAPSHOT.jar实际上相?于foo-20030101.010101.jar。当部v的时L_你可以用下面的命令,让Maven把SNAPSHOT 版本号变为时间戳版本受?
maven convert-snapshots
Maven会提供交互的方式让你选择哪个SNAPSHOPT依赖包应该固化下来。这一q程l束后,Maven ׃把刚才你的选择写会你的POM?
如果你希望Maven单的、尽可能最好的固化SNAPSHOT依赖包,你可以用下面的命令:
maven convert-snapshots-auto
拯依赖JAR?/a>
在maven.xmlq样写下面的语句是最单的拯依赖包的Ҏ?
...
...
用deploy:copy-deps标签你就可以单的把项目所有的依赖包拷贝到M 目录Q如果希望排除某个依赖包Q需要给Z个依赖包的id列表Q列表中依赖包就不会被拷贝?
...
...
命名U定
q部分将要的描述目对象模型(POM)中命名约定。本文档希望可以统一各式各样jar包命?ҎQ这些jar包一般ؓjava开发者社区广泛用?
规则和指?/a>
目
一个项目必ȝ一个唯一的的标识Q标识由a-z写字母和连U号构成Q其首字母必M写字母 开头?
bar
foo
...
所有项目间的引用都qid和包id构成。到现在为止Q在POM与此相关的是下面要Q上面提到的Q)谈到的项目的 依赖声明?
目的名U应该易于阅读,可用于文档?
bar
foo
The Grand Master Foo
...
目应该有一个组标识Q组标识是名U的基础部分?
bar
foo
The Grand Master Foo
...
所有项目发布的包都应基于项目唯一的标识,q且攑֜Z目的组id的目录中。对于上面的 目来说Q假定发布的包是jarcd的包Q我们就会有如下目录l构Q?
repository
|
+-- bar
|-- distribution
`-- jar
|-- foo-1.0.jar
`-- foo-2.0.jar
依赖
一个理想的典型依赖声明的例子可能会象这P
yourProject
yourArtifact
Your Groovey Machine
...
bar
foo
1.0
q样一来,依赖于id为foo1.0 版本的bar目 属于org.foo.barl。这个依赖会被解析ؓ本地repository中jar文g。上?的情形假定发布的包是Z包id命名的。因此对于上qC赖,Maven׃采用 foo-1.0.jar作ؓjar名?
像用户反映的那Pq种理想的方式ƈ不能适应所有的目。有几种情Ş我们必须考虑调整 理想的依赖机Ӟ
ant
ant-optional
1.4.1
ant
poorly-named
1.4.1
所以A), B) ?C)实际上是指向属于同一l的单个包的指针Q这是_一个单独的依赖是Ҏ个组中的某个 包的引用。目前artifact如果没有特别说明的话Q一般指的是jar包。但是依赖也可能是一个war文g或一?发行包。我们试囑֜提供多数情况?构徏大多需要jar?使用的缺省方式的同时Q也֏灉|性?
q程Repository布局
q部分文档将对Maven的远Erepositories做一个概要的说明。目前,主repository位于 IbiblioQ但是你也可以自己创Z 个远ErepositoriesQ其l果描述可以在这部分文档中找到?
M独立的项目在repository都有自己的目录。每个项目有一个唯一的项目id和同名目录, 目的发行包放在这个目录中?
目的目录中可以存放各种各样的artifactsQ目前最为广泛用的两种cd是jar包和发行?下面是一个远Erepository快照Q?
repository
|
|-- ant
| |-- distribution
| `-- jars
| |-- ant-1.4.1.jar
| `-- ant-optional-1.4.1.jar
+-- jsse
|-- distribution
`-- jars
|-- jsse.jar
|-- jcert.jar
`-- jnet.jar
本地Repository布局
应该有一个接口集合的紧凑实现使本地repository目录l构更加随意一些。现在我只?了一个类来实玎ͼ昑־有些臃肿。我q是认ؓ本地和远Erepositories应保持相同的l构 但是Z使用更乐于用,我开始设计一些接口,用于满用户自己安排自己本地Repository 布局Q相似的q程Repositor也在设计中。尽目前本地repository仍与q程repository 完全一_我希望听到更多的用户反馈Q以促进q些接口的开发,或者完全抛弃它?
生成目站点
Maven可以为项目生一个完成的web站点。这个web站点包含各U各栗由许多Maven插g 产生的报告,如javadocsQ代码度量,单元试QchanglogQ及其它... 本节文档接下来的 部分阐qMaven支持的站点定刉项?
颜色
考虑C致性,~省情况下,所有Maven产生的站炚w使用怼的外观。这使用户一眼就?认出由Maven产生的站点,产生熟悉的感觉,更加方便信息的获取。当ӞMaven开发组?考虑到用户可能会希望定制他们的站炏V修改Maven产生的站点,最单的Ҏ是指定你?使用的颜色搭配。这只需要在project.properties单的讄适当的属?卛_。下面是所有可用的属性描q在 xdoc plugin?
风格
如果你感觉颜色太q于单,无法满你的要求Q你可以用自qstylesheet。ؓ了重??{basedir}/xdocs/stylesheets/中的maven.css stylesheetQ你可以通过讄maven.javadoc.stylesheet 属性来指定你的 javadoc风格?
报告
最后,如果你希望定制哪些报告需要自动生,你需要在你的目描述中包?reports 标签库?到目前ؓ止,如果没有reports标签指定Q所有插件报告都会生。这个标{?允许你选择产生哪些报告而排斥另外一些报告,而且允许你安排顺序?
目前的标?报告集在xdoc中是编码实现的Q它们是Q?
maven-changelog-plugin
maven-changes-plugin
maven-checkstyle-plugin
maven-developer-activity-plugin
maven-file-activity-plugin
maven-javadoc-plugin
maven-jdepend-plugin
maven-junit-report-plugin
maven-jxr-plugin
maven-license-plugin
maven-linkcheck-plugin
maven-pmd-plugin
maven-tasklist-plugin
如果你希望生缺省的报告Q但是还惛_加或删除一两个Q最好的Ҏ是:l?xdoc:register-reports目标写一个前|目?postGoal)?br />
排除所有Maven产生的内?/a>
某些情况下,用户需要构建只有文档的站点Q或是构合许多子目的站点,但不希望 在站点上有个整体“目文档”D条。设|?maven.xdoc.includeProjectDocumentation属性gؓno 卛_解决q一问题。缺省的QMaven会包?#8220;目文档”D条,下面挂的是许多Maven 生成的报告?"
maven工程产生Q?br /> mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
文档产生Q?br />
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
-DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-site
格式(大概)如下
project
modelVersion使用pom的版本号
groupId lID 如org.apache.maven.plugins或com.sourceware
artifactId cM工程名unique
packaging打包(jar或war,ear由artifactId的extension?br />
version该工E的版本?br />
name昄名称在文档里
url url在文档里
description描述在文档里
更详l的见maven.htm(?
mvn的命令在maven-command.htm?/p>
MAVEN与ANT整合如下
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>my-test-app</artifactId>
<groupId>my-test-group</groupId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<configuration>
<tasks>
<!--
Place any ant task here. You can add anything
you can add between <target> and </target> in a
build.xml.
-->
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
So a concrete example would be something like the following:
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>my-test-app</artifactId>
<groupId>my-test-group</groupId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<configuration>
<tasks>
<exec
dir="${basedir}"
executable="${basedir}/src/main/sh/do-something.sh"
failonerror="true">
<arg line="arg1 arg2 arg3 arg4" />
</exec>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
声明:本节内容来源?a href="http://www.aygfsteel.com/jbob/" target="_top">blogjava|站jbob的blog 本节的版权归原作者所有,不适用本手册的版权x?/em>
maven是一个java目理工具Q深化了antQ但又有自己一整套的项目集成策略。目前的版本?.0.2?
maven|站 下蝲maven2Q解压羃
配置环境变量:maven_home、path
cmd-> mvn --version 查是否安装成?[昄版本P则说明安装成功]
配置,Maven的配|分Z个层?
- pom.xml:针对某个目的配|?/p>
Installation
User -针对某个用户的配|?/p>
我们首先配置主要是userU别的,主要包括两点:讄本地的资源库和代理服务器[如果需要的话] ?maven_home%/conf/setting.xml中配|?
<localRepository>d:/repo</localRepository>
<proxy>
<id>proxy1</id>
<active>true</active>
<protocol>http</protocol>
<username></username>
<password></password>
<host>222.136.91.1</host>
<port>80</port>
<nonProxyHosts></nonProxyHosts>
</proxy>
修改之后copy一份到${home}/.m2
建立新的目
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
首先Q程序会从远E下载必要的jar包到你的localRepository,x们刚刚设|的[d:/repo]
然后Q会在当前目录下面生成my-app文g夹,包括单的包结构[java,test]和一个HelloWorldE序及测?以及pom.xml文g?
注意Qpom.xml contains the Project Object Model (POM) for this project.The POM is the basic unit of work in Maven?
~译
mvn compile
W一ơ运行会下蝲很多jar?而且机器负荷会很重。运行这个命令需要在pom.xml相同目录下面, q个~译只编译主E序Q不会编译test下面的程序。如果需要单独编译test,误行:
mvn test-compile
compile之后会生成target文g夹,ȝ序编译在classes下面Q测试程序放在test-classes?/p>
试
mvn test
会自动先~译再运行测?/p>
打包
mvn package
打包之前会进行编译,试
安装
mvn install
会将package之后的jar包copy?/p> <local-repository>/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar
其他
mvn site
注意,q可?
deploy site
在pom.xml中加?/p>
<distributionManagement>
<site>
<id> website </id>
< url> scp://www.mycompany.com/www/docs/project/ </url>
</site>
</distributionManagement>
当然你需要设|server
mvn site-deploy
mvn clean
mvn idea:idea [为IDE工具idea生成目文g]
Resource
${basedir}/src/main/resources都会~译到jar文g?而且该目录下的内容将直接位于jar文g的顶部?/p>
试用资源文?> ${basedir}/src/test/resourcesQ引用时如下例:
InputStream is = getClass().getResourceAsStream( "/test.properties" );
文g位于 ${basedir}/src/test/resources/test.properties?/p>
如何filter我们的资源文?/p>
< build >
< resources >
< resource >
< directory > src/main/resources </ directory >
< filtering > true </ filtering >
</ resource >
</ resources >
</ build >
因ؓ原来默认的filter为false所以要加上上面的代?/p>
eg:我们在src/main/resources下面建立application.properties文g
# application.properties
application.name=${pom.name}
application.version=${pom.version}
q行Qmvn process-resources 在target/classes下面的application.propertiesl果为:
# application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT
q就是所谓的filter。当然filterq可以用其他的外部文Ӟ不一定来自pom.xml[ ${pom.name} ]以及setting.xml[ ${settings.localRepository }]
e.g src/main/filters/filter.properties:
# filter.properties
my.filter.value=hello!
pom.xml:
< build >
< filters >
< filter > src/main/filters/filter.properties </ filter >
</ filters >
< resources >
< resource >
< directory > src/main/resources </ directory >
< filtering > true </ filtering >
</ resource >
</ resources >
</ build >
# application.properties
application.name=${pom.name}
application.version=${pom.version}
message=${my.filter.value}
q样在运行mvn process-resources 会得到类似的效果,当然我们也可以直接在pom.xml中定义:
< build >
< resources >
< resource >
< directory > src/main/resources </ directory >
< filtering > true </ filtering >
</ resource >
</ resources >
</ build >
< properties >
< my .filter.value > hello </ my.filter.value >
</ properties >
效果同样Q这样就不需要外部文件了。另外filterq可以来自系l设|以及可以自定义Q?/p>
# application.properties
java.version=${java.version}
command.line.prop=${command.line.prop}
jar包依?/p>
我们在mvn install后在local repo中生成的jar包也可以被其他项目所引用
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
注意scope,q里是compile,如果使用junitQscope是test?/p>
举例说明Q如果我们的project需要用到log4j包,那么我们可以 先google--"site:www.ibiblio.org maven2 log4j"。Index of /maven2/log4j/log4j 下面有maven-metadata.xml 描述了groupId,artifactId,version{等。获取了q些信息之后Q你 可以在pom.xml中添加依?/p>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
<scope>compile</scope>
</dependency>
如何发布我的jar包到我的remote repository
你需要在setting.xml中间讄server:
<servers>
<server>
<id>mycompany-repository</id>
<username>jvanzyl</username>
<!-- Default value is ~/.ssh/id_dsa -->
<privateKey>/path/to/identity</privateKey>
<passphrase>my_key_passphrase</passphrase>
</server>
</servers>
然后在pom.xml中设|远Eurl:
<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>
你可以从http://m2eclipse.codehaus.orgupdate安装Maven2的Eclipse插gQ具?安装步骤L该网站提供的Flash Demo: http://m2eclipse.codehaus.org/Installing_Maven_2.0_plugin_for_Eclipse.html
该插件的使用L该网站提供的Flash Demo: http://m2eclipse.codehaus.org/Maven_2.0_Plugin_for_Eclipse.html
关于openfan目的Maven操作请参看后l章节?/p>
Project - pom.xmlQ针Ҏ个项目的配置
Installation
User -针对某个用户的配|?br />
修改之后copy一份到${home}/.m2 [最新版本不需要此步骤]
当然你需要设|server
mvn site-deploy
mvn clean
mvn idea:idea [为IDE工具idea生成目文g]
Resource
${basedir}/src/main/resources都会~译到jar文g?br />
?{basedir}/src/main/resources 下的内容会直接位于jar文g的顶?br />
试用资源文?> ${basedir}/src/test/resources
引用时参照此例:
InputStream is = getClass().getResourceAsStream( "/test.properties" );
文g位于 ${basedir}/src/test/resources/test.properties?/p>
如何filter我们的资源文?br /> 在pom.xml中修改:
因ؓ原来默认的filter为false所以要加上上面的代?br />
e.g
我们在src/main/resources下面建立application.properties文g
# application.properties
application.name=${pom.name}
application.version=${pom.version}
q行Qmvn process-resources
在target/classes下面Q?br />
application.properties:
# application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT
q就是所谓的filter.
当然filterq可以用其他的外部文Ӟ不一定来自pom.xml[ ${pom.name} ]以及setting.xml[ ${settings.localRepository }]
e.g
src/main/filters/filter.properties
# filter.properties
my.filter.value=hello!
pom.xml
# application.properties
application.name=${pom.name}
application.version=${pom.version}
message=${my.filter.value}
q样在运行mvn process-resources 会得到类似的效果?/p>
当然我们也可以直接在pom.xml中定义:
效果同样Q这样就不需要外部文件了
另外filterq可以来自系l设|以及可以自定义Q?br />
# application.properties
java.version=${java.version}
command.line.prop=${command.line.prop}
使用maven2 构徏 Webapp应用E序
Z以下框架Q?br />
spring,hibernate,webwork.2.2.2
1. mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
2. dmain/java test/java 文g?br />
3. 构徏pom.xml.d相关依赖Q?br />
注意以下几点Q?br />
spring:使用id:org.springframework
hibernate: org.hibernate
中途会出现错误。因为jta下蝲不到Q因为licenese的原?br />
jta需要自׃载:java.sun.com/products/jta
下蝲回来?使用jar命o打包 攑ֈ本地Repo?br />
4.配置pom
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
<testResource>
<directory>src/main/webapp</directory>
<includes>
<include>**/*.xml</include>
</includes>
</testResource>
</testResources>
5.我们用到了jetty6来自动化部v
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty6-plugin</artifactId>
<version>6.0.0beta14</version>
</plugin>
</plugins>
mvn package 之后可以mvn jetty6:run
启动之后Q可以在另一个进E mvn compile.冒死可以热交?br />
在mvn jetty6:run的console Ctrl+c可以停止q程
Q?文g攄位置Q?br />
resource/ Q?br />
log4j.xml ,webwork相关Qehcache.xml, spring配置文g的properties文gQ比如jdbc.properties
webapp/web-inf Q?br />
applicationContext,web.xml
hbm攑֜java里面
7. 其他相关
在webwork2.2中,不再需要通过ActionAutoWiringInterceptor来给Action注入Spring的bean(q种方式仍然保留在xwork1.1?Q改用了另一U更加方便的方式WebWorkSpringObjectFactoryQ配|方式如下:
在webwork.properties中加入如下配|内容:
webwork.objectFactory=spring
#以下配置可?br />
#webwork.objectFactory.spring.autoWire=nameq样可以了Q?br />
在Action中声明需要某Spring beanQ就会自动注入进来?/p>
autowire的方式有四种QnameQtypeQautoQconstructorQ默认方式是nameQautowire语义是Spring的语?br />
另外不推荐用spring理action
使用maven2 构徏 Webapp应用E序
Z以下框架Q?br />
spring,hibernate,webwork.2.2.2
1. mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
2. dmain/java test/java 文g?br />
3. 构徏pom.xml.d相关依赖Q?br />
注意以下几点Q?br />
spring:使用id:org.springframework
hibernate: org.hibernate
中途会出现错误。因为jta下蝲不到Q因为licenese的原?br />
jta需要自׃载:java.sun.com/products/jta
下蝲回来?使用jar命o打包 攑ֈ本地Repo?br />
4.配置pom
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
<testResource>
<directory>src/main/webapp</directory>
<includes>
<include>**/*.xml</include>
</includes>
</testResource>
</testResources>
5.我们用到了jetty6来自动化部v
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty6-plugin</artifactId>
<version>6.0.0beta14</version>
</plugin>
</plugins>
mvn package 之后可以mvn jetty6:run
启动之后Q可以在另一个进E mvn compile.冒死可以热交?br />
在mvn jetty6:run的console Ctrl+c可以停止q程
Q?文g攄位置Q?br />
resource/ Q?br />
log4j.xml ,webwork相关Qehcache.xml, spring配置文g的properties文gQ比如jdbc.properties
webapp/web-inf Q?br />
applicationContext,web.xml
hbm攑֜java里面
7. 其他相关
在webwork2.2中,不再需要通过ActionAutoWiringInterceptor来给Action注入Spring的bean(q种方式仍然保留在xwork1.1?Q改用了另一U更加方便的方式WebWorkSpringObjectFactoryQ配|方式如下:
在webwork.properties中加入如下配|内容:
webwork.objectFactory=spring
#以下配置可?br />
#webwork.objectFactory.spring.autoWire=nameq样可以了Q?br />
在Action中声明需要某Spring beanQ就会自动注入进来?/p>
autowire的方式有四种QnameQtypeQautoQconstructorQ默认方式是nameQautowire语义是Spring的语?br /> 另外不推荐用spring理action
声明:本节内容来源?a href="http://www.aygfsteel.com/jbob/" target="_top">blogjava|站jbob的blog 本节的版权归原作者所有,不适用本手册的版权x?/em>
maven是一个java目理工具Q深化了antQ但又有自己一整套的项目集成策略。目前的版本?.0.2?
maven|站 下蝲maven2Q解压羃
配置环境变量:maven_home、path
cmd-> mvn --version 查是否安装成?[昄版本P则说明安装成功]
配置,Maven的配|分Z个层?
- pom.xml:针对某个目的配|?/p>
Installation
User -针对某个用户的配|?/p>
我们首先配置主要是userU别的,主要包括两点:讄本地的资源库和代理服务器[如果需要的话] ?maven_home%/conf/setting.xml中配|?
<localRepository>d:/repo</localRepository>
<proxy>
<id>proxy1</id>
<active>true</active>
<protocol>http</protocol>
<username></username>
<password></password>
<host>222.136.91.1</host>
<port>80</port>
<nonProxyHosts></nonProxyHosts>
</proxy>
修改之后copy一份到${home}/.m2
建立新的目
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app
首先Q程序会从远E下载必要的jar包到你的localRepository,x们刚刚设|的[d:/repo]
然后Q会在当前目录下面生成my-app文g夹,包括单的包结构[java,test]和一个HelloWorldE序及测?以及pom.xml文g?
注意Qpom.xml contains the Project Object Model (POM) for this project.The POM is the basic unit of work in Maven?
~译
mvn compile
W一ơ运行会下蝲很多jar?而且机器负荷会很重。运行这个命令需要在pom.xml相同目录下面, q个~译只编译主E序Q不会编译test下面的程序。如果需要单独编译test,误行:
mvn test-compile
compile之后会生成target文g夹,ȝ序编译在classes下面Q测试程序放在test-classes?/p>
试
mvn test
会自动先~译再运行测?/p>
打包
mvn package
打包之前会进行编译,试
安装
mvn install
会将package之后的jar包copy?/p> <local-repository>/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar
其他
mvn site
注意,q可?
deploy site
在pom.xml中加?/p>
<distributionManagement>
<site>
<id> website </id>
< url> scp://www.mycompany.com/www/docs/project/ </url>
</site>
</distributionManagement>
当然你需要设|server
mvn site-deploy
mvn clean
mvn idea:idea [为IDE工具idea生成目文g]
Resource
${basedir}/src/main/resources都会~译到jar文g?而且该目录下的内容将直接位于jar文g的顶部?/p>
试用资源文?> ${basedir}/src/test/resourcesQ引用时如下例:
InputStream is = getClass().getResourceAsStream( "/test.properties" );
文g位于 ${basedir}/src/test/resources/test.properties?/p>
如何filter我们的资源文?/p>
< build >
< resources >
< resource >
< directory > src/main/resources </ directory >
< filtering > true </ filtering >
</ resource >
</ resources >
</ build >
因ؓ原来默认的filter为false所以要加上上面的代?/p>
eg:我们在src/main/resources下面建立application.properties文g
# application.properties
application.name=${pom.name}
application.version=${pom.version}
q行Qmvn process-resources 在target/classes下面的application.propertiesl果为:
# application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT
q就是所谓的filter。当然filterq可以用其他的外部文Ӟ不一定来自pom.xml[ ${pom.name} ]以及setting.xml[ ${settings.localRepository }]
e.g src/main/filters/filter.properties:
# filter.properties
my.filter.value=hello!
pom.xml:
< build >
< filters >
< filter > src/main/filters/filter.properties </ filter >
</ filters >
< resources >
< resource >
< directory > src/main/resources </ directory >
< filtering > true </ filtering >
</ resource >
</ resources >
</ build >
# application.properties
application.name=${pom.name}
application.version=${pom.version}
message=${my.filter.value}
q样在运行mvn process-resources 会得到类似的效果,当然我们也可以直接在pom.xml中定义:
< build >
< resources >
< resource >
< directory > src/main/resources </ directory >
< filtering > true </ filtering >
</ resource >
</ resources >
</ build >
< properties >
< my .filter.value > hello </ my.filter.value >
</ properties >
效果同样Q这样就不需要外部文件了。另外filterq可以来自系l设|以及可以自定义Q?/p>
# application.properties
java.version=${java.version}
command.line.prop=${command.line.prop}
jar包依?/p>
我们在mvn install后在local repo中生成的jar包也可以被其他项目所引用
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
注意scope,q里是compile,如果使用junitQscope是test?/p>
举例说明Q如果我们的project需要用到log4j包,那么我们可以 先google--"site:www.ibiblio.org maven2 log4j"。Index of /maven2/log4j/log4j 下面有maven-metadata.xml 描述了groupId,artifactId,version{等。获取了q些信息之后Q你 可以在pom.xml中添加依?/p>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
<scope>compile</scope>
</dependency>
如何发布我的jar包到我的remote repository
你需要在setting.xml中间讄server:
<servers>
<server>
<id>mycompany-repository</id>
<username>jvanzyl</username>
<!-- Default value is ~/.ssh/id_dsa -->
<privateKey>/path/to/identity</privateKey>
<passphrase>my_key_passphrase</passphrase>
</server>
</servers>
然后在pom.xml中设|远Eurl:
<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>
你可以从http://m2eclipse.codehaus.orgupdate安装Maven2的Eclipse插gQ具?安装步骤L该网站提供的Flash Demo: http://m2eclipse.codehaus.org/Installing_Maven_2.0_plugin_for_Eclipse.html
该插件的使用L该网站提供的Flash Demo: http://m2eclipse.codehaus.org/Maven_2.0_Plugin_for_Eclipse.html
关于openfan目的Maven操作请参看后l章节?/p>
<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.oreilly</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</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>
</project>
<build>
<finalName>PromoteC</finalName>
</build>
<dependency>
<groupId>quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.5.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www.ibiblio.org/maven/</url>
</repository>
<repository>
<id>PlanetMirror</id>
<name>Planet Mirror</name>
<url>http://public.planetmirror.com/pub/maven/</url>
</repository>
</repositories>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.oreilly</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>my-app</artifactId>
<packaging>pom</packaging>
<modules>
<module>Common</module>
<module>Utilities</module>
<module>Application</module>
<module>WebApplication</module>
</modules>
</project>
<dependencies>
<dependency>
<groupId>com.oreilly</groupId>
<artifactId>Common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.oreilly</groupId>
<artifactId>Common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.oreilly</groupId>
<artifactId>Utilities</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.oreilly</groupId>
<artifactId>Common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.oreilly</groupId>
<artifactId>Utilities</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.oreilly</groupId>
<artifactId>Application</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<parent>
<groupId>com.oreilly</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</plugin>
</plugins>
</reporting>