Maven使用基础
(转)https://my.oschina.net/xiaomaoandhong/blog/104045
基于 约定优于配置(Convention Over Configuration)的原则,无特殊需求,请遵守Maven以下约定:
Maven约定
目录src/main/java | java源码目录 |
目录src/main/resources | 资源文件目录 |
目录src/test/java | 测试java源码目录 |
目录src/test/resources | 测试资源文件目录 |
目录target | 打包输出目录 |
目录target/classes | 编译输出目录 |
目录target/test-classes | 测试编译输出目录 |
目录target/site | 项目site输出目录 |
目录src/main/webapp | web应用文件目录(当打包为war时),如WEB-INF/web.xml |
jar | 默认打包格式 |
*Test.java | Maven只会自动运行符合该命名规则的测试类 |
%user_home%/.m2 | Maven默认的本地仓库目录位置 |
中央仓库 | Maven默认使用远程中央仓库:http://repo1.maven.org/maven2 |
1.3 | Maven Compiler插件默认以1.3编译,因此需要额外配置支持1.5 |
其上所有的约定都可以在Maven的超级POM(super pom)中找到。由于所有的POM都继承了这个超级POM,因此它的默认配置就被继承了 。Maven3中这个超级POM位于lib\maven-model-builder-3.0.4.jar\org\apache\maven\model下
一:编写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>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>my-app</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>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
1:project是所有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">
它还声明了一些POM相关的命名空间及xsd元素,虽然这些属性不是必须的,但使用这些属性能够让第三方工具(如IDE中的XML编辑器)帮助我们快速编辑POM。
<modelVersion>4.0.0</modelVersion>
根元素下的第一个子元素modelVersion指定了当前POM模型的版本,对于Maven2及Maven 3来说,它只能是4.0.0。
3:groupId,artifactId和version三行
pom.xml中最重要的是groupId,artifactId和version三行。这三个元素定义了一个项目基本的坐标,在Maven的世界,任何的jar、pom或者war都是以基于这些基本的坐标进行区分的。
3.1:groupId
定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联,譬如你的公司是mycom,有一个项目为myapp,那么groupId就应该是com.mycom.myapp。
3.2:artifactId
定义了当前Maven项目在组中唯一的ID,在前面的groupId为com.mycompany.app的例子中,你可能会为不同的子项目(模
块)分配artifactId,如:myapp-util、myapp-domain、myapp-web等等。本例中artifactId 为
my-app
3.3:version
顾名思义,version指定了项目当前的版本。
<version>1.0-SNAPSHOT</version>
SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如升级为1.1- SNAPSHOT、1.0、1.1、2.0等等。本书的6.5小节会详细介绍SNAPSHOT,第13章介绍如何使用Maven管理项目版本的升级发布。
4:name元素
声明了一个对于用户更为友好的项目名称,虽然这不是必须的,但我还是推荐为每个POM声明name,以方便信息交流。
下面不借助于IDE环境的支持,完全以手动配置的方式来说一下Maven的一个入门的小示例
1、创建HelloMaven项目
首先创建一个名为HelloMaven项目的文件夹,在该项目的根目录下建立一个pom.xml文件,该文件是Maven项目的核心,
就像Make的Makefile,Ant的build.xml一样
。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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指定当前pom模型的版本,
对于Maven2及Maven3来说,它只能是4.0.0
-->
<modelVersion>4.0.0</modelVersion>
<!--
groupId,artifactId和version这三个元素定义了一个项目基本的坐标,
在Maven的世界,任何的jar、pom或者war都是以基于这些基本的坐标进行区分
-->
<!--
groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联
-->
<groupId>org.apache.maven</groupId>
<!--
artifactId定义了当前Maven项目在组中唯一的ID
-->
<artifactId>hellomaven</artifactId>
<!--
项目当前版本,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本
-->
<version>1.0-SNAPSHOT</version> <name>HelloMaven Project</name>
</project>
2、编写项目的主代码HelloMaven.java
基于Maven的约定,我们在HelloMaven目录下创建
src\main\java\HelloMaven.java,Maven会自动搜索该src\main\java目录找到HelloMaven.java
package org.apache.maven.hellomaven;
/**
*一般来说,项目中Java类的包都应该基于项目的groupId和artifactId
*/
public class HelloMaven {
public String sayHello() {
return "Hello Maven";
} public static void main(String[] args) {
System.out.println(new HelloMaven().sayHello());
}
}
3、编译
新开一个cmd窗口,在项目根目录下使用Maven命令
mvn clean compile编译该源文件HelloMaven.java,clean告诉Maven清理输出目录target/,compile告诉Maven编译项目主代码
编译成功之后这时我们发现根目录下除了src和pom.xml,还多了个target目录,
默认情况下Maven构建的所有输出都在target目录中
,项目的主代码位于target/classes。
查看target目录
4、测试
遵照上面Maven的约定,测试代码目录是src/test/java。因此,在编写测试用例之前,我们先创建该目录。
在HelloMaven\src\test\java下编写测试类HelloMavenTest.java
package org.apache.maven.hellomaven;
import static org.junit.Assert.assertEquals;
import org.junit.Test; public class HelloMavenTest
{
@Test
public void testSayHello()
{
HelloMaven hellomaven = new HelloMaven();
String result = hellomaven.sayHello();
assertEquals("Hello Maven", result );
}
}
JUnit是事实上的单元测试标准。要使用JUnit,我们首先需要为HelloMaven项目添加一个JUnit依赖,修改项目的POM文件,添加junit依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<!--
依赖范围为test 则表示该依赖只对测试有效
-->
<scope>test</scope>
</dependency>
</dependencies>
前面说到groupId、artifactId和version是任何一个Maven项目最基本的坐标,JUnit也不例外,有了这段声明,Maven就能够自动从其中央仓库下载junit-4.7.jar到本地仓库。
调用Maven执行测试,运行
mvn clean test
测试代码通过编译之后在target/test-classes下生成了二进制文件,紧接着surefire:test
任务运行测试,surefire
是Maven世界中负责执行测试的插件,这里它运行测试用例HelloMavenTest,并且输出测试报告,显示一共运行了多少测试,失败了多少,出错
了多少,跳过了多少。
5、打包
HelloMaven的POM中没有指定打包类型,使用
默认打包类型jar,简单地执行命令
mvn clean package进行打包
类似地,Maven会在打包之前执行编译、测试等操作。该jar文件hellomaven-1.0-SNAPSHOT.jar同样位于target输出目录中
我们可以复制这个jar到其它项目的classpath路径下从而使用HelloMaven类,但是要
让其他的Maven项目直接引用这个jar,还需要一个安装的步骤:mvn clean install,将这个jar文件安装到本地仓库中,就如前面的junit一样,只有被下载到本地仓库之后才能被其它Maven项目所引用。
已经接触了如下的Maven命令:
mvn clean compile、mvn clean test、mvn clean package、mvn clean install
执行test 之前是会先执行compile的,执行package之前是会先执行test 的,而类似地,install 之前会执
行package。
6、运行
默认打包生成的jar是不能够直接运行的,如:
因为带有main方法的类信息不会添加到manifest中
(
我们可以打开jar文件中的
META-INF/MANIFEST.MF 文件,将无法看到Main-Class一行
如:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: yanghong.zhou
Build-Jdk: 1.6.0_10-rc2
为了生成可执行的jar 文件,我们需要借助maven-shade-plugin,配置该插件如下:
<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>
org.apache.maven.hellomaven.HelloMaven
</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
现在执行 mvn clean package:
待构建完成之后打 开target/目录 ,我们可以看到
hellomaven-1.0-SNAPSHOT.jar 和original-hellomaven-1.0-SNAPSHOT.jar,前者是带有Main-Class信息的可运行jar,后者是原始的jar,打开
hellomaven-1.0-SNAPSHOT.jar
的META-INF/MANIFEST.MF,可以看到它包含这样一行信息:
Main-Class: org.apache.maven.hellomaven.HelloMaven
run:
附录:
Dependency Scope
在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:
- compile,缺省值,适用于所有阶段,会随着项目一起发布。
- provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
- runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
- test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
- system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
如下代码:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sitinspring</groupId>
<artifactId>Maevn3ndPart</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maevn3ndPart</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Maven使用基础的更多相关文章
- IDEA + maven 零基础构建 java agent 项目
200316-IDEA + maven 零基础构建 java agent 项目 Java Agent(java 探针)虽说在 jdk1.5 之后就有了,但是对于绝大多数的业务开发 javaer 来说, ...
- 项目管理构建工具——Maven(基础篇)
项目管理构建工具--Maven(基础篇) 在前面的内容中我们学习了JDBC并且接触到了jar包概念 在后面我们的实际开发中会接触到很多jar包,jar包的导入需要到互联网上进行就会导致操作繁琐 Mav ...
- maven教程基础
一.Maven介绍 我们在开发项目的过程中,会使用一些开源框架.第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要添加到项目中,所有这些相关的 ...
- maven相关基础
0. 本文主要参考一下良心maven原创文摘: 0.0 maven官网传送门 http://maven.apache.org/ 0.1 maven日常 http://www.cnblogs.com/x ...
- maven入门基础(转)
maven介绍 maven是构建工具,也是构建管理工具.ant只是构建工具,因为不支持生成站点功能,只有预处理,编译,打包,测试,部署等功能. maven坐标 groupId:项目组织的逆向域名,比如 ...
- Maven开发基础总结(Maven自启动,Maven打war包,Maven热部署)
学习内容: 1.不依赖外部Tomcat,自己启动方式部署 2.Maven打war包,远程部署到centOS 3.Maven热部署(不关闭Tomcat部署应用) 做maven开发前提: 1.编码UT ...
- maven基本基础知识及命令学习-1
Maven概述:Maven是很有效的项目管理工具,maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目构建.报告和文档的软件项目管理工具.统一管理环境,架包等. 一 maven下载 ...
- Maven的基础了解与使用
目录 Maven的介绍: 什么是Maven: 为什么要学习maven? 安装与配置: 下载: 配置环境变量 测试安装结果: Maven概念: 坐标 仓库 入门示例 创建maven工程: 添加依赖 Ma ...
- 【Maven】基础概念、仓库、构建与部属
1.常见的自动化构建工具有: make.ant.maven.gradle,gradle是目前最新的,maven是目前最常用的. Eclipse是一种半自动化构建工具,主要体现在把:java文件-> ...
- maven学习--基础篇
2016-01-5 16:13:43 发现一些错误,文章修改中…… (部分图片截取自其他地方,不是很清楚) 一. maven的项目创建和基本命令 maven是一个项目管理工具,包含了一个项目对象模型P ...
随机推荐
- Acwing-280-陪审团(背包dp?)
链接: https://www.acwing.com/problem/content/282/ 题意: 在一个遥远的国家,一名嫌疑犯是否有罪需要由陪审团来决定. 陪审团是由法官从公民中挑选的. 法官先 ...
- CSS 内边距 padding 属性
CSS padding 属性定义元素边框与元素内容之间的空白区域. ㈠padding(填充) ⑴当元素的 padding(填充)内边距被清除时,所释放的区域将会受到元素背景颜色的填充. ⑵单独使用 p ...
- Springboot(九).多文件上传下载文件(并将url存入数据库表中)
一. 文件上传 这里我们使用request.getSession().getServletContext().getRealPath("/static")的方式来设置文件的存储 ...
- 关于Jdk7与Jdk8对Collections进行分组的区别
先准备一点数据: public class User { private Integer id; private String type; private String name; ...
- jQuery 全选和反选demo
前段时间做了一个全选和反选的功能,最近不忙了,做了一个简化版的demo. 全部代码如下: <!DOCTYPE html> <html> <head> <tit ...
- windows上批量杀指定进程
Taskkill 结束一个或多个任务或进程.可以根据进程 ID 或图像名来结束进程. 语法 taskkill [/s Computer] [/u Domain\User [/p Password]]] ...
- ruby_类的调用及require的使用
在文件arrayTest_1中,定义class Liuyang内容如下:(通过require File.expand_path('../arrayTest_2',__FILE__) 来包含其他文件的文 ...
- Vue可自定义tab组件
在工作中我们常常要用到tab组件,如果有用第三方组件库的话一般都会有这个组件,但如果没有使用第三方组件库,或者想要自定义tab,那么或许这个无依赖的tab组件将会极大地节约你的开发时间. 如何 ...
- 菜鸟requireJS教程---1、初识requirejs
菜鸟requireJS教程---1.初识requirejs 一.总结 一句话总结: Using a modular script loader like RequireJS will improve ...
- HearthBuddy 第一次调试
HearthBuddy https://www.jiligame.com/70639.html 解压缩包,打开hearthbuddy.exe直接运行就可以:不用替换mono.dll直接可用:不需要校验 ...