1.maven入门

一、MAVEN能做什么?

  1. 清理项目 mvn clean
  2. 编译项目 mvn compiler
  3. 测试项目 mvn test
  4. 生成测试报告
  5. 打包项目 mvn package
  6. 部署项目

二、安装maven

  1. 下载maven,解压至/Users/QQ960911789
  2. 配置环境变量
export M2_HOME=/Users/QQ960911789/apache-maven-3.5.0
export PATH=$PATH:$M2_HOME/bin

三、MAVEN项目结构

src
--main
----java ——存放项目的.java文件
----resources ——存放项目资源文件,如spring
--test
----java ——存放所有测试.java文件,如JUnit测试类
----resources ——存放项目资源文件,如spring
target ——项目输出位置
pom.xml ——用于标识该项目是一个Maven项目


四、Pom.xml配置

<?xml version="1.0"?>
<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.foxconn.zqq</groupId>
 <artifactId>testMaven</artifactId>
 <version>SNAPSHOT-1.0.0</version> 
</project>

POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。在Maven世界中,project可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。

五、创建项目如下

testMaven
pom.xml
mkdir命令 创建文件夹
touch命令 创建文件


运行 mvn clean
运行 mvn package


groupId:定义maven的项目,可以用包名
artifactId:定义项目中的一个模块,一般都是工程名
version:版本
packaging:定义打包方式
坐标的作用:
用来唯一标识一个构件,在依赖里面根据坐标来找需要的构件。

六、引入junit并测试

切换到IDEA工具下开发该项目
pom.xml,编写后IDEA有提示是否默认导入maven包,选择即可

<?xml version="1.0"?>
<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.foxconn.zqq</groupId>    
<artifactId>testMaven</artifactId>   
<version>SNAPSHOT-1.0.0</version>    
 
<dependencies>      
  <dependency>         
     <groupId>junit</groupId>         
     <artifactId>junit</artifactId>   
     <version>4.11</version>  
  </dependency>    
</dependencies>
</project>

创建类时,应注意创建在src/test文件夹下以Test为结尾的类,与surefire测试插件有关,如果创建不满足规则的测试类,则不会运行带有@Test的方法;如果编写类时,引入@Test注解报错:Annotation not allowed here,删除该类再创建即可

package com.foxconn.zqq;
import org.junit.Test;
public class HelloTest {    
  @Test    
  public void test(){        
    System.out.println("hello test");   
   }
}
import org.junit.Test;
public class MyTest {    
  @Test    
  public void test(){       
   System.out.println("MyTest m test method running");    
  }   
  @Test   
  public void test2(){        
    System.out.println("test2 a a a ");    
  }
}

View-Tool Windows-Terminal或者Alt+F12 ,mvn test,测试src/test下的测试类


执行mvn 测试命令

七、Maven单元测试

1.maven-surefire-plugin简介
Maven本身并不是一个单元测试框架,它只是在构建执行到特定生命周期阶段的时候,通过插件来执行JUnit或者TestNG的测试用例。这个插件就是maven-surefire-plugin,也可以称为测试运行器(Test Runner),它能兼容JUnit 3、JUnit 4以及TestNG。
在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/java/)下所有符合一组命名模式的测试类。这组模式为:
*/Test.java:任何子目录下所有命名以Test开关的Java类。
*/Test.java:任何子目录下所有命名以Test结尾的Java类。
*/TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。
2.跳过测试
打包时经常不需要测试,需要跳过test,因为test中都是对接口的单元测试,如果测试不通过,则不能正常打包;
测试中的方法会执行,速度慢
①mvn package -Dmaven.test.skip=true


测试报告:

②pom.xml中配置跳过测试

<?xml version="1.0"?>
<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.foxconn.zqq</groupId>   
<artifactId>testMaven</artifactId>    
<version>SNAPSHOT-1.0.0</version>   

<dependencies>      
  <dependency>        
    <groupId>junit</groupId>          
    <artifactId>junit</artifactId>       
    <version>4.11</version>     
   </dependency>    
</dependencies>     
<build>     
   <!--修改生成的jar/war的名称-->   
     <finalName>testMaven-1.0</finalName>    
     <plugins>    
        <plugin>        
          <groupId>org.apache.maven.plugins</groupId>    
          <artifactId>maven-surefire-plugin</artifactId>     
          <version>2.5</version> 
          <configuration>              
             <skipTests>true</skipTests>   
           </configuration>          
  </plugin>      
  </plugins>  
  </build>
</project>

可以看到,运行mvn package时,已跳过测试


3.动态指定要运行的测试用例
maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。如:
mvn test -Dtest=RandomGeneratorTest
也可以使用通配符:
mvn test -Dtest=RandomTest
或者也可以使用“,”号指定多个测试类:
mvn test -Dtest=Random
Test,AccountCaptchaServiceTest
4.包含与排除测试用例

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-surefire-plugin</artifactId>  
    <version>2.5</version>  
    <configuration>  
        <includes>  
            <include>**/*Tests.java</include>  
        </includes>  
        <excludes>  
            <exclude>**/*ServiceTest.java</exclude>  
            <exclude>**/TempDaoTest.java</exclude>  
        </excludes>  
    </configuration>  
</plugin>  

5.生成测试报告
5.1基本测试报告
默认情况下,maven-surefire-plugin会在项目的target/surefire-reports目录下生成两种格式的错误报告。
简单文本格式——内容十分简单,可以看出哪个测试项出错。
与JUnit兼容的XML格式——XML格式已经成为了Java单元测试报告的事实标准,这个文件可以用其他的工具如IDE来查看。

八、mvn package

打包时,执行mvn package(默认也会执行src/test文件夹下的test方法)


打包位置:默认生成jar包(在pom.xml的packaging配置),位置如下

九、maven插件

maven的命令及相关骨架都是插件

十、maven概念模型


依赖管理模型
Maven仓库布局
1、本地仓库
默认情况下,不管是在windows还是linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。有时候,因为某些原因(例如C盘空间不够),用户会想要自定义本地仓库目录地址。这时,可以拷贝apache-maven-3.5.0中的settings.xml文件拷贝至~/.m2/settings.xml,然后编辑,设置localRepository元素的值为想要的仓库地址。例如:

<settings>  
    <localRepository>D:\java\repository\</localRepository>  
</settings> 

2、远程仓库
安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。
3、中央仓库(位置在美国)
可以使用解压工具打开jar文件$M2_HOME/lib/maven-model-builder-3.0.jar,里面可以看到pom.xml中的中央仓库配置
4、私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。

3.中央仓库:
apache-maven-3.5.0/lib


最顶层pom文件:modelVersion、中央仓库位置、插件中央仓库位置、相应的target等位置定义
本地仓库:~/.m2/repository
本地插件仓库:命令行使用的命令依赖于该插件库

用jd-gui反编译工具或者360解压工具查看
如下,定义了modelVersion版本4.0.0,同理项目中也应与此保持一致;
定义了中央仓库,插件仓库,maven目录结构

十一、dependency依赖中scope范围

1、compile
默认编译依赖范围。对于编译,测试,运行三种classpath都有效
2、test
测试依赖范围。只对于测试classpath有效,只对测试代码有效
3、provided
已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api,打包的时候这个包不会打进去
4、runtime
运行时提供。例如:jdbc驱动
Compile、runtime打包会打进去,test、provided打包不会打进去
5、传递性依赖原则
1.路径最近者优先 CBA,C依赖B,B依赖A,会先用B的jar包
例:C的pom.xml依赖B,B的pom.xml依赖A
B中junit-4.10,A中junit-4.11,就近原则,C中引用junit-4.11
2.路径相同,第一声明者优先:CB,CA,必须看B,A在C中哪一个先声明
例:C的pom.xml依赖B,C的pom.xml依赖A
B中junit-4.10,A中junit-4.11,就近原则,
C中先引用B,C中引用junit-4.10
C中先引用A,C中引用junit-4.11

同一个工程中的模块可以相互依赖,idea中是project的概念,如果通过maven依赖,需要先在本project中查找,而后在本地仓库,镜像,中央仓库查找,
1.如果是本地2个不同的project,则需要通过mvn install,上传至本地仓库
2.在1个project中建立不同的module,可以配置依赖
1.project:test1710/project:test171002
test171002



test1710:



2.project下不同的module
project:test02 module:test02A/module:test02B/module:test02C

test02A

<groupId>com.foxconn.zqq</groupId>
<artifactId>test02A</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<dependencies>  
     <dependency>    
          <groupId>junit</groupId>    
          <artifactId>junit</artifactId>    
          <version>4.11</version>  
     </dependency>
</dependencies>

test02B

<groupId>com.foxconn.zqq</groupId>
<artifactId>test02B</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<dependencies>  
    <dependency>    
        <groupId>junit</groupId>    
        <artifactId>junit</artifactId>    
        <version>3.8.1</version>  
        </dependency>
</dependencies>

test02C

<groupId>com.foxconn.zqq</groupId>
<artifactId>test02C</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<dependencies>  
     <dependency>    
          <groupId>com.foxconn.zqq</groupId>    
          <artifactId>test02A</artifactId>    
          <version>1.0-SNAPSHOT</version>  
    </dependency>  
    <dependency>    
          <groupId>com.foxconn.zqq</groupId>    
          <artifactId>test02B</artifactId>    
          <version>1.0-SNAPSHOT</version>  
  </dependency>
</dependencies>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容