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"