标签:
描述项目如何构建、声明项目依赖等。以xml形式来编写命名为pom.xml,一个maven项目对应一个pom.xml。相当于Ant的build.xml文件,gradle的build.gradle文件。
使用maven工具可以将项目编译成很多种类型的包,常用的是jar/war/pom类型的包,这些包在maven的世界中就叫构件。
统一存放所有maven项目共享的构件的地方。以groupId/artifactId/version/artifactId-version.packaging路径存放。分为本地仓库、远程仓库、中央仓库、私服。后两种属于远程仓库,但是这里列出是因为这两种仓库比较特殊,后续会详细说明。
概念来源于几何平面,为了准确定位构件的位置提出来的概念(一个java项目会依赖很多开源的jar包,每个jar包都会有很多版本,有了坐标的概念就能很容易的指定某一个具体的jar包了)。maven定义了5个坐标元素:groupId/artifactId/version/packaging/classifier,这样在一个仓库中就可以唯一的标识一个构件了。
这个很好理解,就是如果一个项目使用了其他构件的功能,这就构成了依赖,例如使用spring框架就需要依赖spring提供的jar包。
对所有的构建过程进行抽象和统一。包括:项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等。最常用的是清理、编译、测试和打包这四个阶段。这些生成周期具体的任务是由maven插件完成的(例如maven-compiler-plugin插件可以完成compile目标)。
当一个项目很大时,会分成很多个模块,如果一个模块一个模块的编译的话会很麻烦。聚合这一特性就是为解决此问题而出现的。这样一次就可以把所有模块一起编译(还可以配置只编译其中部分模块)。
在一个大项目中的多个模块中不可避免的会有依赖多个相同的依赖,这就是重复。这样可以将这些重复提出来做成一个单独的模块,其他的模块从此模块继承相应的配置,就像类的父子继承结构一样。
机器上控制maven的全局配置文件,我们可以将这个文件拷贝到~/.m2/下面,然后修改此文件,在用户范围定制maven的行为。(但是现在都是一人一台电脑,应该不涉及多个用户共用的问题,反正我是没有遇到)
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <!-- localRepository | The path to the local repository maven will use to store artifacts. | | Default: ${user.home}/.m2/repository <localRepository>/path/to/local/repo</localRepository> --> <strong><localRepository>E:\.m2\repository</localRepository></strong> </settings>
这个是对应maven项目的配置文件,下面给出helloworld工程的pom.xml文件,通过这个pom可以构建出一个可执行的jar包,具体配置这里先不做详细说明了。
<pre name="code" class="html"><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.itsenlin</groupId> <artifactId>helloworld.demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Archetype - helloworld.demo</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <!-- 告知 maven-jar-plugin添加一个 Class-Path元素到 MANIFEST.MF文件,以及在Class-Path元素中包括所有依赖项 --> <addClasspath>true</addClasspath> <!-- 所有的依赖项应该位于 lib文件夹 --> <classpathPrefix>lib/</classpathPrefix> <!-- 当用户使用 lib命令执行JAR文件时,使用该元素定义将要执行的类名 --> <mainClass>com.itsenlin.Helloworld</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
最后一幅图是两幅图合并的,上面是主程序的位置,下面是测试程序的位置图
这个目录结构不是随便安排的,这是maven的另外一个特性“约定优于配置”,在maven中有如下约定:
maven会从这些约定好的路径下查找相应的文件,这样可以减少用户很多配置。
Helloworld.java
package com.itsenlin; public class Helloworld { public String sayHello(String name){ return "hello, " + name; } public static void main(String[] args) { System.out.println(new Helloworld().sayHello("world!")); } }HelloworldTest.java
package com.itsenlin; import org.junit.Assert; import org.junit.Test; public class HelloworldTest { @Test public void sayHelloTest(){ Helloworld hw = new Helloworld(); Assert.assertEquals("hello, world!", hw.sayHello("world!")); } }
进入到pom.xml所在目录下执行“mvn install”即可,
maven会自动在在pom.xml所在目录下生成target目录及target/classes目录,把编译好的class文件放在target/classes/下面,把编译好的jar包放在target目录下
这里介绍一下eclipse中导入maven工程的方法
标签:
原文地址:http://blog.csdn.net/itsenlin/article/details/51255251