首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

Maven从入门到精通,小白也能快速上手

2 --> 我是陈皮,一个在互联网 Coding 的 ITer。 文章目录 1 Maven 简介 2 构建工具 3 Maven 安装与配置 4 IDEA,Eclipse 配置 Maven 4.1 IDEA 配置 Maven 4.2 Eclipse 配置 Maven 5 依赖管理 6 Maven 仓库 7 Maven 项目结构 8 插件机制 9 Maven 命令 10 使用 IDEA 创建简单 Maven 项目 11 使用 Maven 构建多模块项目 12 pom.xml 文件标签大全详解 1 Maven 简介 Maven 是 Apache 组织下的一个纯 Java 开发的开源项目。基于项目对象模型(POM)概念,Maven 是一个项目管理工具,提供对 Java 项目进行构建、打包、部署、依赖管理以及项目信息管理等功能。当然,Maven 也可用于构建和管理其他语言项目,例如 C#,Ruby,Scala 等。 我们平时开发一个项目,做的事情就是搭建项目框架,写代码,单元测试,编译构建,生成文档,打包部署等等工作。其实程序员更应该将精力用在写代码上,而其他比较固定的繁琐步骤不应该我们每次去处理。使用 Maven 就可以将这些步骤进行自动化管理,节省了开发时间,提高开发效率。 Maven 有一个生命周期,当我们运行一些 Maven 命令的时候,Maven 会执行一系列的有序的步骤,例如清除,编译,测试,打包等等,直到到达指定的生命周期。 Maven 官网地址:http://maven.apache.org/ 2 构建工具 Maven 不是唯一的项目构建,管理工具,下面介绍主要的三个构建工具,推荐使用 Maven 和 Gradle。 Ant:比较早的 Java 构建工具,对工程构建过程控制比较灵活,但是使用的 xml 脚本格式文件比较大,逐渐很少人使用了。 Maven:改善了 Ant 的缺点,可以从网上下载依赖,也是使用 xml 格式配置文件,更加专注依赖管理,目前大多数公司使用。 Gradle:结合 Ant 的灵活和 Maven 生命周期管理的优点,不再使用 xml 格式配置文件,而是使用 DSL 脚本格式,使用 groovy 语言编写,更加灵活,是比较新型的构建工具,目前在一些初创互联网公司使用比较多,以后可能会成为主流。 3 Maven 安装与配置 因为 Maven 是用 Java 开发的,所以首先要安装 JDK,推荐使用 JDK1.8 以上版本。以下是我使用的 JDK 版本。 C:\Users\Administrator>java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode) 下载 Maven 安装包,可以在官网下载,目前最高版本是 3.8.1:http://maven.apache.org/download.cgi 其他历史版本下载地址:https://archive.apache.org/dist/maven/maven-3/,目前我使用的是 3.6.3 版本。 下载完后解压到你想解压的目录(最好不要使用中文和空格的目录) 然后在系统环境变量中配置 MAVEN_HOME,值是你解压到的 Maven 目录;再将 bin 目录配置到 path 环境变量中。 MAVEN_HOME:D:\devTools\apache-maven-3.6.3(解压所在目录) PATH:%MAVEN_HOME%\bin 验证是否安装成功,打开cmd窗口,输入 mvn -v,出现如下信息则安装成功。 C:\Users\Administrator>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\devTools\apache-maven-3.6.3\bin\.. Java version: 1.8.0_144, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_144\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows" 修改 Maven 配置(可选),主要是修改资源下载地址,因为默认下载地址是 Google,下载速度会很慢,可以修改国内的例如阿里云的。其次是修改下载资源的存放位置,如果不修改,默认是 c 盘用户目录下的 .m2 路径中。 Maven 配置文件在解压后的 conf 目录下,settings.xml 文件。修改资源下载地址为阿里云,以及修改资源库存放位置。 <!-- 资源库存放位置 --> <localRepository>D:\MavenRepository</localRepository> <!-- 资源下载地址 --> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> 4 IDEA,Eclipse 配置 Maven 4.1 IDEA 配置 Maven IDEA 配置 Maven,有两种方式,一种是针对本项目,只对此项目有效;一种是全局配置,针对所有新项目生效,一般我们会配置全局性的。 针对单项目配置 路径:File | Settings | Build, Execution, Deployment | Build Tools | Maven。 全局配置 路径:File | Other Settings | Settings for New Projects | Build, Execution, Deployment | Build Tools | Maven。 4.2 Eclipse 配置 Maven 路径:Window | Preferences | Maven | User Settings 5 依赖管理 Maven 其中一个核心特性就是依赖管理。我们开发的项目基本会使用外部依赖,或者我们需要处理多模块项目的模块之间的依赖,这些依赖关系非常复杂,管理起来比较困难。使用 Maven 管理依赖能大大降低难度。 Maven 对于依赖管理一个特点是可传递性依赖发现,比如我们项目依赖于 A,A 又依赖于 B,如果我们手动添加的话,需要将 A 和 B 两个依赖都下载引入项目。而使用 Maven 来构建项目的话,我们只需要显示引入依赖 A,Maven 会通过读取项目文件(pom.xml),找出它们项目之间的依赖关系,将 A 和 B 都引入进来。 Maven 使用坐标管理依赖,坐标包含三个标识信息,通过坐标可以唯一标识一个依赖。任何基于 Maven 构建的项目都必须定义这三个信息,包括我们自己开发的项目。可以在 https://mvnrepository.com/ 查找依赖。 group:定义当前项目所属组织或公司的唯一标识,一般为组织或者公司名称域名倒写(也可以是域名倒写+项目名),例如 com.alibaba artifactId:项目的唯一 ID,一般是实际项目名称或者实际项目的一个模块名称(如果项目比较大,会划分多模块,例如 spring-core,spring-bean),例如 fastjson version:项目的版本号,例如 1.2.76 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> Maven 对于依赖管理有以下基本原则: 依赖管理:可传递性依赖发现,Maven 会通过读取项目文件(pom.xml),找出项目之间的依赖关系,然后将需要的所有依赖引入进来。 依赖调节:当一个依赖的不同版本在依赖树里的深度是一样时,第一个被声明的依赖将会被使用。 依赖范围:可以指定依赖的使用范围,即项目在构建过程每个阶段所包含的依赖。 依赖排除:任何可传递的依赖都可以通过 “exclusion” 元素被排除在外。例如,A 依赖 B, B 依赖 C,A 可以标记 C 为 “被排除的”。 依赖可选:任何可传递的依赖可以通过 “optional” 元素 标记为可选的。例如,A 依赖 B, B 依赖 C。B 可以标记 C 为可选的, 这样 A 就可以不再使用 C。 依赖的范围可选项如下: compile:编译范围,也是默认的依赖范围。使用此范围的依赖,在编译,测试,运行时三种 classpath 都有效。 provided:已提供范围。使用此范围的依赖,在编译,测试 classpath 中有效,在运行时 classpath 无效。例如 servlet-api 依赖,编译和测试需要此依赖,但是在运行时不需要,因为容器已经提供了。 test:测试范围。该范围表明相关依赖只在测试编译阶段和执行阶段。 runtime:运行时范围。在测试和运行时有效,编译期无效。例如 JDBC 驱动实现,在项目编译时只需要 JDK 提供的 JDBC 接口,只有在测试和运行时才真正需要 JDBC 接口的实现类,即 具体的 JDBC 驱动。 system:系统范围。此依赖范围和 provided 一样,但是它必须显示通过 systemPath 指定依赖文件的路径。这种依赖不是由 Maven 中央仓库解析的,一般是本地的某个路径下的依赖。 optional:表明依赖是可选的。 exclusions:用来排除传递性依赖。 这里讲下依赖范围为 system 的情况,项目如何引入外部依赖。首先将下载好的外部依赖,放入到项目已经创建好的文件夹里(例如 libs)。 在项目的 pom.xml 文件中添加依赖 <dependency> <groupId>com.alibaba</groupId> <!-- 可以自定义 --> <artifactId>fastjson</artifactId> <!--可以自定义--> <version>1.2.75</version> <scope>system</scope> <systemPath>${basedir}\libs\fastjson-1.2.75.jar</systemPath> </dependency> 6 Maven 仓库 基于 Maven 构建的项目,项目需要的依赖首先会在本地仓库中查找,如果没有找到则会从远程仓库下载到本地仓库。如果这两者都没有找到,Maven 就会报错。 远程仓库可以分为中央仓库,其他公共库以及私服。 中央仓库是 Maven 默认的远程仓库。地址:https://repo.maven.apache.org 其他公共库一般是中央仓库的镜像加速库,因为中央仓库在国外,在国内下载会比较慢,所以有些组织或者公司会创建其他公共库供大家使用,例如阿里云仓库。 私服一般是在局域网内设立的一个私有的仓库服务,供内部开发人员使用。它代理了外部远程仓库,内部用户下载依赖的时候会先到私服上查找,如果没有才从外部远程仓库下载,并缓存在私服。能节省带宽和加快下载速度,并且公司内部的依赖也能放在私服上供公司其他人下载使用。 每个用户在自己电脑上会有个本地仓库,存放所有下载过的依赖包,Windows 环境下,位置一般在用户目录的 .m2/repository 目录下。 7 Maven 项目结构 基于约定大于配置的原则,Maven 制定了一套标准的项目目录结构,规定了哪些文件需要放在哪些目录下,解决了在不同 IDE 开发工具中带来的项目目录结构不一致的问题。 ${basedir}:根目录,pom.xml 文件以及项目所有的子目录 ${basedir}/src/main/java:项目的 java 源代码 ${basedir}/src/main/resources:项目的资源文件,例如 application.yml,xml 文件等 ${basedir}/src/test/java:存放项目的 java 测试源代码 ${basedir}/src/test/resources:存放项目测试要用的资源文件 ${basedir}/target:编译打包输出目录 ${basedir}/target/classes:编译输出目录 ${basedir}/target/test-classes:测试编译输出目录 8 插件机制 Maven 可以添加插件,插件其实就是一些 jar 文件,执行 Maven 命令时,真正完成功能的就是插件。例如项目使用 Tomcat 服务器,我们可以引入一些 Tomcat 相关的插件。使用 springboot 框架,可以用引入 spring-boot 相关的 maven 插件。 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 比较常用的插件是 Maven 编译插件,可以设置项目使用的 JDK 版本时通过编译插件指定。 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> </plugin> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugins> </build> 9 Maven 命令 Maven 提供了许多命令,来帮助构建,管理项目。不过现在许多 IDE 开发工具提供了将这些命令图形化的功能,只要点击相应的按钮也可执行相应的命令。 Maven 的命令格式:mvn [plugin-name]:[goal-name],即执行 plugin-name 插件的 goal-name 目标。 mvn -version:显示 Maven 版本信息 mvn clean:清理项目编译产生的临时文件,一般是模块下的 target 目录 mvn compile:编译源代码 mvn package:打包项目,一般会在模块下的 target 目录下生成 jar 或者 war 文件 mvn test:执行测试用例 mvn install:打包项目的 jar 或者 war 到本地仓库,供其他模块使用 mvn deploy:打包项目的 jar 或者 war 到远程仓库,供其他人员下载使用 mvn site:生成项目相关信息的网站 mvn eclipse:eclipse:将项目转化为 eclipse 项目 mvn dependency:tree:打印项目的整个依赖树 mvn archetype:generate:创建普通 maven 项目 mvn tomcat7:run:在 tomcat 容器中运行 web 项目 mvn jetty:run:在 jetty 容器中运行 web 项目 Maven 命令可以带参数,例如 mvn package -Dmaven.test.skip=true 会在打包的时候跳过单元测试。 Maven 有以下三个标准的生命周期 clean:清理项目产生的临时文件 default(也叫 build):关于项目构建,打包,部署等的处理 site:项目站点文档创建的处理 执行某个 maven 命令时,会先执行这个命令前的所有命令,例如执行 mvn package 生成可执行 jar,会依次执行 pre-clean,clean,…,test,package等命令。 10 使用 IDEA 创建简单 Maven 项目 首先通过 IDEA 工具创建一个 Maven 项目,选择 JDK,选择 Maven 模板。 按上述步骤一般没有 resources 目录,所以我们手动创建源文件资源目录和测试资源目录。 最终项目的目录结构如下: 项目根目录下有个 pom.xml 文件,一些常用标签介绍如下: modelVersion:指定当前 pom 模型的版本,对于 maven2 和 maven3 来说,只能填写 4.0.0 groupId:定义项目的所属组或者公司,一般是公司域名的倒写 artifactId:项目在所属组的唯一ID version:项目版本号 name:项目名称,可选 description:对项目的描述,可选 properties:定义一些属性变量 dependencies:定义项目使用到的依赖 packaging:项目打包的类型,默认是 jar,可选值有 jar,war,rar,ear,ejb,pom等等 build:与构建相关的配置,例如设置编译插件的 JDK 版本 <?xml version="1.0" encoding="UTF-8"?> <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.chenpi</groupId> <artifactId>maven-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>maven-demo</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> </build> </project> 在剪辑器的右边,有个 Maven 菜单栏,这里有 Maven 相关命令可以直接双击执行,还有插件列表,项目依赖列表。 11 使用 Maven 构建多模块项目 如果一个项目比较大时,会拆分成多个模块进行开发,例如一个项目的 dao,service,controller 层被拆分到不同模块中;Spring 框架中的 spring-core,spring-bean,spring-webmvc 等模块。 基于Maven 构建的项目,一般会定义一个 parent POM 作为一组子 module 的聚合 POM。在 parent POM 中使用 <modules> 标签来定义它的一组子模块。虽然在 parent POM 中不会有什么实际构建产出,但是我们可以在 parent POM 中定义一些共同构建配置,依赖等,并且可以被子模块继承。 首先创建父模块,创建一个不使用模板的 maven 项目。 然后在父模块的基础上创建子模块,直接在父模块项目右键创建子模块 maven-dao,maven-service,maven-controller。 最终的项目目录结构如下所示: 子模块间依赖处理,因为 maven-controller 模块依赖 maven-service 模块,maven-service 模块依赖 maven-dao 模块。 我们需要在 maven-controller 模块的 pom.xml 文件中依赖 maven-service 模块; <dependency> <groupId>com.chenpi</groupId> <artifactId>maven-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> 我们需要在 maven-service 模块的 pom.xml 文件中依赖 maven-dao 模块; <dependency> <groupId>com.chenpi</groupId> <artifactId>maven-dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency> 12 pom.xml 文件标签大全详解 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.0http://maven.apache.org/maven-v4_0_0.xsd"> <!--父项目的坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 坐标包括group ID,artifact ID和 version。 --> <parent> <!--被继承的父项目的构件标识符 --> <artifactId /> <!--被继承的父项目的全球唯一标识符 --> <groupId /> <!--被继承的父项目的版本 --> <version /> <!-- 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项 目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。 --> <relativePath /> </parent> <!--声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。 --> <modelVersion>4.0.0</modelVersion> <!--项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app --> <groupId>asia.banseon</groupId> <!-- 构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个 特定的group ID下,artifact ID也必须是唯一的。构件是项目产生的或使用的一个东西,Maven为项目产生的构件包括:JARs,源 码,二进制发布和WARs等。 --> <artifactId>banseon-maven2</artifactId> <!--项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型 --> <packaging>jar</packaging> <!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 --> <version>1.0-SNAPSHOT</version> <!--项目的名称, Maven产生的文档用 --> <name>banseon-maven</name> <!--项目主页的URL, Maven产生的文档用 --> <url>http://www.baidu.com/banseon</url> <!-- 项目的详细描述, Maven 产生的文档用。 当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,就可以包含HTML标 签), 不鼓励使用纯文本描述。如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,而不是调整这里的文档。 --> <description>A maven project to study maven.</description> <!--描述了这个项目构建环境中的前提条件。 --> <prerequisites> <!--构建该项目或使用该插件所需要的Maven的最低版本 --> <maven /> </prerequisites> <!--项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL,本例为 jira --> <issueManagement> <!--问题管理系统(例如jira)的名字, --> <system>jira</system> <!--该项目使用的问题管理系统的URL --> <url>http://jira.baidu.com/banseon</url> </issueManagement> <!--项目持续集成信息 --> <ciManagement> <!--持续集成系统的名字,例如continuum --> <system /> <!--该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 --> <url /> <!--构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) --> <notifiers> <!--配置一种方式,当构建中断时,以该方式通知用户/开发者 --> <notifier> <!--传送通知的途径 --> <type /> <!--发生错误时是否通知 --> <sendOnError /> <!--构建失败时是否通知 --> <sendOnFailure /> <!--构建成功时是否通知 --> <sendOnSuccess /> <!--发生警告时是否通知 --> <sendOnWarning /> <!--不赞成使用。通知发送到哪里 --> <address /> <!--扩展配置项 --> <configuration /> </notifier> </notifiers> </ciManagement> <!--项目创建年份,4位数字。当产生版权信息时需要使用这个值。 --> <inceptionYear /> <!--项目相关邮件列表信息 --> <mailingLists> <!--该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 --> <mailingList> <!--邮件的名称 --> <name>Demo</name> <!--发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 --> <post>banseon@126.com</post> <!--订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 --> <subscribe>banseon@126.com</subscribe> <!--取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 --> <unsubscribe>banseon@126.com</unsubscribe> <!--你可以浏览邮件信息的URL --> <archive>http:/hi.baidu.com/banseon/demo/dev/</archive> </mailingList> </mailingLists> <!--项目开发者列表 --> <developers> <!--某个项目开发者的信息 --> <developer> <!--SCM里项目开发者的唯一标识符 --> <id>HELLO WORLD</id> <!--项目开发者的全名 --> <name>banseon</name> <!--项目开发者的email --> <email>banseon@126.com</email> <!--项目开发者的主页的URL --> <url /> <!--项目开发者在项目中扮演的角色,角色元素描述了各种角色 --> <roles> <role>Project Manager</role> <role>Architect</role> </roles> <!--项目开发者所属组织 --> <organization>demo</organization> <!--项目开发者所属组织的URL --> <organizationUrl>http://hi.baidu.com/banseon</organizationUrl> <!--项目开发者属性,如即时消息如何处理等 --> <properties> <dept>No</dept> </properties> <!--项目开发者所在时区, -11到12范围内的整数。 --> <timezone>-5</timezone> </developer> </developers> <!--项目的其他贡献者列表 --> <contributors> <!--项目的其他贡献者。参见developers/developer元素 --> <contributor> <name /> <email /> <url /> <organization /> <organizationUrl /> <roles /> <timezone /> <properties /> </contributor> </contributors> <!--该元素描述了项目所有License列表。 应该只列出该项目的license列表,不要列出依赖项目的 license列表。如果列出多个license,用户可以选择它们中的一个而不是接受所有license。 --> <licenses> <!--描述了项目的license,用于生成项目的web站点的license页面,其他一些报表和validation也会用到该元素。 --> <license> <!--license用于法律上的名称 --> <name>Apache 2</name> <!--官方的license正文页面的URL --> <url>http://www.baidu.com/banseon/LICENSE-2.0.txt</url> <!--项目分发的主要方式: repo,可以从Maven库下载 manual, 用户必须手动下载和安装依赖 --> <distribution>repo</distribution> <!--关于license的补充信息 --> <comments>A business-friendly OSS license</comments> </license> </licenses> <!--SCM(Source Control Management)标签允许你配置你的代码库,供Maven web站点和其它插件使用。 --> <scm> <!--SCM的URL,该URL描述了版本库和如何连接到版本库。欲知详情,请看SCMs提供的URL格式和列表。该连接只读。 --> <connection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk) </connection> <!--给开发者使用的,类似connection元素。即该连接不仅仅只读 --> <developerConnection> scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk </developerConnection> <!--当前代码的标签,在开发阶段默认为HEAD --> <tag /> <!--指向项目的可浏览SCM库(例如ViewVC或者Fisheye)的URL。 --> <url>http://svn.baidu.com/banseon</url> </scm> <!--描述项目所属组织的各种属性。Maven产生的文档用 --> <organization> <!--组织的全名 --> <name>demo</name> <!--组织主页的URL --> <url>http://www.baidu.com/banseon</url> </organization> <!--构建项目需要的信息 --> <build> <!--该元素设置了项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 --> <sourceDirectory /> <!--该元素设置了项目脚本源码目录,该目录和源码目录不同:绝大多数情况下,该目录下的内容 会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。 --> <scriptSourceDirectory /> <!--该元素设置了项目单元测试使用的源码目录,当测试项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 --> <testSourceDirectory /> <!--被编译过的应用程序class文件存放的目录。 --> <outputDirectory /> <!--被编译过的测试class文件存放的目录。 --> <testOutputDirectory /> <!--使用来自该项目的一系列构建扩展 --> <extensions> <!--描述使用到的构建扩展。 --> <extension> <!--构建扩展的groupId --> <groupId /> <!--构建扩展的artifactId --> <artifactId /> <!--构建扩展的版本 --> <version /> </extension> </extensions> <!--当项目没有规定目标(Maven2 叫做阶段)时的默认值 --> <defaultGoal /> <!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。 --> <resources> <!--这个元素描述了项目相关或测试相关的所有资源路径 --> <resource> <!-- 描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。举个例 子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven /messages。然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。 --> <targetPath /> <!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 --> <filtering /> <!--描述存放资源的目录,该路径相对POM路径 --> <directory /> <!--包含的模式列表,例如**/*.xml. --> <includes /> <!--排除的模式列表,例如**/*.xml --> <excludes /> </resource> </resources> <!--这个元素描述了单元测试相关的所有资源路径,例如和单元测试相关的属性文件。 --> <testResources> <!--这个元素描述了测试相关的所有资源路径,参见build/resources/resource元素的说明 --> <testResource> <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </testResource> </testResources> <!--构建产生的所有文件存放的目录 --> <directory /> <!--产生的构件的文件名,默认值是${artifactId}-${version}。 --> <finalName /> <!--当filtering开关打开时,使用到的过滤器属性文件列表 --> <filters /> <!--子项目可以引用的默认插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期。给定插件的任何本地配置都会覆盖这里的配置 --> <pluginManagement> <!--使用的插件列表 。 --> <plugins> <!--plugin元素包含描述插件所需要的信息。 --> <plugin> <!--插件在仓库里的group ID --> <groupId /> <!--插件在仓库里的artifact ID --> <artifactId /> <!--被使用的插件的版本(或版本范围) --> <version /> <!--是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。 --> <extensions /> <!--在构建生命周期中执行一组目标的配置。每个目标可能有不同的配置。 --> <executions> <!--execution元素包含了插件执行需要的信息 --> <execution> <!--执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 --> <id /> <!--绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 --> <phase /> <!--配置的执行目标 --> <goals /> <!--配置是否被传播到子POM --> <inherited /> <!--作为DOM对象的配置 --> <configuration /> </execution> </executions> <!--项目引入插件所需要的额外依赖 --> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> <!--任何配置是否被传播到子项目 --> <inherited /> <!--作为DOM对象的配置 --> <configuration /> </plugin> </plugins> </pluginManagement> <!--使用的插件列表 --> <plugins> <!--参见build/pluginManagement/plugins/plugin元素 --> <plugin> <groupId /> <artifactId /> <version /> <extensions /> <executions> <execution> <id /> <phase /> <goals /> <inherited /> <configuration /> </execution> </executions> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> <goals /> <inherited /> <configuration /> </plugin> </plugins> </build> <!--在列的项目构建profile,如果被激活,会修改构建处理 --> <profiles> <!--根据环境参数或命令行参数激活某个构建处理 --> <profile> <!--构建配置的唯一标识符。即用于命令行激活,也用于在继承时合并具有相同标识符的profile。 --> <id /> <!--自动触发profile的条件逻辑。Activation是profile的开启钥匙。profile的力量来自于它 能够在某些特定的环境中自动使用某些特定的值;这些环境通过activation元素指定。activation元素并不是激活profile的唯一方式。 --> <activation> <!--profile默认是否激活的标志 --> <activeByDefault /> <!--当匹配的jdk被检测到,profile被激活。例如,1.4激活JDK1.4,1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。 --> <jdk /> <!--当匹配的操作系统属性被检测到,profile被激活。os元素可以定义一些操作系统相关的属性。 --> <os> <!--激活profile的操作系统的名字 --> <name>Windows XP</name> <!--激活profile的操作系统所属家族(如 'windows') --> <family>Windows</family> <!--激活profile的操作系统体系结构 --> <arch>x86</arch> <!--激活profile的操作系统版本 --> <version>5.1.2600</version> </os> <!--如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile就会被激活。如果值 字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段 --> <property> <!--激活profile的属性的名称 --> <name>mavenVersion</name> <!--激活profile的属性的值 --> <value>2.0.3</value> </property> <!--提供一个文件名,通过检测该文件的存在或不存在来激活profile。missing检查文件是否存在,如果不存在则激活 profile。另一方面,exists则会检查文件是否存在,如果存在则激活profile。 --> <file> <!--如果指定的文件存在,则激活profile。 --> <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ </exists> <!--如果指定的文件不存在,则激活profile。 --> <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/ </missing> </file> </activation> <!--构建项目所需要的信息。参见build元素 --> <build> <defaultGoal /> <resources> <resource> <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </resource> </resources> <testResources> <testResource> <targetPath /> <filtering /> <directory /> <includes /> <excludes /> </testResource> </testResources> <directory /> <finalName /> <filters /> <pluginManagement> <plugins> <!--参见build/pluginManagement/plugins/plugin元素 --> <plugin> <groupId /> <artifactId /> <version /> <extensions /> <executions> <execution> <id /> <phase /> <goals /> <inherited /> <configuration /> </execution> </executions> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> <goals /> <inherited /> <configuration /> </plugin> </plugins> </pluginManagement> <plugins> <!--参见build/pluginManagement/plugins/plugin元素 --> <plugin> <groupId /> <artifactId /> <version /> <extensions /> <executions> <execution> <id /> <phase /> <goals /> <inherited /> <configuration /> </execution> </executions> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> <goals /> <inherited /> <configuration /> </plugin> </plugins> </build> <!--模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 --> <modules /> <!--发现依赖和扩展的远程仓库列表。 --> <repositories> <!--参见repositories/repository元素 --> <repository> <releases> <enabled /> <updatePolicy /> <checksumPolicy /> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <id /> <name /> <url /> <layout /> </repository> </repositories> <!--发现插件的远程仓库列表,这些插件用于构建和报表 --> <pluginRepositories> <!--包含需要连接到远程插件仓库的信息.参见repositories/repository元素 --> <pluginRepository> <releases> <enabled /> <updatePolicy /> <checksumPolicy /> </releases> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <id /> <name /> <url /> <layout /> </pluginRepository> </pluginRepositories> <!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。 --> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> <!--不赞成使用. 现在Maven忽略该元素. --> <reports /> <!--该元素包括使用报表插件产生报表的规范。当用户执行"mvn site",这些报表就会运行。 在页面导航栏能看到所有报表的链接。参见reporting元素 --> <reporting> ...... </reporting> <!--参见dependencyManagement元素 --> <dependencyManagement> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> </dependencyManagement> <!--参见distributionManagement元素 --> <distributionManagement> ...... </distributionManagement> <!--参见properties元素 --> <properties /> </profile> </profiles> <!--模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 --> <modules /> <!--发现依赖和扩展的远程仓库列表。 --> <repositories> <!--包含需要连接到远程仓库的信息 --> <repository> <!--如何处理远程仓库里发布版本的下载 --> <releases> <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 --> <enabled /> <!--该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 --> <updatePolicy /> <!--当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。 --> <checksumPolicy /> </releases> <!-- 如何处理远程仓库里快照版本的下载。有了releases和snapshots这两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的 策略。例如,可能有人会决定只为开发目的开启对快照版本下载的支持。参见repositories/repository/releases元素 --> <snapshots> <enabled /> <updatePolicy /> <checksumPolicy /> </snapshots> <!--远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库 --> <id>banseon-repository-proxy</id> <!--远程仓库名称 --> <name>banseon-repository-proxy</name> <!--远程仓库URL,按protocol://hostname/path形式 --> <url>http://192.168.1.169:9999/repository/</url> <!-- 用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2为其仓库提供了一个默认的布局;然 而,Maven 1.x有一种不同的布局。我们可以使用该元素指定布局是default(默认)还是legacy(遗留)。 --> <layout>default</layout> </repository> </repositories> <!--发现插件的远程仓库列表,这些插件用于构建和报表 --> <pluginRepositories> <!--包含需要连接到远程插件仓库的信息.参见repositories/repository元素 --> <pluginRepository> ...... </pluginRepository> </pluginRepositories> <!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。 --> <dependencies> <dependency> <!--依赖的group ID --> <groupId>org.apache.maven</groupId> <!--依赖的artifact ID --> <artifactId>maven-artifact</artifactId> <!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。 --> <version>3.8.1</version> <!-- 依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应, 尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在 plugin里定义新的类型。所以前面的类型的例子不完整。 --> <type>jar</type> <!-- 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成 JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。 --> <classifier></classifier> <!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。 - compile :默认范围,用于编译 - provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath - runtime: 在执行时需要使用 - test: 用于test任务时使用 - system: 需要外在提供相应的元素。通过systemPath来取得 - systemPath: 仅用于范围为system。提供相应的路径 - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 --> <scope>test</scope> <!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。 --> <systemPath></systemPath> <!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题 --> <exclusions> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> <!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。 --> <optional>true</optional> </dependency> </dependencies> <!--不赞成使用. 现在Maven忽略该元素. --> <reports></reports> <!--该元素描述使用报表插件产生报表的规范。当用户执行"mvn site",这些报表就会运行。 在页面导航栏能看到所有报表的链接。 --> <reporting> <!--true,则,网站不包括默认的报表。这包括"项目信息"菜单中的报表。 --> <excludeDefaults /> <!--所有产生的报表存放到哪里。默认值是${project.build.directory}/site。 --> <outputDirectory /> <!--使用的报表插件和他们的配置。 --> <plugins> <!--plugin元素包含描述报表插件需要的信息 --> <plugin> <!--报表插件在仓库里的group ID --> <groupId /> <!--报表插件在仓库里的artifact ID --> <artifactId /> <!--被使用的报表插件的版本(或版本范围) --> <version /> <!--任何配置是否被传播到子项目 --> <inherited /> <!--报表插件的配置 --> <configuration /> <!--一组报表的多重规范,每个规范可能有不同的配置。一个规范(报表集)对应一个执行目标 。例如,有1,2,3,4,5,6,7,8,9个报表。1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标 --> <reportSets> <!--表示报表的一个集合,以及产生该集合的配置 --> <reportSet> <!--报表集合的唯一标识符,POM继承时用到 --> <id /> <!--产生报表集合时,被使用的报表的配置 --> <configuration /> <!--配置是否被继承到子POMs --> <inherited /> <!--这个集合里使用到哪些报表 --> <reports /> </reportSet> </reportSets> </plugin> </plugins> </reporting> <!-- 继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和 artifact ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里的依赖信息。 --> <dependencyManagement> <dependencies> <!--参见dependencies/dependency元素 --> <dependency> ...... </dependency> </dependencies> </dependencyManagement> <!--项目分发信息,在执行mvn deploy后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 --> <distributionManagement> <!--部署项目产生的构件到远程仓库需要的信息 --> <repository> <!--是分配给快照一个唯一的版本号(由时间戳和构建流水号)?还是每次都使用相同的版本号?参见repositories/repository元素 --> <uniqueVersion /> <id>banseon-maven2</id> <name>banseon maven2</name> <url>file://${basedir}/target/deploy</url> <layout /> </repository> <!--构件的快照部署到哪里?如果没有配置该元素,默认部署到repository元素配置的仓库,参见distributionManagement/repository元素 --> <snapshotRepository> <uniqueVersion /> <id>banseon-maven2</id> <name>Banseon-maven2 Snapshot Repository</name> <url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url> <layout /> </snapshotRepository> <!--部署项目的网站需要的信息 --> <site> <!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置 --> <id>banseon-site</id> <!--部署位置的名称 --> <name>business api website</name> <!--部署位置的URL,按protocol://hostname/path形式 --> <url> scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web </url> </site> <!--项目下载页面的URL。如果没有该元素,用户应该参考主页。使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)。 --> <downloadUrl /> <!--如果构件有了新的group ID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。 --> <relocation> <!--构件新的group ID --> <groupId /> <!--构件新的artifact ID --> <artifactId /> <!--构件新的版本号 --> <version /> <!--显示给用户的,关于移动的额外信息,例如原因。 --> <message /> </relocation> <!-- 给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。有效的值有:none(默认),converted(仓库管理员从 Maven 1 POM转换过来),partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部 署),verified(被核实时正确的和最终的)。 --> <status /> </distributionManagement> <!--以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里activation元素的说明)。格式是<name>value</name>。 --> <properties /> </project>

优秀的个人博客,低调大师

【从入门到放弃-ZooKeeper】ZooKeeper入门

前言 ZooKeeper是一个分布式服务协调框架,可以用来维护分布式配置信息、服务注册中心、实现分布式锁等。在Hbase、Hadoop、kafka等项目中都有广泛的应用。随着分布式、微服务的普及,ZooKeeper已经成为我们日常开发工作中无法绕过的一环,本文将从安装配置到最基础的使用入手,对其进行介绍。 安装部署 下载 在 http://mirror.bit.edu.cn/apache/zookeeper/stable/ 下载推荐的stable版本。可以直接下载编译好的bin文件。目前最新的stable版本是3.5.5 解压 将下载的文件解压至工作目录,我的工作目录是/var/workspace/zookeeper tar -xzvf apache-zookeeper-3.5.5-bin.tar.gz -C /var/workspace/zo

优秀的个人博客,低调大师

es 入门

**注意事项-------使用ealsticsearch要配置java的开发环境JDK(1.8以上) ealsticsearch: 索引(Index) 类型(type) 文档(Document) 字段(Fields) 关系型数据库: 数据库 表 行 列 from elasticsearch import Elasticsearch 默认host为localhost,port为9200.但也可以指定host与port es = Elasticsearch("http://127.0.0.1:9200") 插入数据,index,doc_type名称可以自定义,id可以根据需求赋值,body为内容 es.index(index="my_index",doc_type="test_type",id=0,body={"name":"python","addr":"深圳"})es.index(index="my_index",doc_type="test_type",id=1,body={"name":"java","addr":"北京"}) 同样是插入数据,create() 方法需要我们指定 id 字段来唯一标识该条数据,而 index() 方法则不需要,如果不指定 id,会自动生成一个 id es.create(index="my_index",doc_type="test_type",id=1,body={"name":"python","addr":"深圳"}) 删除指定的index、type、id的文档 es.delete(index='indexName', doc_type='typeName', id=1) 删除index es.indices.delete(index='news', ignore=[400, 404])query = {'query': {'match_all': {}}}# 查找所有文档query1 = {'query': {'match': {'sex': 'famale'}}}# 删除性别为女性的所有文档query2 = {'query': {'range': {'age': {'lt': 11}}}}# 删除年龄小于11的所有文档query3 = {'query': {'term': {'name': 'jack'}}}# 查找名字叫做jack的所有文档 删除所有文档 es.delete_by_query(index="my_index",doc_type="test_type",body=query) get:获取指定index、type、id所对应的文档 es.get(index="my_index",doc_type="test_type",id=1) search:查询满足条件的所有文档,没有id属性,且index,type和body均可为None result = es.search(index="my_index",doc_type="test_type",body=query)print(result'hits'[0])# 返回第一个文档的内容 update:更新指定index、type、id所对应的文档 更新的主要点: 1. 需要指定 id 2. body={"doc": } , 这个doc是必须的 es.update(index="my_index",doc_type="test_type",id=1,body={"doc":{"name":"python1","addr":"深圳1"}}) ---查询所有数据# 搜索所有数据es.search(index="my_index",doc_type="test_type") 或者 body = { "query":{ "match_all":{} }}es.search(index="my_index",doc_type="test_type",body=body) ---term与terms term body = { "query":{ "term":{ "name":"python" } }} 查询name="python"的所有数据 es.search(index="my_index",doc_type="test_type",body=body) terms body = { "query":{ "terms":{ "name":[ "python","android" ] } }} 搜索出name="python"或name="android"的所有数据 es.search(index="my_index",doc_type="test_type",body=body) ---match与multi_match match:匹配name包含python关键字的数据 body = { "query":{ "match":{ "name":"python" } }} 查询name包含python关键字的数据 es.search(index="my_index",doc_type="test_type",body=body) multi_match:在name和addr里匹配包含深圳关键字的数据 body = { "query":{ "multi_match":{ "query":"深圳", "fields":["name","addr"] } }} 查询name和addr包含"深圳"关键字的数据 es.search(index="my_index",doc_type="test_type",body=body) ---idsbody = { "query":{ "ids":{ "type":"test_type", "values":[ "1","2" ] } }} 搜索出id为1或2d的所有数据 es.search(index="my_index",doc_type="test_type",body=body) ---复合查询boolbody = { "query":{ "bool":{ "must":[ { "term":{ "name":"python" } }, { "term":{ "age":18 } } ] } }} 获取name="python"并且age=18的所有数据 es.search(index="my_index",doc_type="test_type",body=body) ---切片式查询body = { "query":{ "match_all":{} } "from":2 # 从第二条数据开始 "size":4 # 获取4条数据} 从第2条数据开始,获取4条数据 es.search(index="my_index",doc_type="test_type",body=body) ---范围查询 body = { "query":{ "range":{ "age":{ "gte":18, # >=18 "lte":30 # <=30 } } }} 查询18<=age<=30的所有数据 es.search(index="my_index",doc_type="test_type",body=body) ---前缀查询body = { "query":{ "prefix":{ "name":"p" } }} 查询前缀为"赵"的所有数据 es.search(index="my_index",doc_type="test_type",body=body) ---通配符查询 body = { "query":{ "wildcard":{ "name":"*id" } }} 查询name以id为后缀的所有数据 es.search(index="my_index",doc_type="test_type",body=body) ---排序body = { "query":{ "match_all":{} } "sort":{ "age":{ # 根据age字段升序排序 "order":"asc" # asc升序,desc降序 } }} ---filter_path响应过滤 只需要获取_id数据,多个条件用逗号隔开 es.search(index="my_index",doc_type="test_type",filter_path=["hits.hits._id"]) 获取所有数据 es.search(index="my_index",doc_type="test_type",filter_path=["hits.hits._*"]) ---count执行查询并获取该查询的匹配数 获取数据量 es.count(index="my_index",doc_type="test_type") ---度量类聚合获取最小值body = { "query":{ "match_all":{} }, "aggs":{ # 聚合查询 "min_age":{ # 最小值的key "min":{ # 最小 "field":"age" # 查询"age"的最小值 } } }} 搜索所有数据,并获取age最小的值 es.search(index="my_index",doc_type="test_type",body=body) ---获取最大值body = { "query":{ "match_all":{} }, "aggs":{ # 聚合查询 "max_age":{ # 最大值的key "max":{ # 最大 "field":"age" # 查询"age"的最大值 } } }} 搜索所有数据,并获取age最大的值 es.search(index="my_index",doc_type="test_type",body=body) ---获取和body = { "query":{ "match_all":{} }, "aggs":{ # 聚合查询 "sum_age":{ # 和的key "sum":{ # 和 "field":"age" # 获取所有age的和 } } }} 搜索所有数据,并获取所有age的和 es.search(index="my_index",doc_type="test_type",body=body) ---获取平均值body = { "query":{ "match_all":{} }, "aggs":{ # 聚合查询 "avg_age":{ # 平均值的key "sum":{ # 平均值 "field":"age" # 获取所有age的平均值 } } }} 搜索所有数据,获取所有age的平均值 es.search(index="my_index",doc_type="test_type",body=body)

优秀的个人博客,低调大师

Matplotlib 入门

最近一直在学习有关机器学习的内容,发现有关可视化的内容无法绕过,在网上搜索了很久,看了一些中英文的资料和书,这里主要是记录下来,主要供自己进一步学习之用。 本文适合零基础,但你需要对Python, Numpy, Pandas 有基本的了解。 首先完成以下的中文翻译资料的学习,原作者的github链接也一并奉上,你可以 clone 下来。学习这个课程的过程中,你需要了解的基本API函数: 完成了这个学习, 使用面向对象界面画图的一般步骤就是 建立一个 Figure 对象 在这个 Figure 里建立一个或n个 Axes 对象 这些 Axes 里分别画图、装饰 我们画完图以后一般要加上标题、图例这些元素。这些功能散布在 Matplotlib API 的各处 加标题可以使用 Axes 对象的 set_title 方法。坐标轴的标签可以使用 Axes 对象的 set_xlabel 和 set_ylabel 方法。图例可以使用 Axes 对象的 legend 方法创建。这 个函数会使用 Line2D 对象的 label 属性。注意 上一节最后的那一段代码,Ax.plot() 这一行我们并没有使用 plot 的返回值,实际上它的返回值正是 Line2D 对象的列表,所以我们可以这样设置 label:Ax.plot(X1, Y1, label="blabla") 也可以这样Lines = Ax.plot(X1, Y1) Lines[0].set_label("blabla") 如果我们在一个 plot 调用里画多条线,同时设 label,这些线都会有相同的 label。设置完这些以后,只需调用 Ax.legend(),图例就会出现在图的右上角。如果我们使用上一节 的那个例子,右上角并不是放图例的好地方,这时我们可以使用 legend 的 loc参数。这个参数可以是一个字符串, 比如"right","lower left" 之类,也可以是一 个整数,具体定义请见 官方文档。这里我们可以简单地使用 0 或者 "best" 让 Matplotlib 自动选择位置,Ax.legend(loc=0) 现在我们的图基本成型,可以插入到文档里了。这时我们可能想调整图的大小, 我们可以修改 Figure 构造函数的调用,Fig = Plt.figure(figsize=(4,3)) 这样图的大小就会是宽 4 高 3,单位传说是英寸。也可以使用 Fig 的 set_figwidth 和 set_figheight 方法。如果你把图的尺寸改得比较小的话,可能会 发生一件非常奇妙的事,就是坐标轴的标签被图的边界遮住了,或者干脆不见了。 解决办法就是调整绘图区域的四个边界在图中的位置,比如下面的代码Fig.subplots_adjust(left=0.15, top=0.9) 把绘图区域的左边界放在图左边 15% 的位置,上边界放在高的 90% 的位置。Matplotlib 中的文本 Matplotlib 有很强的文本功能。它可以处理普通的文本,也可以使用 LaTeX 渲 染数学公式。Matplotlib 还带了一个 LaTeX 引擎,可以在系统里没有 LaTeX 的 时候渲染数学公式。以下代码使用默认字体(貌似是 Verdana)显示 x 轴的标题Ax.set_xlabel("x") 如果你要使用 LaTeX 来排这个标题,只需要使用 Python raw string,并把标 题放在数学模式里,Ax.set_xlabel(r" 𝑥x ") 注意即便是使用 raw string,不在数学模式里的部分仍然不会使用 LaTeX。Matplotlib 的 Axes 类有一个 text 方法,可以 在一个 Axes 对象的任意位置放置一个文本。 Figure 也有一个 figtext 方法用来在 Figure 对象的任意位置放置文本。具体用法请见 官方文档。 Axes 对象还有一个超级强大的 annotate 方法, 可以满足你对标注的最变态需求。要改变文本的默认字体,需要使用 pyplot 模块的 rc 函数,Plt.rc("font", family="Helvetica") 不过如果你指定的字体是 OpenType 的话,貌似不能嵌入到 PDF 里…​ 请参考: 1)github - https://github.com/rougier/matplotlib-tutorial 2) Translation - https://liam.page/2014/09/11/matplotlib-tutorial-zh-cn/ 3) https://www.cnblogs.com/wei-li/archive/2012/05/23/2506940.html4) https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003833 以下为草稿:http://liyangbit.com/pythonvisualization/matplotlib-top-50-visualizations/

优秀的个人博客,低调大师

Jmeter 入门

Jmeter的初步认识 一、 接口测试 一般的测试包含七步: 新建请求 添加线程组 添加http请求 配置http参数 添加cookie管理、header管理 添加结果树 在点击运行 查看运行结果 参数在前后端分离一般用json格式,也可以选择html(HTMl Source Formatted)或者其他 二、 压力测试 配置线程组 参数说明: -. 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。多少虚拟用户就设置多少个线程数。 -. Rame-Up Period: 表示线程数多长时间全部启动。即准备时长:如果线程数是15,准备时长为3,,也就是每秒钟启动5个线程。 -. 循环次数:这个设置不会改变并发数,可以延长并发时间。总请求数=线程数*循环次数 -. 调度器:设置压测的启动时间、结束时间、持续时间和启动延迟时间。

优秀的个人博客,低调大师

Prometheus 入门

文章首发于公众号《程序员果果》地址 : https://mp.weixin.qq.com/s/BjZyNcWEgflJMnjfceiluw 简介 Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。 特点 作为新一代的监控框架,Prometheus 具有以下特点: 强大的多维度数据模型: 时间序列数据通过 metric 名和键值对来区分。 所有的 metrics 都可以设置任意的多维标签。 数据模型更随意,不需要刻意设置为以点分隔的字符串。 可以对数据模型进行聚合,切割和切片操作。 支持双精度浮点类型,标签可以设为全 unicode。 灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作。 易于管理: Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。 高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。 可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。 可以通过服务发现或者静态配置去获取监控的 targets。 有多种可视化图形界面。 易于伸缩。 组成及架构 Prometheus 生态圈中包含了多个组件,其中许多组件是可选的: Prometheus Server: 用于收集和存储时间序列数据。 Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。 Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。 Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。 Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。 一些其他的工具。 下图为 Prometheus 官方文档中的架构图: 从上图可以看出,Prometheus 的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面。 其大概的工作流程是: Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。 Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。 Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。在图形界面中,可视化采集数据。 相关概念 下面将对 Prometheus 中的数据模型(时间序列),metric 类型,instance 和 jobs等概念进行介绍。 数据模型 Prometheus 中存储的数据为时间序列,是由 metric 的名字和一系列的标签(键值对)唯一标识的,不同的标签则代表不同的时间序列。 metric 名字:该名字应该具有语义,一般用于表示 metric 的功能,例如:http_requests_ total, 表示 http 请求的总数。其中,metric 名字由 ASCII 字符,数字,下划线,以及冒号组成,且必须满足正则表达式 a-zA-Z_:*。 标签:使同一个时间序列有了不同维度的识别。例如 http_requests_total{method="Get"} 表示所有 http 请求中的 Get 请求。当 method="post" 时,则为新的一个 metric。标签中的键由 ASCII 字符,数字,以及下划线组成,且必须满足正则表达式 a-zA-Z_:*。 样本:实际的时间序列,每个序列包括一个 float64 的值和一个毫秒级的时间戳。 格式:{=, …},例如:http_requests_total{method="POST",endpoint="/api/tracks"}。 Metrics种类 Prometheus客户端库提供了四种核心Metrics类型。 Counter(计数器) 说明:Counter是一个累积度量,它表示一个单调递增的 Metrics,其值只能在重启时递增或重置为零 场景:可以使用Counter来表示http的请求数、已完成的任务数或错误数、下单数。 Gauge(测量仪) 说明:当前值的一次快照(snapshot)测量,可增可减。 场景:磁盘使用率,当前同时在线用户数。 Histogram(直方图) 说明:通过区间统计样本分布。 场景:请求延迟时间的统计。例如统计 0~200ms、200ms~400ms、400ms~800ms 区间的请求数有多。 Summary(汇总) 说明:根据样本统计出百分位。 场景:请求延迟时间的统计。例如统计 95%的请求延迟 < xxx ms ,99%的请求延迟 < xxx ms instance 和 jobs 在Prometheus术语中,你可以scrape(刮擦)的端点称为 实例,通常对应于单个进程。一组同种类型的 instances(主要用于保证可扩展性和可靠性),例如:具有四个复制instances(实例)的API服务器job作业: job: api-server instance 1: 1.2.3.4:5670 instance 2: 1.2.3.4:5671 instance 3: 5.6.7.8:5670 instance 4: 5.6.7.8:5671 当Prometheus scrape(刮擦)目标时,它会自动在scrape的时间序列上附加一些标签,用来识别scrape的目标。 job:目标所属的已配置job名称。 instance::已刮擦的目标URL 的一部分。 对于每次实例 scrape(刮取,Prometheus都会在以下时间序列中存储样本: up{job="<job-name>", instance="<instance-id>"}:1如果实例是健康的,即可达,或者0刮擦失败。 scrape_duration_seconds{job="<job-name>", instance="<instance-id>"}:刮擦持续时间。 scrape_samples_post_metric_relabeling{job="<job-name>", instance="<instance-id>"}:应用度量标准重新标记后剩余的样本数。 scrape_samples_scraped{job="<job-name>", instance="<instance-id>"}:目标暴露的样本数。 scrape_series_added{job="<job-name>", instance="<instance-id>"}:该刮擦中新系列的大致数量。v2.10中的新功能。 up时间序列对于实例可用性监视非常有用。 安装和配置 安装 你可以在官网 https://prometheus.io/download/ 下载 安装包,解压后使用。为了方便,我使用docker 镜像的方式 运行Prometheus。 docker run --name prometheus -d -p 9090:9090 prom/prometheus 浏览器输入http://localhost:9090 ,访问 Prometheus 的 Web UI: 点击菜单栏 “Status” 下的 Targets ,界面如下: 可以看大Prometheus 自身 metrics 处于UP状态 ,说明 安装成功。 配置 Prometheus 的配置文件 prometheus.yml 内容如下: # 全局设置,可以被覆盖 global: scrape_interval: 15s evaluation_interval: 15s rule_files: # - "first.rules" # - "second.rules" scrape_configs: - job_name: prometheus static_configs: - targets: ['localhost:9090'] 该global块控制 Prometheus 的全局配置。我们有两种选择。第一个,scrape_interval控制Prometheus 刮擦目标的频率。你可以为单个目标覆盖此值。在这种情况下,全局设置是每15秒刮一次。该evaluation_interval选项控制普罗米修斯评估规则的频率。Prometheus 使用规则创建新的时间序列并生成警报。 该rule_files块指定我们希望 Prometheus 加载的任何规则的位置。现在我们没有规则。 最后一个块scrape_configs控制 Prometheus 监视的资源。由于 Prometheus 还将自己的数据公开为HTTP端点,因此它可以抓取并监控自身的健康状况。在默认配置中有一个名为 prometheus 的job,它抓取 prometheus 服务器 公开的时间序列数据。该作业包含一个静态配置的目标,即端口9090上的本地主机。返回的时间序列数据将详细说明Prometheus服务器的状态和性能。 实验 Prometheus HTTP 度量模拟器 为了演示 Prometheus 的简单使用,这里运行一个 Prometheus HTTP 度量模拟器。模拟一个简单的HTTP微服务,生成Prometheus Metrics,通过 docker 运行。 docker run -p 8080:8080 pierrevincent/prom-http-simulator:0.1 它在/metrics端点下公开以下Prometheus指标: http_requests_total:请求计数器,标签endpoint和status http_request_duration_milliseconds:请求延迟直方图 可以开启流量高峰模式,更改流量高峰模式可以通过以下方式完成: # ON curl -X POST http://127.0.0.1:8080/spike/on # OFF curl -X POST http://127.0.0.1:8080/spike/off # RANDOM curl -X POST http://127.0.0.1:8080/spike/random 错误率默认为1%。它可以更改为0到100之间的数字: # 例如将错误率设置为50% curl -H 'Content-Type: application/json' -X PUT -d '{"error_rate": 50}' http://127.0.0.1:8080/error_rate 修改Prometheus配置 需要将 HTTP 度量模拟器 的 metrics端点 配置到 Prometheus的配置文件 prometheus.yml 中。 创建一个 prometheus.yml 文件 内容如下: global: scrape_interval: 5s evaluation_interval: 5s scrape_timeout: 5s scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'http-simulator' metrics_path: /metrics static_configs: - targets: ['172.16.1.232:8080'] 通过docker up 命令替换 容器中的配置文件: docker cp prometheus.yml prometheus:/etc/prometheus/ 重启容器: docker restart prometheus 访问 http://localhost:9090/targets ,发现已经出现了 target “http-simulator” ,并且为UP状态。 查询 请求率(Request Rate)查询 查询http请求数 http_requests_total{job="http-simulator"} 查询成功login请求数 http_requests_total{job="http-simulator", status="200", endpoint="/login"} 查询成功请求数,以endpoint区分 http_requests_total{job="http-simulator", status="200"} 查询总成功请求数 sum(http_requests_total{job="http-simulator", status="200"}) 查询成功请求率,以endpoint区分 rate(http_requests_total{job="http-simulator", status="200"}[5m]) 查询总成功请求率 sum(rate(http_requests_total{job="http-simulator", status="200"}[5m])) 延迟分布(Latency distribution)查询 查询http-simulator延迟分布 http_request_duration_milliseconds_bucket{job="http-simulator"} 查询成功login延迟分布 http_request_duration_milliseconds_bucket{job="http-simulator", status="200", endpoint="/login"} 不超过200ms延迟的成功login请求占比 sum(http_request_duration_milliseconds_bucket{job="http-simulator", status="200", endpoint="/login", le="200"}) / sum(http_request_duration_milliseconds_count{job="http-simulator", status="200", endpoint="/login"}) 成功login请求延迟的99百分位 histogram_quantile(0.99, rate(http_request_duration_milliseconds_bucket{job="http-simulator", status="200", endpoint="/login"}[5m])) 上面给出的这些查询表达式,在 prometheus 的 查询界面上自行测试下 ,这里就不一一测试了, 总结 本篇对 Prometheus 的组成,架构和基本概念进行了介绍,并实例演示了 Prometheus 的查询表达式的应用。本篇是 Prometheus 系列的第一篇, 后续还会有Prometheus与其他图形界面的集成,与 springboot 应用的集成等 。 参考 https://prometheus.io/docs/introduction/overview/https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-prometheus-getting-started-and-practice/index.html

优秀的个人博客,低调大师

MyCAT入门

MyCAT 1.什么是MyCAT MyCAT是基于阿里的cobar实现的数据库中间件产品。 2.什么是数据库中间件 就是介于数据库和应用之间,进行数据处理与交互的中间服务。有了数据库中间件,应用只需要集中处理业务,大量的通用的数据聚合,事务,数据源切换都由数据库中间件处理。 3.MyCAT的主要作用 1.单纯的读写分离,支持读写分离,主从切换; 2.分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片 3.多租户应用,每个应用一个库,但应用程序mycat,实现多租户化 4.报表系统,借助mycat分表能力,处理大规模报表统计 5.替代Hbase,分析大数据 4.MyCAT基本元素 逻辑库 数据库中间件是一个或多个数据库集群构成的逻辑库。他并不是只有一个数据库,而是有多个库的聚集。 逻辑表 1.逻辑表 在分布式数据库系统中,对应用来说,读写数据的表就是逻辑表。逻辑表可以是数据切分后,分布在一个或多个分片库,也可以不做数据切分,不分片,只由一个表构成。 2.分片表 分片表,是指那些原有的很大数据的表,需要切分到多个数据库的表。 3.非分片表 一个数据库中并不是所有的表都很大,某些表可以不用进行切分。非分片表,既是数据量比较小的表 4.ER表 子表的记录与所关联的父表记录存放在同一数据分片上,即字表依赖于父表成为ER表。 5.全局表 一些常常很少会改变的表成为全局表(例如字典表),全局表将在每个数据分片上拷贝一份,且要保证数据相同。此时使用join操作时,将会大大提高效率。 分片节点 数据切分后,一个大表被分到不同分片数据库上面,每个表分片所在的数据库就是分片节点。(dataNode) 节点主机 数据切分后,每个分片节点不一定会都独占一个物理机器,同一物理机器上面可以有多个分片数据库,这样一个或多个分片节点所在的物理机器就是节点主机。为了避免单节点主机并发数量限制,尽量将读写压力高的节点,均匀分布在不同的节点主机。 分片规则 一个大表被分成若干个分片表,就需要一定的规则。这样按照业务将数据分到某个分片的规则就是分片规则。 全局序列号 数据切分后,原有关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局数据唯一标识的机制就是全局序列号 5.MyCAT安装 下载地址:[link](http://dl.mycat.io/1.6.6.1/) ###1.Linux系统 - 到mycat项目主页下载linux安装包。 - 将解压后文件放到usr/local/mycat目录下 - mycat解压后目录如下 bin程序目录 conf配置文件存放目录 lib存放mycat项目依赖包目录 logs存放mycat日志目录 - mycat启动 vi /etc/profile 在系统环境变量文件中增加 MYCAT_HOME=/usr/local/mycat 执行source /etc/profile命令,使环境变量生效 经过以上两个步骤的配置后,就可以到/usr/local/mycat/bin目录下执行:/mycat start启动服务。 ###2.Windows系统 mycat在Windows中部署时,建议将解压后的目录放在根目录中,尽量在路径中不要包含中文路径。如:D:\Mycat-server-1.6-win\ 命令行启动方式: 从cmd命令中将路径切换到bin目录下,执行startup_nowrap.bat即可启动mycat服务。(mycat需要java环境支持,需先要求已有节哀吧、va环境。并且版本必须在1.7以上)。 ###2.基于zk的启动 ...... ...... ......

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册