工程化管理--maven
mavne模型
可以看出 maven构件都是由插件支撑的
maven的插件位置在:F:\MavenRepository\org\apache\maven\plugins
Maven仓库布局
- 本地仓库
默认情况下,不管是在windows还是linux上,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。有时候,因为某些原因(例如C盘空间不够),用户会想要自定义本地仓库目录地址。这时,可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。例如:
<settings>
<localRepository>D:\java\repository\</localRepository>
</settings>
- 远程仓库
安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令之后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。 - 中央仓库
可以使用解压工具打开jar文件$M2_HOME/lib/maven-model-builder-3.0.jar,里面可以看到pom.xml中的中央仓库配置,并且可以看到maven项目结构的定义 - 私服
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服上供大家使用。
dependency依赖中scope范围
- compile
默认编译依赖范围。对于编译,测试,运行三种classpath都有效 - test
测试依赖范围。只对于测试classpath有效,只对测试代码有效 - provided
已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api,打包的时候这个包不会打进去 - 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=RandomTest,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的更多相关文章
- 使用Nexus管理Maven仓库时,上传带依赖的第三方jar
总所周知,使用Maven构建非常方便.在企业中使用Nexus创建私服来管理Maven时,需要上传很多没有开放源码的第三方Jar包.本文将讲述当第三方Jar包有很多并且互相有依赖时如何上传. 核心操作 ...
- Github/Eclipse管理Maven项目
Eclipse和Git插件 (To-do: 直接从workspace导入也可以,弄明白这个repo管理的本质,查看sprigmvc是如何导入的) 最新版本的Eclipse都直接集成了Git插件 Ecl ...
- 持续交付之软件包管理maven篇
背景 持续交付的我们常见的流程如下,其中有一个环节就是软件包管理 今天我们以maven仓库为示例,如下是Jenkins与CD生态: 持续交付的示例 5 Principles 五个原则 Deliver ...
- Linux 项目上线管理 MAVEN + expect 一台机器管理所有机器的应用程序
一.目的 在一台服务器上面管理所有机器的应用程序. 设想是通过一条命令能够知道所有应用程序是否running 如果not running 查看具体项目的log 跟踪具体原因,程序问题汇报相关负责人 二 ...
- git管理maven项目实现
1,在自己的git网新建一个项目.复制项目的地址. 2.在合适的目录 执行 git clone命令,这样就把git的本地仓库建立好了. 3,java中 ,新建maven项目, 在location这里 ...
- 使用命令行管理maven项目
创建maven java项目 自己创建一个文件夹,进入cmd,(shift+鼠标右键)这样创建的maven[java]项目就在该文件夹下了. 打开cmd第一种方式 打开cmd第二种方式 命令:mvn ...
- 使用Nexus管理maven仓库,setting文件理解
来到新公司对很多陌生的技术一头雾水,以前在工作中没有真正使用过maven,于是强迫自己蛋定下来一个一个的突破,下面是我对maven的setting配置文件的理解,由于是现学的,难免可能会理解偏差,还请 ...
- 使用Apache Archiva管理Maven仓库
1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...
- maven管理工具
Maven解决的问题: 1. 使用maven前搭建项目需要引入各种jar包,并且还可能有jar包冲突的问题 解决jar包冲突的方式: 1. 第一声明优先原则 2. 路径近者优先原则. 直接依赖路径比传 ...
随机推荐
- VS05错误:部署WEB文件失败
直接生成一个空项目就不存在这个问题了.
- JAVA学习之HashCode
public native int hashCode(); 返回该对象的哈希码值.支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能. 一.HashCode ...
- 【Python】从1<2<3的语法糖说起
python有一个很有意思的语法糖你可以直接写1<2<3. 这复合我们通常意义上的数学不等式,但对学过C等语言其实是有疑惑的. 我们知道不等式返回的其实是个Bool值,在C中是1,0因此C ...
- 【.Net】Visual Studio的调试技巧
这是我写的关于VS2010和.Net4发布的博客系列的第26篇. 今天的博文包含了一些有用的能用于VS的调试技巧. 我的朋友Scott Cate(他写了很多很好的关于VS使用技巧和窍门的博客)最近向我 ...
- BZOJ 1227 虔诚的墓主人(离散化+树状数组)
题目中矩形的尺寸太大,导致墓地的数目太多,如果我们统计每一个墓地的虔诚度,超时是一定的. 而常青树的数目<=1e5.这启发我们从树的方向去思考. 考虑一行没有树的情况,显然这一行的墓地的虔诚度之 ...
- 【bzoj1901】Zju2112 Dynamic Rankings 离散化+主席树+树状数组
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...
- 2015 EC L - Multiplication Table
/************************************************************************* > File Name: L.cpp > ...
- [洛谷P2495][SDOI2011]消耗战
题目大意:有一棵$n(n\leqslant2.5\times10^5)$个节点的带边权的树,$m$个询问,每次询问给出$k(\sum\limits_{i=1}^mk_i\leqslant5\times ...
- Spring-Boot基于配置按条件装Bean
背景 同一个接口有多种实现,项目启动时按某种规则来选择性的启用其中一种实现,再具体一点,比如Controller初始化的时候,根据配置文件的指定的实现类前缀,来记载具体Service,不同Servic ...
- Android 常用控件自定义样式RadioButton、CheckBox、ProgressBar、
一.RadioButton / CheckBox 系统自带的RadioButton/CheckBox的样式,注定满足不了实际运用中的情况,有时候自定义自己的样式:此次把自己中工作学习过程中所学到的东西 ...