1.Maven的安装1.1Windows 2000/xp下的安装
1. 解压缩maven-2.0.2-bin.zip到你希望安装Maven 2.0.2的所在目录。这里假设你选择了C:/ProgramFiles/Apache Software Foundation/maven-2.0.2. 2. 将C:/Program Files/Apache Software Foundation/maven-2.0.2/bin目录加入到你的%path%环境变量中。 3. 同时,确认JAVA_HOME是否正确设置成功。 4. 运行 mvn --version 确认是否安装成功。 显示Maven version: 2.0.2 则表示安装成功。 1.2基于Unxi-based的操作系统(Linux,Solaris and Mac OS X)
1. 解压缩发布包到你希望安装Maven 2.0.2的所在目录。这里假设你选择了/usr/local/maven- 2. 将/usr/local/maven-2.0.2/bin目录加入到你的path环境变量中,例如:PATH=/usr/local/maven-2.0.2y/bin: $PATH。 3. 同时,确认JAVA_HOME是否正确设置成功。 4. 运行 mvn --version 确认是否安装成功。 显示Maven version: 2.0.2 则表示安装成功。 2.Maven2.0的一些优点:
--标准的项目布局和项目结构生成器 --标准的依赖管理机制 2.1项目标准化(提供预定义的目录模板)
Maven一个重要特性是定义了项目的标准模板,官方说法是最佳实践。好的目录结构可以使开发人员更容易理解项目,为以后的维护工作也打下良好的基础。Maven2根据业界公认的最佳目录结构,为开发者提供了缺省的标准目录模板。Maven2的标准目录结构如下: 使用目录模板,可以使pom.xml更简洁。因为Maven2已经根据缺省目录,预定义了相关的动作,而无需人工的干预。以resources目录为例:
可以通过命令:mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app创建一个单一的maven项目。创建好的项目,具有了特定的项目结构。这个项目结构是参考业界的最佳实践而成,为后面使用统一的maven命令打下了基础,如测试mvn test、打包mvn package(在打包时需要指定web.xml,规范的结构可以不用指定)等,无需写一行脚本,就可以方便的实现众多功能。Maven还提供其它一些类型模板,可以通过添加-DarchetypeArtifactId={type}创建,如-DarchetypeArtifactId=maven-archetype-site,生成site类型的项目。 有了这个标准,项目间能方便的进行交流,你也很容易了解其它使用maven项目的结构。对于企业来说,引入maven就自然引入了规范,这可比费时费力的写文档,定规范有效的多了。 2.2文档和报告
使用mvn site可以快速生成项目站点,apache很多开源项目站点都采用maven生成,会出现built by maven字样的图标。 而maven提供的针对如junit,checkstyle,pmd等的插件,能够方便的进行测试和检查并能直接生成报告。使用都很简单,如mvn surefire-report:report 就能自动进行junit测试,并生成junit报告,mvn pmd:pmd生成pmd报告。具体使用可以在http://maven./plugins/index.html找到。 2.3类库管理
Maven一个很重要的特色就是类库管理。通过在pom.xml中定义jar包版本和依赖,能够方便的管理jar文件。以下是一个简单的jar定义片断: <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.1</version> <type>jar</type> <scope>runtime</scope> </dependency> 这个片断告诉我们,依赖的jar包groupId为org.hibernate,artifactId为hibernate,版本为3.1,scope为runtime。在实际项目中,会将M2_REPO(maven本地仓库地址)/ org/hibernate / hibernate /3.1/ hibernate -3.1.jar放入classpath。 同时maven会通过pom.xml管理jar包间的依赖。比如上面的hibernate-3.1.jar同级目录肯定会有一个hibernate -3.1.pom,在这个pom文件中指定了这个jar对其它一些jar的依赖。而这个pom文件是远程仓库提供,无需进行修改,执行maven相关命令就会自动根据相关依赖去下载jar包。这样只需定义对hibernate的依赖而无需关心相关jar,在构建项目上方便了很多。 因为pom文件对jar的管理,也产生了一个很吸引人的特性:项目文件很小。以往一个web项目中,jar文件都要放入WEB-INF/lib下,并放入cvs(svn)中,很容易就达到几十M。而通过maven,只需一个pom.xml,在执行mvn eclipse:eclipse时再去远程仓库下载,项目文件一般只需几百K。 <dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值: compile,缺省值,适用于所有阶段,会随着项目一起发布。 provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。 runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。 test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。 system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。 2.4发布管理
使用maven可以方便的进行项目发表管理。在项目开发到一定阶段,可以使用mvn package打包,它会自动先运行mvn test,跑所有的testcase,只有全部通过才能正确打包。生成的war包(如果项目的packaging为war)在target目录下。这个war包与使用ant脚本生成一样,但无需一行脚本,这也是maven对比ant的优势之一。使用mvn install将编译和打包好的文件发布到distributionManager指定的远程repository。使用mvn deploy可以自动管理项目版本。 3.常用的命令
您可以在Maven安装目录下的conf目录中,或者项目自身中修改Maven远程存储库的选择。POM是“项目对象模型”的缩写。 创建完项目后,我们可以往项目里添加代码并使用Maven的所有全新技巧。注意以下命令必须在pom.xml文件所在的目录中运行。 --mvn deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。 可以通过对目标及相位的组合使得一个命令完成多个功能,比如: mvn clean dependency:copy-dependencies package 关于常用命令的详解,见参考资料。 4.第一个例子
参见《Maven入门--概念与实例》 D:/maven/demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app D:/maven/demo>mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp 此命令与创建app的命令的不同之处是,多设置了一个属性archetypeArtifacttId,该属性的值为maven-archetype-webapp。即告诉Maven,将要创建的工程是一个Web应用工程。创建app工程时没有使用该属性值,是由于archetype默认创建的是应用程序工程。详细的解释及命令参数见http://maven./plugins/ 不用担心如何从WEB-INF/lib目录中得到依赖项,在依赖属性值被设置成compile的情况下,Maven会自动包含依赖项。也可以将以下代码添加到pom.xml文件中来改变war文件的名称: <build> 将本地的存储库放在一台web服务器上也同样是个便利之举,这样整个开发团队就能从此获益,每个人都没有必要去管理自己的存储库了。改变Maven的存储库路径只需简单地编辑其安装目录下conf文件夹下面的settings.xml文件即可。(详情见私服的架设) 5.文档编制
对于如何创建和编制文档,maven有一个简单的示例命令:
执行了以上命令后,我们将得到一个目录结构: 你现在可以看到一个$basedir/src/site目录,以及它包含的一些站点描述文件(site.xml,site_fr_xml),和各种maven支持的文档格式相对应的目录和示例文档都已经产生。 以上的创建只是示例,我们自己创建时就没有命令行使用了,只能按照上面的目录结构创建我们需要的文档,创建完成后,运行mvn site。并在文档中写入我们工程的信息。 关于文档编制的详细说明,见参考资料。 6.依赖管理
一个简单的例子。比如我们要添加一个log4j到我们的工程中。首先.需要了解log4j的groupId, artifactId, and version信息。可在google上搜索“site:www. maven2 log4j”。这样在搜索结果里可以找到/maven2/log4j/log4j (or /pub/packages/maven2/log4j/log4j)这样的目录,在这个目录中有一个文件叫做maven-metadata.xml。根据这个文件可以知道groupId为log4j,artifactId为log4j,version当然要用最新的。scope我们设置为compile。这样我们使用mvn compile 编译工程时,会看到mvn下载了log4j到我们的本地仓库。 7.配置存储库
要求项目的每个开发者必须在conf目录中配置存储库是不方便的,所以Maven可以同时查看多个存储库并且将它们全部配置在pom.xml文件中。让我们看看一个例子,它展示了如何在应用程序用使用多个存储库。在以下从pom.xml文件摘录的片断中,我们设置了两个存储库来让Maven寻找依赖项。Ibiblio一直是默认的存储库,我们又添加了Planet Mirror作为后援存储库。我们也可以让团队使用的本地web服务器作为第二个存储库。 <repositories> <repository> <id>Ibiblio</id> <name>Ibiblio</name> <url>http://www./maven/</url> //此处按实际地址写,也有可能是//http://mirrors./pub/mirrors/maven2/org,看出错报告调整。对于找不到的jar包要写出他的真实路径。 </repository> <repository> <id>PlanetMirror</id> <name>Planet Mirror</name> <url>http://public./pub/maven/</url> </repository> </repositories> 当下载某些jar包时,会自动把相关依赖的包都下载下来。 如下面所示,会自动下载对应文件夹中pom.xml文件上所要求的包。 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jpa</artifactId> <version>2.0</version> <scope>test</scope> //scope为compile时,在执行mvn package时,会将该包拷贝到target/{projectName}/WEB-INF/lib/目录下 </dependency> 若在下载过程中出现java.net.SocketException: Connection reset错误,估计是该连接存在,但是下载不了。换别的网址或换个版本下载吧。若出现Failed to resolve artifact则估计是根本就不存在该连接。查看一下实际下载的地址是否存在。 Maven是基于中央仓库的编译,即把编译所需要的资源放在一个中央仓库里,如jar,tld,pom,等。当编译的时候,maven会自动在仓库中找到相应的包,如果本地仓库没有,则从设定好的远程仓库中下载到本地。这一切都是自动的,而ant需要自己定义了。这个好处导致的结果就是,用maven编译的项目在发布的时候只需要发布源码,小得很,而ant的发布则要把所有的包一起发布,显然maven又胜了一筹。 编译时,出错的测试代码,只能显示到如下程度: Running jp.co.benic.usp.webapp.action.USPJ320ActionTest Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.266 sec <<< FAILURE! Running jp.co.benic.usp.webapp.action.USPJ510ActionTest Tests run: 4, Failures: 0, Errors: 4, Skipped: 0, Time elapsed: 0.515 sec <<< FAILURE! 若想看完整的错误信息,需要到target/surefire-reports目录下,看相关的错误日志文件。 对于在下载jar时,不想下载他所自带的依赖的某些包,可以用<dependency> <exclusions> </dependency>将指定的包过滤掉。 缺点:编译的过程没有日志输出。(手动设置?) 8.私服的架设
自己建个私服是不错的主意。其实也简单,随便拿台http服务器,把${user.home}/.m2/ 目录传上去就行了 <repositories> 9.如何部署jar到自己的远程repository(但因为目前只支持scp这种远程拷贝方法,而不知道如何在windows中使用scp,顾此处没有实现) 在pom.xml中添加如下内容: <distributionManagement> <repository> <id>mycompany-repository</id> <name>MyCompany Repository</name> <url>scp://repository./repository/maven2</url> </repository> </distributionManagement> 同样在用户的settings.xml中也要定义服务器: <settings> <servers> <server> <id>mycompany-repository</id> <username>jvanzyl</username> <!-- Default value is ~/.ssh/id_dsa --> <privateKey>/path/to/identity</privateKey> (default is ~/.ssh/id_dsa) <passphrase>my_key_passphrase</passphrase> </server> </servers> </settings> http://maven./plugins/maven-deploy-plugin/index.html deploy的介绍。deploy:deploy-file从远程仓库安装一个资源;deploy:deploy部署一个资源到远库。程仓 http://maven./plugins/index.html 介绍maven的有效的插件及每个命令都是用来做什么的。 10.如何使用Maven2打包你的Web应用程序?
解决方法: pom.xml的设置: 打包类型设置为“war”: <packaging>war</packaging> 如果项目的layout不是Maven2默认的,可通过修改plugin的配置进行设置,例如WebRoot路径的设置如下: <build> <!-- war包名称 --> <finalName>mywebapp</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <!-- 设置WebContent目录为Web目录 --> <warSourceDirectory>WebContent</warSourceDirectory> </configuration> </plugin> </plugins> </build> 打包命令行:mvn clean:clean package 使用maven2打包时,可以过滤掉不想被打包的文件或文件夹。只要在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> 11.Maven和eclipse工具的合作
当有了以上的工程目录,无论是webapp工程,还是app,我们都希望在集成开发环境中开发。Maven如何和IDE集成。现在我们就来进行讲解。 11.1首先要让eclipse知道Maven 2的repository(仓库)的路径因此要设置一个M2_REPO的变量为classpath。 可以使用命令行的方式来设置:
还可以在eclipse中定义一个新的classpath变量通过在eclipse的菜单上选择Window> Preferences. 选择Java > Build Path > Classpath Variables page. 11.2生成eclipse的工程文件。
使用命令行
这样通过在eclipse的菜单上选择File >Import >Existing Projects into Workspace,就可以将工程导入eclipse中。 通过以上2个步骤,我们就可以利用eclipse来进行开发工作了。 11.3Eclipse插件mavenide
同时在eclipse中我们可以下载一个maven的插件,用来辅助eclipse进行maven工程的开发工作。这个插件名称叫做mavenide。 这个插件可使用以下更新站点:http://m2eclipse./ 并且非常方便的是,这里还提供了一个flash的演示来介绍如何安装此插件,这个flash演示的观看地址在: http://m2eclipse./Installing_Maven_2.0_plugin_for_Eclipse.html 要正常使用此插件请注意以下问题: eclipse使用3.1或以上版本。 Mavenide的插件为0.0.5不要安装错误了。 通过笔者在安装好此插件的一些使用后,看到了此插件的以下一些特性。 1.可以方便的添加依赖。 2.在编辑完pom.xml文档后,会自动检查此文档的格式是否正确。 3.可以将mvn的一些命令通过扩展工具的方式在eclipse中轻松执行。 12.在ANT中使用Maven2
Maven 2.0 中的Ant任务可以利用Maven中的artifact来处理Ant中的功能。 这些包括: 依赖管理-包括传递依赖,范围识别和SNAPSHOT处理; Artifact部署-基于文件和SSH的部署; POM处理-读取Maven 2.0的pom.xml文件。 12.1安装Antlib
把jar包放在%ANT_HOME%的lib目录下面,添加在CLASSPATH中,或是使用-lib命令行参数。 在ant文件的起始添加命名空间: <project ... xmlns:artifact="antlib:org.apache.maven.artifact.ant"> 12.2声明typedef
使用typedef可以把库放在任何位置,并把它的位置放在build文件中。这可以用来在启动的时候获取库,然后在构建脚本中引用它。 下面这个例子中,假设库放在lib目录下面。 <project ... xmlns:artifact="urn:maven-artifact-ant"> <typedef resource="org/apache/maven/artifact/ant/antlib.xml" uri="urn:maven-artifact-ant"> <classpath> <pathelement location="lib/maven-artifact-ant-2.0-beta-1.jar" /> </classpath> </typedef> 12.3声明依赖
通过dependencies任务来声明依赖。 最简单的用法是直接声明: <artifact:dependencies pathId="dependency.classpath"> <dependency groupId="org.apache.maven.wagon" artifactId="wagon-provider-test" version="1.0-alpha-2"/> <dependency groupId="org.codehaus.modello" artifactId="modello-core" version="1.0-alpha-2-SNAPSHOT"/> <dependency groupId="javax.servlet" artifactId="servlet-api" version="2.4" scope="provided" /> </artifact:dependencies> 注意其中的pathId引用,可以用来在其他地方引用。 <javac ...> <classpath refid="dependency.classpath" /> ... </javac> 另外一个是filesetId,,可以用来拷贝文件到某个特定位置。<dependencies filesetId="dependency.fileset" useScope="runtime"> ... </dependencies> <copy todir="${webapp.output}/WEB-INF/lib"> <fileset refid="dependency.fileset" /> <mapper type="flatten" /> </copy> 12.4声明Repositories
所有的任务都可以接受一个或多个远程repositories来下载或是上传,以及一个本地repository来存储下载的文件和安装包。 这些可以直接书写(inline),也可以通过id/refid来重用。 <artifact:remoteRepository id="remote.repository" url="http://repository./" /> ... <artifact:dependencies> ... <remoteRepository refid="remote.repository" /> </artifact:dependencies> 如果repository需要认证,可以提供一个嵌套元素: <authentication username="brett" privateKey="${user.home}/.ssh/id_dsa" /> 12.5安装和部署你自己的artifacts
如果需要在不同的项目之间共享artifacts,可以通过install把它们放在本地的repository以供其他脚本访问,或是通过deploy部署到远程位置。(这部分测试没通过,部署到本地仓库没问题,但部署到远程仓库不好用) 安装和部署的时候需要POM文件。 <artifact:pom id="maven.project" file="pom.xml" /> <artifact:install file="target/maven-artifact-ant-2.0-alpha-3.jar"> <pom refid="maven.project"/> </artifact:install> <artifact:deploy file="target/maven-artifact-ant-2.0-alpha-3.jar"> <remoteRepository url="file://localhost/www/repository"/> <pom refid="maven.project"/> </artifact:deploy> 通过协议而不是本地文件系统部署的话,需要注册其他协议的provider。 <artifact:install-provider artifactId="wagon-ssh" version="1.0-alpha-5"/> <artifact:deploy file="target/maven-artifact-ant-2.0-alpha-3.jar"> <remoteRepository url="scp://localhost/www/repository"> <authentication username="${repository.username}" privateKey="${user.home}/.ssh/id_dsa"/> </remoteRepository> <pom refid="maven.project"/> </artifact:deploy> 12.6使用Maven POM文件
可以在POM中直接定义依赖。 为了把POM作为Ant的属性来访问,需要把它定义为引用。 <artifact:pom id="maven.project" file="pom.xml" /> <echo>The version is ${maven.project.version}</echo> <artifact:pom id="project" file="pom.xml" /> <echo>The version is ${project.build.directory}</echo> 用户的配置文件settings.xml同样可以引用。 13.在Maven2中使用ANT
传说是这样的: http://maven./guides/mini/guide-using-ant.html 具体没有试过。 参考资料
Maven入门--概念与实例 http://www./jiangshachina/archive/2006/09/01/67080.aspx Maven2的官方文档 http://maven./guides/getting-started/index.html#How%20do%20I%20deploy%20my%20site? maven2的pom.xml文件的详细说明。 http://maven./pom.html#The%20Super%20POM maven2的pom.xml文件各元素的详细说明。 http://maven./ref/current/maven-model/maven.html#class_scm maven2的命令详解。 有效利用Maven2的站点生成功能 -- Step by Step http://www./resource/article/44/44491_Maven2.html |
|