maven学习手记 - 1
学习目标
- windows下安装maven环境;
- 使用命令创建maven项目结构;
- maven项目编译测试打包安装运行;
- 在maven项目中使用插件。
在windows下安装maven环境
在windows下安装maven环境的步骤如下:
1. 下载maven,
下载地址:http://maven.apache.org/download.cgi
下载“apache-maven-3.2.1-bin.zip”
2. 配置环境变量JAVA_HOME,指向JDK安装路径;
3. 将maven的bin包路径添加到环境变量PATH中;
4. 在命令行窗口输入mvn -v查看maven版本号,完成安装测试;
5. maven运行环境设置完成。
此外还有必要调整默认依赖库位置,添加下载代理和新增依赖库下载镜像地址。这些需要调整setting.xml文件,可以参考这篇文章:《调整maven配置文件》。
使用命令创建maven项目
打开命令行窗口, 进入项目创建位置。
在命令行窗口输入mvn archetype:generate;第一次运行要下载比较多的依赖包(maven指令的运行需要使用大量的依赖包。maven需要依赖包时会首先在本地依赖库中查找,如果在本地找不到,就会在远程依赖库中查找并下载需要的依赖包到本地库中),所以执行的时间会长一点。一段时间后,命令行窗口出现如下提示:
这里提示设置archetype,即给所要创建的java项目选择一个通用的原型。maven提供了1039个项目原型。这里选择默认的398。
输入398,点回车键(有默认值可以直接点回车键,视为选择默认值),会有如下提示:
这里提示选择项目原型版本。1~4为测试版本,默认选择6。按回车键,选择默认版本号1.1。之后提示输入groupId
groupId是项目组织的标识符,一般默认为项目的java包名称(仅是一般的做法,并没有严格限制)。这里输入“net.ibuluo.mvntest”,而后提示输入artifactId,
artifactId是项目的标识符,一般使用项目的名称。输入“mvntest”,会提示要求设置版本号:
默认版本号为“1.0-SNAPSHOT”,按回车键直接使用默认版本号即可。之后有要求设置包名称:
包名称一般可以使用和groupId相同的包名称。这里maven提供的包名称的默认值即是之前设置的groupId。按回车键选择默认的包名称。
接下来会要求确认项目信息,确认无误输Y,按回车键;需要重新设置输N,重新从groupId开始设置项目信息。
确认后输入Y后,maven开始创建项目结构,并在命令行窗口输入以下信息:
至此,项目结构已创建完成。
看一下完成后的项目结构:
在项目的根目录下,maven创建了pom.xml文件。此外,在src包下还创建了两个目录main和test,分别对应项目目录和测试目录。在main和test下还有两个类App和AppTest。
先看一下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>net.ibuluo.mvntest</groupId>
<artifactId>mvntest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>mvntest</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
pom.xml是maven项目的核心文件。POM定义了项目的基本信息,用以描述项目如何构建,声明项目依赖等。说明下pom中的元素。
- project:pom文件中的顶层元素;
- modelVersion:指明POM使用的对象模型的版本;
groupId、artifactId和version之前已经说过了。这三个也是pom文件中最重要的部分。这三项属性是一个maven项目的唯一性标识(或者说是坐标)。
- packaging: 指定项目打包类型
- name:项目的名称,不是很重要,只是给项目一个比较友好的名称,通常用于maven产生的文档中。
- url:指定项目站点,通常用于maven产生的文档中。
- properties:属性标签,通过properties标签可以在pom.xml文件中定义一系列的变量,如上,就是定义了一个值为“UTF-8”的变量${project.build.sourceEncoding},在pom.xml中可以直接使用这个变量。这里目前没有用到,不过在需要多次引用同一个值的时候,properties标签的作用就凸显出来了。
- dependencies:在这个标签下可以设置多个dependency来声明一系列的依赖。
- dependency:项目的依赖。之前已经说过,groupId,artifactId和verison是一个项目的唯一标识,在这里就确定了版本为3.8.1的JUnit。通过这段设置,告诉了maven去获取相应的junit-3.8.1.jar文件。
- scope:依赖范围,即依赖库的作用域。在这里指定为test,即只在测试包下生效。在项目目录下引用就会报错。如不声明依赖范围,那么scope默认compile,即对项目主代码和测试代码都有效。
再看一下main目录下给出的项目文件实例App.java:
package net.ibuluo.mvntest; /**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}
很简单的一段hello world程序。
再看下test目录下给出的测试文件实例AppTest.java:
package net.ibuluo.mvntest; import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite; /**
* Unit test for simple App.
*/
public class AppTest
extends TestCase
{
/**
* Create the test case
*
* @param testName name of the test case
*/
public AppTest( String testName )
{
super( testName );
} /**
* @return the suite of tests being tested
*/
public static Test suite()
{
return new TestSuite( AppTest.class );
} /**
* Rigourous Test :-)
*/
public void testApp()
{
assertTrue( true );
}
}
maven项目的编译测试打包安装和运行
试运行下这个项目。分如下四个步骤:编译->测试->打包->安装->运行
编译:打开命令行窗口,进入项目目录,输入mvn clean compile 执行编译;
完成编译后,在项目目录下生成了target目录,编译完成的文件就储存在这个目录下:
在刚才输入的命令中clean告诉maven清理target目录,compile告诉maven编译项目代码。
测试:在命令行窗口中输入 mvn clean test 调用maven执行测试,maven执行了一段功能并下载了一串依赖包后输出如下信息:
可以看到测试成功了。
再看看项目目录,在target包下又多了两个目录,surefire-reports和test-classes 。
surefire-reports存放的是测试报告,test-classes下存放的是编译后的测试文件。
打包:在命令行窗口输入 mvn clean package,执行项目打包:
可以看到,在打包之前,maven再次执行了编译和测试操作。
因为在pom文件中,我们设置打包类型为jar,所以这里生成了一个名为mvntest-1.0-SNAPSHOT.jar的文件。
安装:在命令行窗口输入 mvn clean install ,执行安装任务:
从运行结果可以看出,执行安装命令的目的是将生成的jar 包安装到本地的依赖库中。这样其他的项目也可以使用这个项目中生成的类了。
最后,执行以下这个项目。在命令行窗口输入java –jar target/mvntest-1.0-SNAPSHOT.JAR,回车键:
额,执行结果和我想的不一样。用压缩工具打开mvntest-1.0-SNAPSHOT.jar,查看下包中的META-INF/MANIFEST.MF文件:
Manifest-Version: 1.0
Built-By: robin
Build-Jdk: 1.7.0_45
Created-By: Apache Maven 3.2.1
Archiver-Version: Plexus Archiver
没有设置Main-Class属性,这样jar文件在运行时就无法找到带main方法的类。直接动手填上也是一个办法,而且在这个小的示例中很简单。
不过这样不是治本的方法。我们需要maven生成一个可以直接执行的jar包。这时,我们需要使用插件。
在maven项目中使用插件
需要使用的插件为:maven-shade-plugin。
maven-shade-plugin是一个打包插件。通过这个插件我们可以配置Main-Class的值,并在打包的时候将Main-Class的值写入META-INF/MANIFEST.MF中。 关于这个插件的更多信息请参考这里:http://maven.apache.org/plugins/maven-shade-plugin/usage.html
调整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>net.ibuluo.mvntest</groupId>
<artifactId>mvntest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>mvntest</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>net.ibuluo.mvntest.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
而后执行命令 mvn clean install ,在target目录下生成了两个jar包:mvntest-1.0-SNAPSHOT.jar 和 original-mvntest-1.0-SNAPSHOT.jar。
mvntest-1.0-SNAPSHOT.jar是带有Main-Class的可执行的jar文件,后者是原始的jar包。
再次执行下:
执行成功,输出了”Hello World!“这个经典的招呼。
关于这个插件的更多用法可以参考下这篇文章:http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package
参考的文章:
http://www.cnblogs.com/fnng/archive/2011/12/02/2272610.html
http://xiejianglei163.blog.163.com/blog/static/1247276201362204515400/
http://blog.csdn.net/mapdigit/article/details/7980645
maven学习手记 - 1的更多相关文章
- maven学习手记 - 3
学习目标 maven插件的定义: maven插件的使用. 前言 在手记2中说过maven的阶段命令是通过插件实现的.在手记1中也有简单的示范过插件的用法.但是总觉得有些泛泛了,想在这里再捋一下,以 ...
- maven学习手记 - 2
学习目标 maven 的插件和目标: maven 的生命周期和阶段. 前言 在手记1中看到执行 mvn clean package 时,maven 自动执行了compile 和 test 操作. ...
- Linux.NET学习手记(7)
前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...
- Linux.NET学习手记(8)
上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...
- 关于《Linux.NET学习手记(8)》的补充说明
早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...
- Maven学习-目录结构
在前一篇文章中,我们介绍了什么是Maven,以及如何用Maven来构建我们的项目.不了解Maven的童鞋,可以看这里Maven学习-入门.在这篇文章中,我们将学习Maven的项目的目录结构相关的内容. ...
- EF框架学习手记
转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...
- Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试
现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...
- maven学习之二M2_HOME简介
在<maven学习之一>中介绍了M2_HOME指向了maven的安装目录,如下图: weiwan..................
随机推荐
- 多行文字垂直居中(完美兼容chrome firefox IE6 7 8 9)
在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...
- Windows phone 8 学习笔记(1) 触控输入(转)
Windows phone 8 的应用 与一般的Pc应用在输入方式上最大的不同就是:Windows phone 8主要依靠触控操作.因此在输入方式上引入一套全新的触控操作方式,我们需要重新定义相关的事 ...
- Magento修改css样式
Magento研究了第四天才开始搞明白怎么运行. 首先对于前端开发来说要修改样式的话需要运行: grunt less:luma 如果提示: 那就说明grunt配置的路径不对,默认是英文的,如果我们用中 ...
- openstack简介
OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作.OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单.可大规模扩展.丰富.标准统一的云计算管理平台 ...
- nodejs前端自动化构建
http://99jty.com/?p=1257 http://www.jankerli.com/?p=1628 http://www.cnblogs.com/zhepama/archive/2013 ...
- 解决DataGridView在多线程中无法显示滚动条的问题
在多线程中对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的 ...
- 《Google 代码风格指南》
<Google 代码风格指南> https://github.com/google/styleguide
- Spark自定义分区(Partitioner)
我们都知道Spark内部提供了HashPartitioner和RangePartitioner两种分区策略,这两种分区策略在很多情况下都适合我们的场景.但是有些情况下,Spark内部不能符合咱们的需求 ...
- Java 中判断两个对象是否相等
由于每次实例化一个对象时,系统会分配一块内存地址给这个对象,而系统默认是根据内存地址来检测是否是同一个对象,所以就算是同一个类里实例化出来的对象它们也不会相等. public class Transp ...
- jquery中each()函数
今天在使用each函数时,发现写的js代码明明木有问题,为什么点击没有执行呢.js始终处于入门阶段,只好瞎鼓捣. 弄了半天,总算可以了.代码如下: <script type="text ...