简介
maven是一个基于POM(Project Object Model)的项目管理工具,可以类比c/c++中的make, Java中的ant。因为在学校一般做的项目都比较小,所以很少有机会能用到这些项目管理工具,但是到公司这些项目管理工具用到的是很多的。
quick-start
创建第一个maven项目
通过command-tool创建
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -X
其中-X选项打开调试信息
可能会发现该命令阻塞在generating project in batch mode. 通过debug信息发现试图下载http://repo.maven.apache.org/maven2/archetype-catalog.xml,可以通过wget http://repo.maven.apache.org/maven2/archetype-catalog.xml手动下载该文件,并添加到.m2\repository\org\apache\maven\archetype\archetype-catalog\2.2下面,然后添加-DarchetypeCatalog=local变成读取本地catalog.xml文件。
创建项目后可以发现maven项目结构图如下:
通过eclipse创建
安装maven插件,New->Maven Project,然后填写groupId, artifactId等信息
编译和运行maven项目
mvn 提供了phase和goal来表示要通过mvn实现的操作。
其中phase表示build整个阶段中的某一步,可以类比c中的预处理->汇编->编译->链接->加载->运行。默认的phase有package, install, deploy。每个phase又有许多sub phases。指定一个phase则该phase之前的phase也将全部执行。
mvn package是将maven项目打包(jar包,war包等)。之前的validate, compile等phase也将运行。
goal表示要通过mvn做的事请,比如package, build等,可以类比make中的target, ant中的task。phase也可以看做一个goal。
goal还可以通过各种maven的plugin来实现。这也是maven真正强大的地方。比如说apache-jetty-plugin实现了与jetty相关的goal,比如jetty:run
。一个maven plugin可以看做goal的集合,服务于特定项目,如jboss的maven plugin。
mvn package
将maven项目打包,会发现在target目录下出现了许多文件,其中有一个my-app-1-SNAPSHOT.jar就是打包之后的结果。
通过java -cp target/my-app-1-SNAPSHOT.jar
com.mycompany.app.my_app.App运行程序。
mvn clean
将清除target中由build产生的文件。可以类比make clean
Maven Getting Started Guide
如何创建JAR并且安装到local repository
mvn package
mvn install
这样会将生成的jar包安装到~/.m2/repository的本地仓库中去,这样下次就可以在dependencies中使用该jar包了。
maven在查找依赖时首先会到local repository中去查找,如果找不到才会去remote repository中去查找,默认的远程仓库为 http://repo.maven.apache.org/maven2/。也可以更改远程仓库为(可能是公司内部的中心仓库)
mvn site会为项目产生一个site以提供一些基本信息
mvn idea:idea
mvn eclipse:eclipse
这两条命令会为将项目构建为便于IntelliJ IDEA和Eclipse加载
插件的使用
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
...
插件将会自动下载和使用
配置依赖关系
一个依赖一般由四个关键元素确定,groupId, artifactId, version和scope
如何查看一个以来的这些属性呢,以log4j为例。
使用Google搜索site:www.ibiblio.org maven2 log4j,在/maven2/log4j/log4j目录中查看maven-metadata.xml文件,it may looks like:
<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>
如何将jar包发布到remote repository
要在pom.xml中配置remote repository的url,在setttings.xml配置连接到remote repository的authentication信息。
实例如下:
<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>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Maven Quick Start Archetype</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>1.0.4</version>
</dependency>
</dependencies>
<build>
<filters>
<filter>src/main/filters/filters.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<!--
|
|
|
-->
<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>
</project>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
...
<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>
pom.xml中<distributionManagement>
中配置repository,其中id要和settings.xml中的server的id相一致。