[maven] 实战笔记 - 构建、打包和安装maven
① 手工构建自己的maven项目
Maven 项目的核心是 pom.xml。
POM (Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。
你需要提前知道一些Maven 的约定:
1、在项目的根目录中放置 pom.xml
2、在 src/main/java 目录中放置项目的主代码
3、在 src/test/java 中放置项目的测试代码
假设我们有个项目叫helloworld,我们需要把他构建成为一个maven工程
步骤一:在任意目录新建文件夹ch
步骤二:在ch下新建文件 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Maven Hello World Project</name>
</project>
文件详解:
代码的第一行是 XML 头,指定了该 xml 文档的版本和编码方式。
紧接着是 project 元素, project 是所有 pom.xml 的根元素,它还声明了一些 POM相关的命名空间及xsd元素,虽然这些属性不是必须的,但使用这些属性能够让第三方工具(如 IDE 中的 XML 编辑器) 帮助快速编辑 POM。
根元素下的第一个子元素 modelVersion 指定了当前 POM 模型的版本,对于 Maven2 及 Maven 3 来说,它只能是 4.0.0。
这段代码中最重要的是 groupId,artifactId 和 version 三行。这三个元素定义了一个项目基本的坐标,在 Maven 的世界,任何的 jar、pom 或者 war 都是以基于这些基本的坐标进行区分的。
A、groupId 定义了项目属于哪个组。命名规范:com.公司名称.项目名称
B、artifactId 定义了当前 Maven 项目在组中唯一的 ID。如项目分层为mvc时
groupId为com.juvenxu.mvnbook
artifactId 可以为action/service/web-app
这样就将mvc的三个层次分成了三个maven项目,三个坐标。当为其他系统提供本系统的服务时,可以直接把service的坐标告诉其他系统,TA就能调用我们的系统服务了。
C、version 指定了 Maven 项目当前的版本
D、元素声明了一个对于用户更为友好的项目名称
步骤三:编写主代码
项目的主代码会被打包到最终的构件中(比如 jar),默认情况下,Maven 假设项目主代码位于 src/main/java 目录,我们遵循 Maven 的约定,创建该目录,然后在该目录下创建文件 com/juvenxu/mvnbook/helloworld/HelloWorld.java
Hello World 的主代码:
package com.juvenxu.mvnbook.helloworld;
public class HelloWorld {
public String sayHello() {
return "Hello Maven";
}
public static void main(String[] args) {
System.out.print( new HelloWorld().sayHello() ); }
}
注意两点:
1、默认遵循Maven约定把项目主代码放到src/main/java/目录下而无须额外的配置。
Maven 会自动搜寻该目录找到项目主代码。
2、一般来说,项目中 Java 类的包都应该基于项目的 groupId 和 artifactId,这样更加清晰,更加符合逻辑,也方便搜索构件或者 Java 类。
步骤四:使用maven进行编译
mvn clean
mvn compile
clean 告诉 Maven 清理输出目录 target/
compile 告诉 Maven 编译项目主代码
步骤五:为maven项目添加jar/pom等依赖
项目和项目间并不是独立的,有时候我们的项目需要依赖于第三方的一些组件进行开发。比如我们现在要测试项目,以前的做法是下载junit.jar文件放在项目的WEB_INF的lib目录下,然后添加到build-path。
有了maven之后,通过在pom文件中配置项目依赖来引入和使用junit.jar
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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.juvenxu.mvnbook</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<name>Maven Hello World Project</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
代码中添加了dependencies元素,该元素下可以包含多个dependency元素以声明项目的依赖,这里我们添加了一个依赖:
groupId是junit,artifactId是junit,version是 4.7,scope 为依赖范围,默认值为compile,表示该依赖对主代码和测试代码都有效,若声明为test,则表示只对测试代码有效。
有了这段声明,Maven就能够自动下载junit-4.7.jar。
下载方式:自动访问中央仓库
(http://repo1.maven.org/maven2/),下载junit-4.7.jar。
下载完毕之后,以后凡是需要使用junit的maven项目就公用这个jar,而不会再去中央仓库重复下载。
下载的jar包的存放位置:
~/.m2/repository/groupId/artifactId/version
~/.m2/repository/junit/junit/4.7
这个路径下有如下的文件
junit-4.7-sources.jar(以及sources-jar的md5和sha1文件)
junit-4.7.jar(以及jar的md5和sha1文件)
junit-4.7.pom(以及pom的md5和sha1文件)
步骤六:编写测试类并执行mvn的测试命令
在src/test/java路径下编写测试类TestHelloWorld.java
编写好了之后执行mvn clean test 命令
注意:在Maven执行测试(test)之前,它会先自动执行项目主资源处理,主代码编译,测试资源处理,测试代码编译等工作,这是 Maven 生命周期的一个特性。
在执行完毕命令之后,必然出错。因为:由于历史原因,Maven 的核心插件之一 compiler 插件默认只支持编译Java 1.3,因此我们需要配置该插件使其支持 Java5
代码:配置 maven-compiler-plugin 支持 Java 5
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
步骤七:项目打包和运行
默认打包类型为jar,且Maven 会在打包之前执行编译、测试等操作。
简单地执行命令 mvn clean package 进行打包,成功则提示信息:
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] [jar:jar {execution: default-jar}]
[INFO] Building jar: D:\code\hello-world\target\hello-world-1.0-SNAPSHOT.jar
[INFO] BUILD SUCCESSFUL
步骤八,在其他项目中使用构建的jar
至此,我们得到了项目的输出,复制这个 jar 文件到其他项目的 classpath 中从而使用 HelloWorld 类。
但是,如何才能让其他的Maven项目直接引用这个jar?也就是如何将其放入中央仓库呢?
我们还需要一个安装的步骤。执行 mvn clean install:
[INFO] [jar:jar {execution: default-jar}]
[INFO] Building jar: D: \code\hello-world\target\hello-world-1.0-SNAPSHOT.jar
[INFO] [install:install {execution: default-install}]
[INFO]
Installing
D:\code\hello-world\target\hello-world-1.0-SNAPSHOT.jar
to
C:\Users\juven\.m2\repository\com\juvenxu\mvnbook\hello-world\1.0-SNAPSHOT\hello- world-1.0-SNAPSHOT.jar
[INFO] BUILD SUCCESSFUL
从输出我们看到该任务将项目输出的 jar 安装到了 Maven 本地仓库中,我们可以打开相应的文件夹看到 Hello World 项目的 pom 和 jar。
只有构件被下载到本地仓库 后,才能由所有 Maven 项目使用,这里是同样的道理,只有将 Hello World 的构件安装到 本地仓库之后,其他 Maven 项目才能使用它。
拓展:上面我们采用了手工的方式来创建pom以及项目层次结构目录。这样在项目的实际开发中是很复杂的。
所幸 maven提供了 maven archetype 来创建该项目的骨架
1、离开当前maven项目目录
2、运行命令:(实际上是在运行插件 maven-archetype-plugin)
Maven3运行:mvn archetype:generate
Maven2运行:mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate
3、选择一个archetype版本(这里直接回车)
4、输入要创建项目 的 groupId、artifactId、version、以及包名 package
[maven] 实战笔记 - 构建、打包和安装maven的更多相关文章
- [maven] 实战笔记 - maven 安装配置
1.下载地址http://maven.apache.org/download.html 2.windows下安装maven(1)下载 apache-maven-3.0-bin.zip 解压到任意目录下 ...
- Maven项目构建利器02——安装Maven核心程序
1.Maven也是用Java编写的工具,同样运行在JVM上,所以我们在安装Maven之前需要确保已经安装了JDK,首先来检查电脑上是否安装JDK. 2.如上图说明电脑中已经安装了JDK,下面就要去官网 ...
- maven -- 学习笔记(一)之maven环境搭建
首先先感谢博主的分享http://www.cnblogs.com/yjmyzz/p/3495762.html 基本概念: Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建 ...
- [maven学习笔记]第一节,认识maven,搭建maven开发环境,写第一个HelloWorld
本文地址:http://blog.csdn.net/sushengmiyan/article/details/40142771 maven官网:http://maven.apache.org/ 学习视 ...
- Maven使用笔记(六)使用Maven进行多模块拆分
模块拆分是Maven经常使用的功能,简单梳理一下如何使用Maven进行多模块拆分, 只做归纳总结,网上资料很多,不再一步一步实际创建和部署. >>建立Maven多模块项目 一个简单的Jav ...
- 《Maven实战》第10章 使用Maven进行测试
10.2maven-surefire-plugin插件 [生命周期]的[阶段]与[插件]的[目标]绑定 default生命周期的test阶段:使用单元测试框架运行测试 Maven内置绑定:defaul ...
- Eclipse使用Maven内置插件不需要安装Maven
首先修改eclipse项目中maven的路径,默认在C盘,修改路径例如 在d盘创建文件夹-D:- |---m2 |--repository |--setting.xml 没有文件夹和文件要自己新建,如 ...
- 项目管理利器maven学习笔记(一):maven介绍及环境搭建
maven介绍 maven下载与环境搭建 http://maven.apache.org/download.cgi# 解压到指定位置,比如我解压到D盘 设置maven环境变量 添加一个变量名,变量值为 ...
- 学习笔记——Maven实战(六)Gradle,构建工具的未来?
Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你就会发现曾经大红大紫的技术已经成为了昨日黄花,当然,Maven也不会例外.虽然目前它基本上是Java构建的事实标准,但我们 ...
随机推荐
- 还是 js 替代 vw vh 了
有个需求是要层叠两张图,就像你现在看到的:整个浏览器和html页面,内层图片要水平居中,等比例与源UI图适配不同设备 本来很简单的使用 vw vh了( 核心代码 top: 13 ...
- OAF TABLE中第一列添加事件不生效
我遇到一个比较诡异的现象 在TABLE中,我在TABLE的第一列添加了一个MessageCheckBox,并为其设置全局刷新的FireAction事件selection, 但是点击勾选框按钮之后,事件 ...
- bzoj1224
题解: 暴力+剪纸 判断一下最大行不行,最小行不行 代码: #include<bits/stdc++.h> ; using namespace std; ],q; int n,m,x,y, ...
- 处理ListView数据为空的情况
如何处理需要填充的数据为空的情况? ListView及其他继承自AdapterView的类都有一个简便的处理这种情况的方法:setEmptyView(View). 当ListView的Adapter为 ...
- 【解决方案】django初始化执行python manage.py migrate命令后,除default数据库之外的其他数据库中的表没有创建出来
[问题原因]:django工程中存在多个应用,每个应用都指定了对应的数据库.执行python manage.py migrate命令时没有指定数据库,将只初始化默认的default数据库. [解决方案 ...
- 1、lambda表达式
lambda表达式中的类型是通过上下文推断出来的,类似String[] strArr = {"as","sd"};右边元素的子类型. 匿名内部类的情况:需要引用 ...
- java基础11天
冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处,第二次比较厚,最大值放在了倒数第二的位置,一直到第二个元素确定了,整个数组的顺序也就确定了 public class Ar ...
- java基础第6天
面向对象 当需求单一,或者简单时,我们一步一步去操作没问题,并且效率也挺高.可随着需求的更改,功能的增多,发现需要面对每一个步骤很麻烦了,这时就开始改进,能不能把这些步骤和功能再进行封装,封装时根据不 ...
- Git 之 git原理简介
这里只是很简单.超简单的介绍下git,为的是方便记忆: 本地仓库分为三个部分:工作区.暂存区.仓库区,其中暂存区和仓库区属于版本区. 对于文件的操作,需要从工作区----> 暂存区 ----&g ...
- 《DSP using MATLAB》Problem 3.3
按照题目的意思需要利用DTFT的性质,得到序列的DTFT结果(公式表示),本人数学功底太差,就不写了,直接用 书中的方法计算并画图. 代码: %% -------------------------- ...