mavne模型

可以看出 maven构件都是由插件支撑的

maven的插件位置在:F:\MavenRepository\org\apache\maven\plugins

Maven仓库布局

  1. 本地仓库

    默认情况下,不管是在windows还是linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。有时候,因为某些原因(例如C盘空间不够),用户会想要自定义本地仓库目录地址。这时,可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。例如:
<settings>  
    <localRepository>D:\java\repository\</localRepository>  
</settings> 
  1. 远程仓库

    安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。
  2. 中央仓库

    可以使用解压工具打开jar文件$M2_HOME/lib/maven-model-builder-3.0.jar,里面可以看到pom.xml中的中央仓库配置,并且可以看到maven项目结构的定义
  3. 私服

    私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。

dependency依赖中scope范围

  1. compile

    默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  2. test

    测试依赖范围。只对于测试classpath有效,只对测试代码有效
  3. provided

    已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api,打包的时候这个包不会打进去
  4. runtime

    运行时提供。例如:jdbc驱动

Compile、runtime打包会打进去,test、provided打包不会打进去

传递性依赖原则

jar 包具有传递性依赖

1. 路径最近者优先 C--->B--->A,C依赖B,B依赖A,会先用B的jar包

2. 路径相同,第一声明者优先:C-->B,C-->A,必须看B和A在C中哪一个先声明,也就是 在pom的顺序,谁先在前面就先用谁的jar包

Maven单元测试

  • 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类。
  • . 跳过测试
mvn package -DskipTests  
#或者
<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-surefire-plugin</artifactId>  
    <version>2.5</version>  
    <configuration>  
        <skipTests>true</skipTests>  
    </configuration>  
</plugin>  
#或者
mvn package -Dmaven.test.skip=true  跳过测试代码的编译
  • 动态指定要运行的测试用例

    maven-surefire-plugin提供了一个test参数让Maven用户能够在命令行指定要运行的测试用例。如:

    mvn test -Dtest=RandomGeneratorTest 

    也可以使用通配符:

    mvn test -Dtest=RandomTest  

    或者也可以使用“,”号指定多个测试类:

    mvn test -Dtest=Random
    Test,AccountCaptchaServiceTest
  • 包含与排除测试用例
<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> 

Maven的聚合和继承

聚合

所谓聚合,顾名思义,就是把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的Maven project

建立该project的时候,我们要注意以下几点:

1、本身也做为一个Maven项目,它必须有自己的POM,没有实际意义,只是管理jar包用,也没有代码

2、它的打包方式必须为: pom

3、引入了新的元素:modules---module

4、版本:聚合模块的版本和被聚合模块版本一致

5、relative path:每个module的值都是一个当前POM的相对目录

6、聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。

继承

1.说到继承肯定是一个父子结构,创建一个parent project

2.: 作为父模块的POM,其打包类型也必须为POM

3.结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录

4.新的元素: , 它是被用在子模块中的

5.元素的属性:: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找

6.relativePath的默认值: ../pom.xml

7.子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素

Maven配置文件动态切换


<!-- 指行命令动态替换文件内容:mvn package -P test --> <build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins> <resources>
<resource>
<!--
directory:
配置那个目录下的文件通过${key}会被替换成属性值,resource目录下的配置文件
资源所在目录
-->
<directory>src/main/resources</directory>
<!--
自动指定的方式
includes:
指定那个目录下那个文件
-->
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource> <!--
手动指定的方式:
设置对jdbc.properties进行过虑,即这些文件中的${key} 或 @key@会被替换掉为真正的值
-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>conf/jdbc.properties</include>
</includes>
<!--
filtering这里指定启用过滤功能
这个配置的意思是过滤上面指定属性文件中的占位符,占位符是${变量名称}这样的形式,
maven会自动读取配置文件,然后解析其中的占位符,使用pom文件中定义的属性进行替换
-->
<filtering>true</filtering> <!--
<exclueds>:
在resource目录下,有很多文件,但用些文件不希望替换,则可以通过<excluede>指定
-->
</resource>
</resources> <!--
这里的filters与<profile>的filter意思一样,都是指属性文件地址,
这个如果定义<profile>的时候指定了,这里就不需要了,
但有些开发习惯是在<profile>不定义,然后在<build>里指定
-->
<!--<filters>-->
<!--</filters>-->
</build> <!--环境配置-->
<profiles>
<profile>
<id>test</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<jdbc.driver>test.mysql</jdbc.driver>
<jdbc.url>test.url</jdbc.url>
<jdbc.username>test.username</jdbc.username>
<jdbc.password>test.password</jdbc.password>
</properties>
<build>
<filters>
<!-- 使用这个配置文件的值,替换配置文件中的 ${key} 或 @key@ -->
<filter>src/main/conf/test.properties</filter>
</filters>
</build>
</profile>
<profile>
<id>dev</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<jdbc.driver>dev.mysql</jdbc.driver>
<jdbc.url>dev.url</jdbc.url>
<jdbc.username>dev.username</jdbc.username>
<jdbc.password>dev.password</jdbc.password>
</properties>
</profile>
<profile>
<id>product</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--属性key 属性value-->
<jdbc.driver>product.mysql</jdbc.driver>
<jdbc.url>product.url</jdbc.url>
<jdbc.username>product.username</jdbc.username>
<jdbc.password>product.password</jdbc.password>
</properties>
</profile>
</profiles>

Maven私服

nexus 账号:admin 密码:admin123

<!--配置从私服下载-->
<!--配置文件和顺序:MAVEN_HOME/conf/setting.xml ~/.m2/setting.xml- project-->
<!--配置所有构件均从私服下载,在~/.m2/setting.xml中配置如下:-->
<settings>
<mirrors>
<mirror>
<!--此处配置所有的构建均从私有仓库中下载 *代表所有,也可以写central -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://192.168.1.100:8000/nexus/content/groups/public</url>
</mirror>
</mirrors> <profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://39.108.193.58:8080/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories> <pluginRepositories>
<pluginRepository>
<id>nexus</id>
<url>http://39.108.193.58:8080/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles> <activeProfiles>
<!--make the profile active all the time -->
<activeProfile>nexus</activeProfile>
</activeProfiles>
<!--或者Pom.xml中的配置 开始-->
<repositories>
<repository>
<id>central</id>
<url>http://localhost:8000/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories> <pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://localhost:8000/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<!--或者Pom.xml中的配置 结束--> <!--配置上传到私服:-->
<distributionManagement>
<repository>
<id>releases</id>
<name>Internal Releases</name>
<url>http://localhost:8000/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Internal Snapshots</name>
<url>http://localhost:8000/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement> <!--Nexus的访问权限控制,在~/m2/setting.xml中配置如下:-->
<!-- 设置发布时的用户名 -->
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>

工程化管理--maven的更多相关文章

  1. 使用Nexus管理Maven仓库时,上传带依赖的第三方jar

    总所周知,使用Maven构建非常方便.在企业中使用Nexus创建私服来管理Maven时,需要上传很多没有开放源码的第三方Jar包.本文将讲述当第三方Jar包有很多并且互相有依赖时如何上传. 核心操作 ...

  2. Github/Eclipse管理Maven项目

    Eclipse和Git插件 (To-do: 直接从workspace导入也可以,弄明白这个repo管理的本质,查看sprigmvc是如何导入的) 最新版本的Eclipse都直接集成了Git插件 Ecl ...

  3. 持续交付之软件包管理maven篇

    背景 持续交付的我们常见的流程如下,其中有一个环节就是软件包管理 今天我们以maven仓库为示例,如下是Jenkins与CD生态: 持续交付的示例 5 Principles 五个原则 Deliver ...

  4. Linux 项目上线管理 MAVEN + expect 一台机器管理所有机器的应用程序

    一.目的 在一台服务器上面管理所有机器的应用程序. 设想是通过一条命令能够知道所有应用程序是否running 如果not running 查看具体项目的log 跟踪具体原因,程序问题汇报相关负责人 二 ...

  5. git管理maven项目实现

    1,在自己的git网新建一个项目.复制项目的地址. 2.在合适的目录  执行 git clone命令,这样就把git的本地仓库建立好了. 3,java中 ,新建maven项目, 在location这里 ...

  6. 使用命令行管理maven项目

    创建maven java项目 自己创建一个文件夹,进入cmd,(shift+鼠标右键)这样创建的maven[java]项目就在该文件夹下了. 打开cmd第一种方式 打开cmd第二种方式 命令:mvn ...

  7. 使用Nexus管理maven仓库,setting文件理解

    来到新公司对很多陌生的技术一头雾水,以前在工作中没有真正使用过maven,于是强迫自己蛋定下来一个一个的突破,下面是我对maven的setting配置文件的理解,由于是现学的,难免可能会理解偏差,还请 ...

  8. 使用Apache Archiva管理Maven仓库

    1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...

  9. maven管理工具

    Maven解决的问题: 1. 使用maven前搭建项目需要引入各种jar包,并且还可能有jar包冲突的问题 解决jar包冲突的方式: 1. 第一声明优先原则 2. 路径近者优先原则. 直接依赖路径比传 ...

随机推荐

  1. phpcms 最多上传 10 个附件 解决办法

    修改文件:/phpcms/libs/classes/form.class.php

  2. opencv里vector的内存的申请和释放的问题

    改成: ); CvSeq * m_contour=; cvFindContours( &IPlImage(img), m_storage, &m_contour, ,)); //释放内 ...

  3. delphi 窗体的创建和释放

    Delphi中的窗体分为模式窗体和无模式窗体.二者的区别在于,用户可以在无模式窗体和其他窗体之间切换.这样,用户就可以同时工作于一个应用程序的几个部分.Delphi中窗体的初始化有两种情况,动态创建, ...

  4. opencv 和 parfor

    一次遇到两个不熟悉的,因此在一起记一下. OpenCV的全称是:Open Source Computer Vision Library. OpenCv是一个基于(开源)发行的跨平台计算机视觉库,可以运 ...

  5. Python高级数据类型模块collections

    collections模块提供更加高级的容器数据类型,替代Python的内置dict,list, set,和tuple  Counter对象 提供计数器,支持方便和快速的计数.返回的是一个以元素为键, ...

  6. 详细图解jQuery对象,以及如何扩展jQuery插件

    详细图解jQuery对象,以及如何扩展jQuery插件 早几年学习前端,大家都非常热衷于研究jQuery源码.我还记得当初从jQuery源码中学到一星半点应用技巧的时候常会有一种发自内心的惊叹,“原来 ...

  7. CentOS ACL

    ACL:访问控制列表(Access Control List). 一般来说权限是针对某一类用户设置的.例如:一个文件只有拥有者.组.其他用户三种设置方式,如果希望对某个指定的用户进行单独的权限控制,就 ...

  8. BZOJ1202 [HNOI2005]狡猾的商人 【并查集】

    1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4180  Solved: 2015 [Submit][S ...

  9. UVA.129 Krypton Factor (搜索+暴力)

    UVA.129 Krypton Factor (搜索+暴力) 题意分析 搜索的策略是:优先找长串,若长串不合法,则回溯,继续找到合法串,直到找到所求合法串的编号,输出即可. 注意的地方就是合法串的判断 ...

  10. HDOJ.1789 Doing Homework again (贪心)

    Doing Homework again 点我挑战题目 题意分析 给出n组数据,每组数据中有每份作业的deadline和score,如果不能按期完成,则要扣相应score,求每组数据最少扣除的scor ...