maven3.0

Maven入门教程

1.1. 介绍、环境配置

1.1.1. Maven介绍

Maven是一个采用纯Java编写的开源项目管理工具, Maven采用了一种被称之为Project Object Model (POM)概念来管理项目,全部的项目配置信息都被定义在一个叫作POM.xml的文件中, 经过该文件Maven能够管理项目的整个生命周期,包括清除、编译,测试,报告、打包、部署等等。目前Apache下绝大多数项目都已经采用Maven进行管理. 而Maven自己还支持多种插件, 能够方便更灵活的控制项目, 开发人员的主要任务应该是关注商业逻辑并去实现它, 而不是把时间浪费在学习如何在不一样的环境中去依赖jar,项目部署等Maven正是为了将开发人员从这些任务中解脱出来而诞生的html

1.1.2. Maven可以作什么

l Jar声明式依赖性管理java

l 项目自动构建web

1.1.3. 环境配置

l http://maven.apache.org/download.html 下载最新版本Maven 3.0.2 (Binary zip)apache

 

 

l 解压到 D(自己就是绿色版不须要安装):api

 

 

l 配置环境变量(配置以前,必须肯定配置了JDK环境变量)浏览器

MAVEN_HOME : D:\apache-maven-3.0.2
把此命令添加到Path: %MAVEN_HOME%\bin\缓存

l 配置用户范围的settings.xmltomcat

MAVEN_HOME/conf/settings.xml 全局的网络

~/.m2/settings.xml 单个用户的oracle

 

 

l 验证安装是否成功

在命令行上输入: mvn -version;回车, 如看到下面信息表示安装成功

 

 

1.1.4. Maven目录分析

l bin:含有mvn运行的脚本

l boot:含有plexus-classworlds类加载器框架

l conf:含有settings.xml配置文件

l lib:含有Maven运行时所须要的java类库

l Settings.xml 中默认的用户库: ${user.home}/.m2/repository

l Maven默认仓库下载地址在: mavenlib目录下maven-model-builder-3.0.4.jarpom.xml

1.2. 第一个Maven演示

1.2.1. 建立目录结构

Convention Over Configuration (约定优于配置)。在现实生活中,有不少常识性的东西,地球人都知道。好比说:如何过马路(红灯停绿灯行),如何开门,关门等。对于这些事情,人们已经有了默认的约定, 在软件开发过程当中,道理也是相似的,若是咱们事先约定好全部项目的目录结构,标准开发过程(编译,测试) , 全部人都遵循这个约定。软件项目的管理就会变得简单不少。在如今流行的不少框架中,都使用了这个概念

Hello

 --src   

 -----main

 ----------java       --用来存放Java文件

 ----------resources   --用来存放资源文件

 -----test

 ---------java        --用来存放测试的Java文件

 ---------resources

 --target           --项目输出位置,编译完毕后自动生成

 --pom.xml        -- 项目对象模型的描述 ,它是maven配置的核心

1.2.2. 创建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的版本号 -->

  <modelVersion>4.0.0</modelVersion>

  <!-- groupId: 当前jar所属的命名空间 -->

  <groupId>cn.itcast.maven</groupId>

  <!-- 当前项目模块名称 -->

  <artifactId>Hello</artifactId>

  <!-- 当前项目的版本, SNAPSHOT镜像版 -->

  <version>0.0.1-SNAPSHOT</version>

<!-- 当前模块须要依赖的相关jar包,也称为依赖管理, 全部被依赖的包都是经过"坐标"定位的 -->

<dependencies>

    <!-- 须要依赖junit 经过 groupId+artifactId+version来查找,若是本地没有则到中央仓库下载 -->

<dependency>

<!-- 当前jar所属的命名空间 -->

<groupId>junit</groupId>

<!-- 依赖的项目模块的名称 -->

<artifactId>junit</artifactId>

<!-- 依赖的版本号 -->

<version>4.9</version>

<!-- 依赖的范围, 有 test compile privlege -->

<scope>test</scope>

</dependency>

</dependencies>

</project>

pom.xml 文件是maven对一个项目的核心配置,这个文件将包含你但愿如何构建项目的大多数配置信息。POM大而复杂,但你不用所有去了解,只要使用一些经常使用的配置就能够了

1.2.3. 建立Java类与测试类

l 在src/main/java/cn/itcast/maven目录下新建文件Hello.java

package cn.itcast.maven;

public class Hello {

public String sayHello(String name){

return "Hello "+name+"!";

}

}

l 在/src/test/java/cn/itcast/maven目录下新建测试文件HelloTest.java

package cn.itcast.maven;

import org.junit.Test;

import static junit.framework.Assert.*;

public class HelloTest {

@Test

public void testHello(){

Hello hello = new Hello();

String results = hello.sayHello("litingwei");

assertEquals("Hello litingwei!",results);

}

}

1.2.4. 命令测试

打开cmd命令行, 进入Hello项目根目录执行mvn compile命令, 查看根目录变化

cmd 中继续录入mvn clean命令,而后再次查看根目录变化

cmd 中录入 mvn clean compile命令, 查看根目录变化

cmd 中录入 mvn clean test命令,查看根目录变化

cmd 中录入 mvn clean package命令,查看根目录变化

1.3. Maven核心概念

1.3.1. Maven插件

Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的每一个插件都能实现多个功能,每一个功能就是一个插件目标

Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务, Maven的插件在: .m2\repository\org\apache\maven\plugins

1.3.2. Maven坐标

相似在平面几何中坐标(x,y)能够标识平面中惟一的一点, Maven世界拥有大量构建,咱们须要找一个用来惟一标识一个构建的统一规范

拥有了统一规范,就能够把查找工做交给机器

l groupId:定义当前Maven项目隶属项目  (实际对应JAVA的包的结构, 是main目录里java的目录结构)

l artifactId:定义实际项目中的一个模块(项目的惟一的标识符,实际对应项目的名称,就是项目根目录的名称)

l version:定义当前项目的当前版本

1.3.3. Maven仓库

l 何为Maven仓库:用来统一存储全部Maven共享构建的位置就是仓库

l Maven配置jar包的路径为:groupId/artifactId/version/artifactId-version

l 本地仓库(~/.m2/repository/):每一个用户只有一个本地仓库

l 中央仓库(Maven默认的远程仓库)Maven默认的远程仓库下载地址为:http://repo1.maven.org/maven2

l 私服:是一种特殊的远程仓库, 它是架设在局域网内的仓库, 主要是为了团队协做开发

l 镜像:用来替代中央仓库, 速度通常比中央仓库快

1.3.4. 生命周期

 

 

1.4. 第二个Maven演示

1.4.1. HelloFriend目录结构

HelloFriend

 --src

 -----main

 ----------java

 ----------resources

 -----test

 ---------java

 ---------resources

 --pom.xml

1.4.2. 创建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>cn.itcast.maven</groupId>

<artifactId>HelloFriend</artifactId>

<version>1.0.0</version>

<packaging>jar</packaging>

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.9</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>cn.itcast.maven</groupId>

<artifactId>Hello</artifactId>

<version>1.0.0</version>

<scope>compile</scope>

</dependency>

</dependencies>

</project>

1.4.3. 建立Java类与测试类

l 在src/main/java/cn/itcast/maven目录下新建文件HelloFriend.java

package cn.itcast.maven;

public class HelloFriend{

public String sayHello(String name){

return "Hello "+name+"!";

}

}

l 在/src/test/java/cn/itcast/maven目录下新建测试文件HelloFriendTest.java

package cn.itcast.maven;

import org.junit.Test;

import cn.itcast.maven.Hello;

public class HelloFriendTest {

@Test

public void tesHelloFriend(){

HelloFriend helloFriend = new HelloFriend();

String results = helloFriend.sayHelloToFriend("litingwei");

System.out.println(results);

}

}

1.4.4. 命令测试

l 在HelloFriend目录下执行 mvn clean mvn compile mvn test 都正常

l 在HelloFriend目录下执行命令mvn package 系统报错说没有找到依赖, 由于HelloFriend依赖Hello模块,可是此模块在我的仓库和中央仓库中并不存在

l 须要从新构建Hello第一个项目并安装到数据仓库, Hello根目录下执行mvn clean install, 就会部署的中央仓库中

1.5. MavenEclipse整合

1.5.1. 配置maven插件

 

 

1.5.2. user settings

 

 

1.6. Maven部署到Tomcat

1.6.1. 建立Java项目

l 在MyEclipse建立项目的时候选择Maven Project

 

 

l 在构件向导的时候选择quickstart注意, 此向导也是插件,第一次使用的时候.也要从远程仓库中下载相应的jar, 所以须要网络环境

 

 

l 设置当前模块的坐标,和相应的版本号

 

 

l 建立完毕后默认生成的项目包目录以下

 

 

l 经过在pom.xml中配置相应Hello.jar便可

<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>Hello3</groupId>

  <artifactId>Hello3</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>jar</packaging>

  <!-- 当前Maven模块的相关信息,可选信息 -->

  <name>Hello3</name>

  <url>http://maven.apache.org</url>

  <!-- 设置常量, 下面能够经过${project.build.sourceEncoding}来引用,通常来讲版本号设置在此处 -->

  <properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  </properties>

  <!-- 依赖管理 -->

  <dependencies>

   <!-- 依赖Junit-->

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.9</version>

      <scope>test</scope>

    </dependency>

    <!-- 依赖前面的Hello, 那么在仓库中必须拥有 Hello的坐标 -->

    <dependency>

     <groupId>cn.itcast.maven</groupId>

      <artifactId>Hello</artifactId>

      <version>0.0.1-SNAPSHOT</version>

    <scope>compile</scope>

    </dependency>

  </dependencies>

</project>

l 经过在pom.xml中单击右键选择相应的命令便可

 

 

1.6.2. 建立Web项目

l 选择建立一个普通的web工程

 

 

l 设置相应的坐标

 

 

l 若是采用src缺省的包结构,pom.xm中须要指定编译和调试的目录.

<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>web</groupId>

  <artifactId>web</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>war</packaging>

  <!-- 配置常量 -->

  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <jstl.version>1.2</jstl.version>

    <compiler.version>1.6</compiler.version>

  </properties>

  <!-- 定义依赖管理 -->

  <dependencies>

   <!-- 定义须要依赖的系统jar, provided则在打包的时候不会包含 -->

    <dependency>

      <groupId>javax.servlet</groupId>

      <artifactId>jstl</artifactId>

      <version>${jstl.version}</version>

      <scope>provided</scope>

    </dependency>

    <dependency>

      <groupId>javax.servlet.jsp</groupId>

      <artifactId>jsp-api</artifactId>

      <version>2.1</version>

      <scope>provided</scope>

    </dependency>

    <!-- 定义依赖的第三方包,compile 则打包的时候会自动加载到lib目录中 -->

    <dependency>

     <groupId>cn.itcast.maven</groupId>

      <artifactId>Hello</artifactId>

      <version>0.0.1-SNAPSHOT</version>

    <scope>compile</scope>

    </dependency>

  </dependencies>

  <!-- 用来定义构建阶段的标签 -->

  <build>

   <!-- 因为采用的非Maven的约定,则在构建的时候要指定的目录 -->

    <sourceDirectory>${basedir}/src</sourceDirectory>

   <outputDirectory>${basedir}/WebRoot/WEB-INF/classes</outputDirectory>

    <resources>

      <!-- 资源文件也存放到src中但排除 *.java -->

      <resource>

        <directory>${basedir}/src</directory>

        <excludes>

          <exclude>**/*.java</exclude>

        </excludes>

      </resource>

    </resources>

    <plugins>

      <!-- 配置相应的打包插件  -->

      <plugin>

        <artifactId>maven-war-plugin</artifactId>

        <configuration>

          <webappDirectory>${basedir}/WebRoot</webappDirectory>

          <warSourceDirectory>${basedir}/WebRoot</warSourceDirectory>

        </configuration>

      </plugin>

      <plugin>

        <artifactId>maven-compiler-plugin</artifactId>

        <configuration>

          <source>${compiler.version}</source>

          <target>${compiler.version}</target>

        </configuration>

      </plugin>

    </plugins>

  </build>

</project>

l 在index.jsp页面中添加以下代码

<body>

      <%    // 要导入相应: cn.itcast.maven.*

         Hello hello=new Hello();

            out.println(hello.sayHello("admin"));

      %>

</body>

1.7. Maven私服

1.7.1. 关于中央仓库注意事项

l 地址: 目前来讲: http://repo1.maven.org/maven2/是真正的Maven中央仓库的地址,该地址内置在Maven的源码中其余的都是镜像

l 索引: 中央仓库带有索引文件以方便用户对其进行搜索,完整的索引文件大小约为60M,索引每周更新一次

l 黑名单: 若是某个IP地址恶意的下载中央仓库内容,例如全公司100台机器使用同一个IP反复下载,这个IP(甚至是IP段)会进入黑名单,所以稍有规模的使用Maven时,应该用Nexus架设私服

1.7.2. 为何须要私服

为何要搭建nexus私服,缘由很简单,有些公司都不提供外网给项目组人员,所以就不能使用maven访问远程的仓库地址,因此颇有必要在局域网里找一台有外网权限的机器,搭建nexus私服,而后开发人员连到这台私服上,这样的话就能够经过这台搭建了nexus私服的电脑访问maven的远程仓库

 

 

1.7.3. Nexus环境搭建

第一步:下载nexus-webapp-1.9.2.4.war包,而后拷贝到tomcat下的webapps目录中

第二步:启动tomcat 默认登陆帐户密码为: admin  admin123  

第三步:访问http://localhost:8080/项目名称/

1.7.4. 认识repository

Nexus仓库的默认的地址, nexus-2.1.2\WEB-INF\plexus.properties 中定义的

Views/Repositories-->Repositories里进行配置, nexus里能够配置3种类型的仓库,分别是proxyhostedgroup

proxy:是远程仓库的代理。好比说在nexus中配置了一个central repositoryproxy,当用户向这个proxy请求一个artifact,这个proxy就会先在本地查找,若是找不到的话,就会从远程仓库下载,而后返回给用户,至关于起到一个中转的做用

Hosted:是宿主仓库,用户能够把本身的一些构件,deployhosted中,也能够手工上传构件到hosted里。好比说oracle的驱动程序,ojdbc6.jar,在central repository是获取不到的,就须要手工上传到hosted

Group:是仓库组,在maven里没有这个概念,是nexus特有的。目的是将上述多个仓库聚合,对用户暴露统一的地址,这样用户就不须要在pom中配置多个地址,只要统一配置group的地址就能够了右边那个Repository Path能够点击进去,看到仓库中artifact列表。不过要注意浏览器缓存。我今天就发现,明明构件已经更新了,在浏览器里却看不到,还觉得是BUG,实际上是被浏览器缓存了

virtual也是中央仓库镜像,支持M1老版本

1.7.5. 每一个仓库的做用

3rd party: 没法从公共仓库得到的第三方发布版本的构件仓库
Apache Snapshots: 用了代理ApacheMaven仓库快照版本的构件仓库
Central: 用来代理maven中央仓库中发布版本构件的仓库
Central M1 shadow: 用于提供中央仓库中M1格式的发布版本的构件镜像仓库
Codehaus Snapshots: 用来代理CodehausMaven 仓库的快照版本构件的仓库
Releases: 用来部署管理内部的发布版本构件的宿主类型仓库
Snapshots:用来部署管理内部的快照版本构件的宿主类型仓库

 

 

 

 

 

1.7.6. Central Repository

最关键的一个配置, 就是Central Repositoryproxy配置,由于大部分的构件,都是要经过这个proxy获得的,

1.7.7. 配置Hosted Repository

通常会配置3hosted repository, 分别是3rd partySnapshotsReleases,分别用来保存第三方jar(典型的好比ojdbc6.jar),项目组内部的快照、项目组内部的发布版, 这里并无什么特别的配置,只是Deployment Policy这个选项,通常Snapshots会配置成容许,而Releases3rd party会设置为禁止

 

 

1.7.8. 配置group repository

前面说过group实际上是一个虚拟的仓库, 经过对实体仓库(proxyhosted)进行聚合, 对外暴露一个统一的地址这里要注意的是,放到左边的仓库,才是会被聚合的仓库

 

 

1.7.9. 从私服中下载资源

l 能够在支持Maven的项目中进行以下配置

<repositories>

  <repository>

  <id>shop</id>

  <name>仓库介绍</name>

  <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url>

  </repository>

 </repositories>

 <pluginRepositories>

  <pluginRepository>

  <id>plugin</id>

  <name>插件下载地址</name>

  <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url>

  </pluginRepository>

 </pluginRepositories>

l 也能够把地址配置在setting.xml<profiles>标签中这样对全部项目都生效

<profiles>

      <repositories>

<repository>

<id>shop</id>

<name>仓库介绍</name>

<url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url>

</repository>

</repositories>

<pluginRepositories>

   <pluginRepository>

   <id>plugin</id>

   <name>插件下载地址</name> <url>http://localhost:8080/nexus-2.1.2/content/groups/public/</url>

   </pluginRepository>

</pluginRepositories>

 </profiles>

l 把本地项目提交到私服中

<distributionManagement>

<repository>

<!-- 要在我的的setting.xml中配置上传的密码 -->

<id>snapshots</id>

<name>snapshots 测试版</name>

<!-- nexus中查找相应的地址-->

        <url>http://localhost:8080/nexus/content/repositories

            /snapshots/</url>

</repository>

</distributionManagement>

 

<servers>

    <!-- 在.m2\setting.xml中 配置了要上传仓库的密码 -->

<server>

<id>snapshots</id>

<username>admin</username>

<password>admin123</password>

</server>

<server>

<id>releases</id>

<username>admin</username>

<password>admin123</password>

</server>

  </servers>

1.8. 其它小技巧

1.8.1. 跳过单元测试

你可能想要配置 Maven 使其彻底跳过单元测试。 可能你有一个很大的系统,单元测试须要花好多分钟来完成,而你不想在生成最终输出前等单元测试完成。 你可能正工做在一个遗留系统上面,这个系统有一系列的失败的单元测试,你可能仅仅想要生成一个 JAR 而不是去修复全部的单元测试。 Maven 提供了跳过单元测试的能力

l 采用命令的方式跳过单元测试

$ mvn install -D maven.test.skip=true

l 采用配置的方式跳过单元测试

surefire 插件用来在maven构建生命周期的test 的插件, 若是每次都不须要运行test则经过简单的配置便可

<build>

<plugins>

<plugin>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.7.1</version>

<configuration>

<skip>true</skip>

</configuration>

</plugin>

</plugins>

</build>

1.8.2. 代码的方式生成maven骨架

Archetype能够帮助咱们迅速地构建起项目的骨架,在前面的例子中,咱们彻底能够在Archetype生成的骨架的基础上开发Hello World项目以节省大量时间,若是没有制定packageName则默认与goupId相同

mvn archetype:create -D groupId=com.test.maven -D artifactId=test1 -D packageName=a.b.c

相关文章
相关标签/搜索