maven入门
http://maven.apache.org/guides/index.html
Maven 能够帮助开发者完成以下工作:
构建
文档生成
报告
依赖
SCMs
发布
分发
邮件列表
总的来说,Maven 简化了工程的构建过程,并对其标准化。它无缝衔接了编译、发布、文档生成、团队合作和其他任务。Maven 提高了重用性,负责了大部分构建相关的任务。
Maven 3.3 要求 JDK 1.7 或以上
Maven 3.2 要求 JDK 1.6 或以上
Maven 3.0/3.1 要求 JDK 1.5 或以上
安装
#mac
tar xzvf apache-maven-3.5.0-bin.tar.gz 或
unzip apache-maven-3.5.0-bin.zip
mv apache-maven-3.5.0 ~/Programs/
vi ~/.bash_profile
// <MAVEN-DIR>为你的安装目录---------
export PATH=$PATH:<MAVEN-DIR>/bin
// 然后source 一下profile文件,检查是否安装成功
source ~/.bash_profile
mvn -version
vi ~/.m2/settings.xml
#windows
先安装jdk
解压到个目录
将bin子目录加入到path环境变量
在命令行上mvn -v 测试
简单使用
#交互方式创建项目目录结构
mvn archetype:generate
981: remote -> org.apache.maven.archetypes:maven-archetype-quickstart (-)
选择一个版本 6--1.1
选择groupId,artifactId,version,package
#非交互方式创建
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
mvn -B archetype:generate
-DarchetypeGroupId=org.apache.maven.archetypes
-DgroupId=com.mycompany.app
-DartifactId=my-app
以上命令是使用org.apache.maven.plugins:maven-archetype-plugin:3.0.1:generate创建的
可参考https://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html
#编译
命令行进入到pom.xml文件的目录
mvn compile
使java 编译器来编译项目,可以在pom.xml中指定相关jdk版本
编译好的代码在${basedir}/target/classes目录
#编译测试源码并进行单元测试
Test Driven Development(TDD)
mvn test
#只编译测试代码
mvn test-compile
#生成jar
mvn package
生成的jar 在 ${basedir}/target
#安装到${user.home}/.m2/repository
mvn install
surefire plugin 会按照名字寻找test类
**/*Test.java
**/Test*.java
**/*TestCase.java
默认会排除
**/Abstract*Test.java
**/Abstract*TestCase.java
#关于junit
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
#运行
cd my-app
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
mvn clean dependency:copy-dependencies package
#生成site
mvn site
#清理
mvn clean
会删除target 目录
#生成idea 项目
mvn idea:idea
#生成eclipse项目
mvn eclipse:eclipse
eclipse 中一般默认已经安装好m2eclipse 插件
http://www.eclipse.org/m2e/
#其他
mvn jar:jar
不会重新编译源代码,仅会从target/classes目录创建一个jar
#SNAPSHOT
SNAPSHOT是开发分支的最新代码,并不保证它是stable或者unchanging. 而release 或没有SNAPSHOT后缀的代码表示不会改变了。
换句话说对于x.y-SNAPSHOT 变成x.y 就是release,而新的开发版本应该是x.(y+1)-SNAPSHOT.
plugin
想要定制化build,可以通过添加plugins来完成
以下的例子表示源文件的版本是5.0的,生成的class文件的版本也是5.0的
<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>
maven中的plugin看起来像是a dependency, 它会自动下载并被使用。如果不指定version默认是使用最新版
comfiguration元素应用到compiler plugin的每一个goal.
plugin 列表
http://maven.apache.org/plugins/
配置plugin的说明
http://maven.apache.org/guides/mini/guide-configuring-plugins.html
将resources添加到jar
要使用标准目录结构
http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
src/main/java
src/main/resources
src/main/webapp
src/test/java
src/test/resources
src/it
LICENSE.TXT
NOTICE.TXT
README.TXT
resources中的文件,目录结构会以同样的结构自动加入到jar的根目录
|-- META-INF
| |-- MANIFEST.MF
| |-- application.properties
| `-- maven
| `-- com.mycompany.app
| `-- my-app
| |-- pom.properties
| `-- pom.xml
`-- com
`-- mycompany
`-- app
`-- App.class
下面是pom.properties的内容
version=1.0-SNAPSHOT
groupId=com.jamie
m2e.projectName=test101
m2e.projectLocation=/Users/jamie/Documents/mavenworkspace/test101
artifactId=test101
http://maven.apache.org/guides/getting-started/index.html
filter resource & properties
有时我们需要一个值才build时才知道。这时在resource file中使用${property name>},而这个property 在pom.xml,settings.xml,在外部的properties file,或者a system property
为了使maven在复制时可以filter resources,设置filtering的值为true 在pom.xml的resource目录
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
在resource 文件中引用时如${project.name},${project.version},
${project.build.finalName}
${settings.localRepository}
例如:放在src/main/resources目录中的资源application.properties文件中
有一些占位符
#application.properties
application.name=${project.name}
application.version=${project.version}
在process-resources phase 会copy 并且filter 资源文件
mvn process-resources
这个过程之后,在target/classes 目录下的application.properties文件会看起来这样
#application.properties
application.name=Maven Quick Start Archetype
application.version=1.0-SNAPSHOT
如果属性定义在外部的文件中,要放在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=${project.name}
application.version=${project.version}
message=${my.filter.value}
执行mvn process-resources可以看到target/classes/application.properties中的占位符被替换为filter.properties中的值
properties的定义除了可以放在filter.properties中,也可以放在pom文件的properties section
<properties>
<my.filter.value>hello</my.filter.value>
</properties>
filtering resouces 也可以从system properties中获得值,如java中的java.version,
user.home 或者在mvn的命令行中用了-D 参数的
mvn process-resources "-Dcommand.line.prop=hello again"
使用外部依赖
完整介绍 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
dependency节点有4个属性groupId,artifactId,version,scope
scope的值可以是compile,test,runtime
maven先从local repository(${user.home}/.m2/repository中寻到依赖;如果local repository中不存在,maven会从remote repository中下载到local repository, 默认的remote repository是http://repo.maven.apache.org/maven2/ 可以建立自己的maven私服
可以参考
http://maven.apache.org/guides/introduction/introduction-to-repositories.html
通过google搜索site:www.ibiblio.org maven2 log4j 可以获知log4j的历史版本及最新版本
在mvn compile 阶段完成下载
布署jar到remote repository
在pom.xml中配置那个远程repository的相关信息,如authenticaiton information.
下面的例子是使用scp 和username/password authentication
pom.xml
<distributionManagement>
<repository>
<id>mycompany-repository</id>
<name>MyCompany Repository</name>
<url>scp://repository.mycompany.com/repository/maven2</url>
</repository>
</distributionManagement>
settings.xml
<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>
或
<server>
<id>mycompany-nexus-releases</id>
<username>deployment</username>
<password>12345678</password>
</server>
<server>
<id>mycompany-nexus-snapshots</id>
<username>deployment</username>
<password>12345678</password>
</server>
更多请参考
http://maven.apache.org/guides/mini/guide-encryption.html
创建其他类型的项目
mvn archetype:generate -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.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-webapp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>my-webapp</finalName>
</build>
</project>
mvn clean package
会看到target/my-webapp.war文件创建了
如何一次build多个project
目录结构
+- pom.xml
+- my-app
| +- pom.xml
| +- src
| +- main
| +- java
+- my-webapp
| +- pom.xml
| +- src
| +- main
| +- webapp
父pom
<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>app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>my-app</module>
<module>my-webapp</module>
</modules>
</project>
webapp依赖于my-app生成的一个jar 所以my-webapp/pom.xml 如下
<dependencies>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
...
</dependencies>
在每个子项目的pom.xml中加入parent节点
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
然后在 父目录下
mvn clean install
WAR会被创建在my-webapp/target/my-webapp.war ,其中包含了jar
$ jar tvf my-webapp/target/my-webapp-1.0-SNAPSHOT.war
0 Fri Jun 24 10:59:56 EST 2005 META-INF/
222 Fri Jun 24 10:59:54 EST 2005 META-INF/MANIFEST.MF
0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/
0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/
0 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/
3239 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.xml
0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/
215 Fri Jun 24 10:59:56 EST 2005 WEB-INF/web.xml
123 Fri Jun 24 10:59:56 EST 2005 META-INF/maven/com.mycompany.app/my-webapp/pom.properties
52 Fri Jun 24 10:59:56 EST 2005 index.jsp
0 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/
2713 Fri Jun 24 10:59:56 EST 2005 WEB-INF/lib/my-app-1.0-SNAPSHOT.jar
如何做到的? 首先,父pom的packaging值为pom,并含有一些modules,这告诉maven在所有的子模块中运行相关命令而不仅仅是父模块。(更改这种行为可以在命令行中加入--non-recursive)
然后,我们告诉war 依赖于my-app生成的jar,这做了如下的事情:把生成的jar放在war项目的classpath中以便War中的代码可以调用,确保jar总是在war前build,并指示war plugin把jar包含在它的library 目录中
你可能注意到junit-4.11.jar在依赖中,但是war中并没有。原因是它在<scope>test</scope>中,它仅用在testing,所以没有像有<compile> scope的my-app一样被加入到war中
最后一步是在子模块中包含一个parent 节点,这与maven 1.0中的extend 元素不是,parent 元素确保了pom总会被定位,即使在repository中寻找时the project相对于父模块是各自分离的
不同于maven 1.0, 并不要求先运行mvn install, 你可以只是运行mvn package,被依赖的包会从target directories被找到,而不是从local repository
(Unlike Maven 1.0, it is not required that you run install to successfully perform these steps - you can run package on its own and the artifacts in the reactor will be used from the target directories instead of the local repository.)
最后
以上就是安详皮卡丘最近收集整理的关于maven 入门的全部内容,更多相关maven内容请搜索靠谱客的其他文章。
发表评论 取消回复