Maven是款对项目进行编译、发布管理工具,尤其适用于多个项目的管理。
Maven的安装
下载Maven压缩文件,解压缩后,在环境变量Path中配置Maven bin的目录路径。
创建例子
1.用如下命名在当前目录下创建名为my-app的项目(命令需写在一行上)
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=my-app
2.在my-app下可以看到Maven创建的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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</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>
project: pom.xml的最顶端元素;
modelVersion: Project Object Model(POM)的本版号;
groupId:指定项目的唯一标识;
artifactId:指定创建包(如jar)文件的名称,一般由<artifactId>-<version>组成;
packageing:指定包的类型(jar,war等),默认是jar;
version:指定创建包的本版号;
name:为项目指定的名称,用在项目文档中;
url:用于Maven创建的项目文档的网站地址;
pom.xml的文件定义,查看http://maven.apache.org/xsd/maven-4.0.0.xsd
3.Maven创建的文档结构图如下:
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
4.mvn compile 命令对该项目进行编译,第一次编译时,maven需要从远程库中下载一些插件和包,缓存在本地目录中(默认C:\Documents and Settings\Administrator\.m2),方便下次编译不用重新下载
mvn test 运行项目下的测试用例,默认情况下满足测试用例命名的java文件都会被测试到:
例如:
**/*Test.java
**/Test.java
**/*TestCase.java
但下面的测试用例会被排除在外
**/Abstract*Test.java
**/Abstract*TestCase.java
mvn package 命令对项目打包,由packaging指定类型
mvn install 命令将打包的文件安装在本地库中
mvn site 命令创建项目的文档
mvn clean 命令清除项目编译打包文件
mvn eclipse:eclipse 命令为项目创建eclipse的配置文件,如.project,.classpath
maven对项目的编译和发布建立在明确定的编译生命周期中,编译生命周期有三中,default, clean, site
default负责项目的编译和发布;clean负责项目的清理;site负责为项目产生文档;
参考:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
一个生命周期由多个片段组成,比如default生命周期有
- validate - validate the project is correct and all necessary information is available
- compile - compile the source code of the project
- test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
- package - take the compiled code and package it in its distributable format, such as a JAR.
- integration-test - process and deploy the package if necessary into an environment where integration tests can be run
- verify - run any checks to verify the package is valid and meets quality criteria
- install - install the package into the local repository, for use as a dependency in other projects locally
- deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
default生命周期按照上面的片段顺序执行;通过packaging,plugin等来设置生命周期。
5.设置插件
当需要自定义编译项目时,可以通过设置插件完成,如:配置JDK5.0编译java代码,插件列表:http://maven.apache.org/plugins/
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
...
6.通过设置改变maven的默认的目录结构
<build>
...
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<!- TODO: MNG-3731 maven-plugin-tools-api < 2.4.4 expect this to be relative... ->
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
...
</build>
7.引用外部类
maven通过在库http://repo1.maven.org/maven2/ 中下载包到本地缓存库,通过查看
maven-metadata.xml确定引用包的groupId, artifactId和version,例如:
<metadata>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.1.3</version>
<versioning>
<versions>
<version>1.1.3</version>
<version>1.2.4</version>
<version>1.2.5</version>
<version>1.2.6</version>
<version>1.2.7</version>
<version>1.2.8</version>
<version>1.2.11</version>
<version>1.2.9</version>
<version>1.2.12</version>
</versions>
</versioning>
</metadata>
引用包可以通过scope元素指定使用范围,比如test,compile,runtime。指定test的包文件不会编译到项目的lib中。远程库中找不到的包文件,需手动下载该包,再安装到本地库中,或者发布到自己定义的远程库中,命令如下:
mvn install:install-file -DgroupId=ehcache -DartifactId=ehcache -Dversion=1.5.0 -Dpackaging=jar -Dfile=path\to\file
mvn deploy:deploy-file -DgroupId=javax.activation -DartifactId=activation -Dversion=1.0.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]
8.创建webapp项目 (命名写在一行)
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.mycompany.app -DartifactId=my-webapp
查看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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>my-webapp</finalName>
</build>
</project>
查看文件目录结构
+- pom.xml
+- my-app
| +- pom.xml
| +- src
| +- main
| +- java
+- my-webapp
| +- pom.xml
| +- src
| +- main
| +- webapp
mvn package 命令将webapp项目打成一个war包,存放在target目录下。
要修改webapp的目录结构,可以通过war插件如下:
<plugins>
…
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-beta-1</version>
<configuration>
<webResources>
<resource>
<directory>web</directory>
<excludes>
<exclude>*/.jar</exclude>
<exclude>*/.class</exclude>
</excludes>
</resource>
</webResources>
</configuration>
</plugin>
...
</plugins>
11.编译多个项目
创建如下的项目目录:
+- pom.xml
+- my-app
| +- pom.xml
| +- src
| +- main
| +- java
+- my-webapp
| +- pom.xml
| +- src
| +- main
| +- webapp
最上面的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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>app</artifactId>
<packaging>pom</packaging>
<modules>
<module>my-app</module>
<module>my-webapp</module>
</modules>
</project>
在my-webapp项目中添加my-app的jar引用
...
<dependencies>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>
在my-app 和my-webapp项目中的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/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
...
运行命令mvn clean package,将my-app和my-webapp打包,并且在my-webapp包中引用my-appd的jar包。
如果两个项目的文件结构如下:
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
子项目应该用 <relativePath>元素指定,相对于子项目pom.xml路径
<project>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>my-module</artifactId>
</project>
父项目的pom.xml文件应该为,相对父项目pom.xml路径
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
<packaging>pom</packaging>
<modules>
<module>../my-module</module>
</modules>
</project>
3.配置远程资源库
远程资源库可以是http服务器,或者文件服务器等,参考文档http://maven.apache.org/guides/introduction/introduction-to-repositories.html
以下创建http服务器的资源库
1)下载安装Apache;
2)修改Apache的默认根目录 如:
DocumentRoot "E:/repository"
同时修改
<Directory "[E:/repository|../repository|\||]">
…
</Directory>
3)可以自定义目录列表的结构
Options Indexes
#Options Indexes FollowSymLinks
#显示文件大小,修改时间, NameWidth=*指定显示文件长度不受限制
IndexOptions FancyIndexing NameWidth=*
#指定按照修改日期排序(升序)
IndexOrderDefault Ascending Date
5)web服务器创建好后,通过http://localhost访问成功;
4)在pom.xml文件中添加资源库
<project>
...
<repositories>
<repository>
<id>my-internal-site</id>
<url>http://myserver/repo</url>
</repository>
</repositories>
...
</project>
发布到远程资源库
1)建立ftp站点
用ftp工具如:Apache ftpserver建立ftp站点,下面以ftpserver为例进行配置:
a)下载Apache ftpserver后,解压缩;
b) 解压缩后的目录在res\conf下有ftp的站点的配置文件,修改users.properties中的帐号访问的目录地址如: [E:/repository;|../../repository|\||]
c)在命令窗口中指向bin目录:执行ftpd.bat res/conf/ftpd-typical.xml,启动ftp站点服务;
d)通过ftp://localhost:2121访问ftp站点,测试通过;
e)在pom.xml文件中添加
<distributionManagement>
<!- use the following if you're not using a snapshot version. ->
<repository>
<id>repository</id>
<name>internal-site</name>
<url>ftp://192.168.22.159:2121</url>
</repository>
</distributionManagement>
f)在build标签下添加
...
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-6</version>
</extension>
</extensions>
...
g)在conf/setting.xml中,配置server,如:
<serers>
…
<server>
<id>repository</id>
<username>admin</username>
<password>admin</password>
</server>
…
</servers>
h)通过mvn deploy:deploy-file -DgroupId=javax.activation -DartifactId=activation
-Dversion=1.0.2 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=
[id]发布资源(例如:mvn deploy:deploy-file -DgroupId=com.hc360 -DartifactId=mmtlogutils -Dversion=1.0 -Dpackaging=jar -Dfile=D:\workspace\mmtlogutils\target\mmtlogutils.jar -Durl=ftp://localhost:2121/ -DrepositoryId=repository)
安装m2eclipse插件
1)m2eclipse插件更新地址:http://m2eclipse.sonatype.org/update/
2)修改eclipse.ini文件,添加-vm 如:
-showsplash
com.genuitec.myeclipse.blue.product.ide
--launcher.XXMaxPermSize
256m
-vm
"C:\Program Files\Java\jdk1.5.0_02\bin\javaw.exe"
-vmargs
-Xms128m
-Xmx512m
-Duser.language=en
-XX:PermSize=128M
-XX:MaxPermSize=256M
3)创建eclipse的快捷方式,设置目标-vm如:
"C:\Program Files\MyEclipse 6.5M1 Blue\eclipse\eclipse.exe" -vm "C:\Program Files\Java\jdk1.5.0_02\bin\javaw.exe"