maven 入门
来源:互联网 发布:王者荣耀输入法软件 编辑:程序博客网 时间:2024/05/20 10:22
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 入门
- MAVEN 入门
- Maven入门
- maven入门
- maven入门
- Maven 入门
- Maven入门
- maven 入门
- Maven入门
- maven入门
- maven 入门
- maven入门
- Maven入门
- maven入门
- Maven入门
- maven入门
- Maven入门
- Web项目调用webservice服务
- CloudStack API编程指南
- 算法集锦
- CI框架下的数据库创建、连接
- CocoaPods的安装
- maven 入门
- sql练习3
- python 获取图片分辨率
- OpenCV之图形学的腐蚀与膨胀
- 多态和多态对象模型
- 一个求数组中最大元素的函数模板
- linux之Vim文档编辑
- LeetCode
- HDU