精华内容
下载资源
问答
  • Maven主要功能

    千次阅读 2016-10-08 11:53:39
    链接:https://www.zhihu.com/question/20104186/answer/73797359目前笔者看到的Maven主要功能是:项目构建;项目构建;项目依赖管理;软件项目持续集成;版本管理;项目的站点描述信息管理; 由此可以看出Maven...

    作者:郭无心
    链接:https://www.zhihu.com/question/20104186/answer/73797359

    目前笔者看到的Maven的主要功能是:项目构建;项目构建;项目依赖管理;软件项目持续集成;版本管理;项目的站点描述信息管理;
    由此可以看出Maven最主要的体现在了哪2个词?——对了,“项目”和“管理”!加在一起就是项目管理。项目管理是一个很抽象的概念。项目管理既可以指技术上的管理手段,也可以指“以人为本”的非技术因素。诚然,无论是技术还是非技术,项目的成败最大的责任人其实就是项目经理。这里我们抛开人为因素不提,仅就技术上来说,Maven提供了一种思想让团队更科学的管理、构建项目。用配置文件的方式对项目的描述、名称、版本号、项目依赖等等信息进行描述。使之项目描述结构清晰,任何人接手的成本比较低。在项目构建时,利用Maven的“约定大于配置”的思想,可以比Ant脚本构建项目省去不少配置文件的内容。而且一个项目可能依赖于其他的项目和第三方的组件才能顺利完成,Maven提供了仓库的概念,让这些依赖项放进仓库中,项目想要从仓库中去取,其他项目组也需要,OK,从仓库中去取,不必每个人去开源项目的站点去苦苦搜寻了。如此人员的成本、软件维护的成本、沟通的成本、硬件的成本都降下来了。客户笑了、公司老板也笑了、项目经理笑了、团队里面的人员也笑了、Apache社区看到这么多人在用也笑了。给笔者的感觉,现在的开源东西越来越向“敏捷开发”、“极限编程”的方向靠拢。通过Maven辅助管理项目,更能发现项目中哪些模块是重复的轮子。

    展开全文
  • maven

    千次阅读 多人点赞 2018-07-11 16:03:00
    Maven的核心功能便是合理叙述项目间的依赖关系,通俗点讲,就是通过pom.xml文件的配置获取jar包,而不用手动去添加jar包 什么是maven项目 包含pom.xml的项目就是maven项目。 maven项目...

    概览

    在这里插入图片描述

    产生原因

    • 标准化
      在maven中,约定优于配置。规定好的标准,可以促进项目团队的标准化,减少写作冲突,在项目切换时免去了学习成本。这些标准具体包括:

      • 对于项目目录结构、测试用例命名方式等内容都有既定规则
      • 引入了仓库的概念,规范了jar包的获取方式(maven方式),从而使得获取的jar包内容也更加规范。之前,jar包的获取方式五花八门,使得获取的jar包的内容也有差异。并且,统一集中式管理jar包的方式,使得jar包共享,实现了jar包和项目分离,减轻了项目体积。
      • 标准化工程构建过程。提供了一个可复用、易维护的工程模型,从而让项目中各个工程可以更加方便地整合和交互,让团队更加方便协作
    • 自动化、智能化

      • 最大化地消除构建的重复,抽象了构建生命周期。不需要在定义构建过程,且不需要手动实现这些步骤。其中就包括常见的,将java编译成bin,自动执行所有单元测试等功能,无需依赖IDE工具即可实现)
      • 传统web工程jar包直接放在项目中,Maven提供免费而非常丰富的中央仓库,帮助我们自动下载构建,解决依赖问题。我们需要做的只是在每个项目的 pom 中定义好直接的依赖关系。
      • 管理原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等,节省了寻找信息的时间
      • 自动生成站点,从而使得轻松地获得项目文档、测试报告、静态分析报告、原码版本日志报告等非常具有价值的项目信息。
      • 将父工程和各个子工程或者模块打包成pom或者jar包到仓库中,为其他子工程或者模块提供相关依赖,更方便地将一个臃肿的大工程拆分成多个子工程或者模块,以便于团队协作开发。

    定义

    maven本质上是一个项目管理工具,提供了模板工具来帮助开发人员快速了解项目并加速开发:

    • 使用maven项目开发模板(包括项目架构构建过程等),开发人员可以在了解一个项目的架构后,迅速了解和操作多个实际的项目。
    • 使用maven提供的项目管理工具,开发人员可以加速项目开发和管理。

    maven是Apache开发的一款开源的服务于Java平台的自动化构建工具,完成重复性工作。2004年就产生了。

    具体步骤包括(不限于):

    • 工程目录的创建:标准化工程目录
    • 包的导入:同一个项目所有工程使用同一个自动导入包和包的依赖(快照)
    • 工程构建:本项目以及相关项目的自动化构建(清理、编译、测试、生成报告、打包、部署)
    • 创建工程文档

    工作原理相关知识

    安装目录

    • maven安装目录

      假设Maven_HOME为Maven的安装目录,该安装目录的内部目录包含:

      bin boot conf lib LICENSE.txt NOTICE.txt README.txt

      • bin: maven的运行脚本。执行任何一条mvn命令,实际上都是在调用这些脚本。
      • boot: maven的类加载器
      • conf: maven的配置文件,其中 settrings.xml 用于配置maven的全局行为。
      • lib: maven本身对应的.class文件,即maven本身
    • maven本地仓库目录

      maven默认的本地仓库目录为C:\Users\用户名\.m2目录

    生命周期

    • 定义

      maven对项目构建过程的抽象和统一,从理论上定义了maven的工作内容和工作过程。通过插件实现。

    • 内容

      maven定义了三套生命周期cleandefaultsite,各生命周期相互独立

      每个生命周期都包含了一些阶段(phase)【3套生命周期中phase详解】,每个生命周期中各phase执行时,必须从该生命周期第一个phase开始,按照既定顺序执行到要执行的phase。

      • clean:清理项目

      • default:部署项目(即通过“原材料”得到一个可运行项目的过程)

        主要(不是全部)包括:

        • validate:验证项目是否正确,提供必要的信息
        • compile:编译项目源代码
        • test:测试
        • package:打包
        • verify:检查集成测试结果
        • install:安装打包的项目到本地仓库,异构其他项目使用
        • deploy:部署,拷贝最终的工程包到远程仓库
      • site:生成项目站点(为工程相关信息生成一个HTML)

    插件

    • 定义

      java程序(jar包),通过maven命令调用运行。

    • 作用

      为实现maven定义的抽象的声明周期而生。每个插件包含多个插件目标(goal),goal和phase绑定,在使用maven命令实现某个phase时,实际上调用的是插件的goal。

    • 执行语法

      mvn [plugin-name]:[goal-name]
      

      例子:

      mvn compiler:comile //编译
      
    • 实现方法

      maven中每个插件可以实现多个功能(goal),通过将插件中的goalphase进行绑定,来实现maven的生命周期。maven对一些生命周期的phase绑定了默认插件目标,用户也可以在pom.xml中自定义绑定,实现自己定制的声明周期的实现。

    • 位置

      在maven仓库中

    • 补充说明

      用户可以根据需求,创建自己的maven插件。

    依赖

    依赖的释义

    依赖,作为名词,指的是工程代码中直接用到的别人已经写好的工程代码(.class文件)。作为动词,指一个工程代码对另外一个工程的代码的引用。

    依赖的配置

    <!-- 依赖的坐标(必选,其他可根据需要配置 -->
    <groupId>com.didispace</groupId>
    <artifactId>chapter1-1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- 依赖的类型(默认为jar) -->
    <type>jar</type>
    <!-- 依赖的范围(默认为compile) -->
    <scope>compile</scope>
    <!-- 标记依赖是否可选 -->
    <optional></optional>
    <!-- 排除传递性依赖 -->
    <exclusions></exclusions>
    
    <!-- 依赖的统一配置 -->
    <!-- 引用依赖属性值时,使用${属性名} -->
    <properties>
        <属性名>属性值</属性名>
    </properties>
    
    

    依赖范围

    依赖范围即依赖产生作用的时期,maven有三个classpath文件,分别在编译测试运行时用到。各依赖对应的.class文件,通过依赖被引入到对应classpath中,依赖范围对应依赖被引入到哪个classpath。除了表中的依赖范围之外,还有一个import依赖范围,其只在dependencyManagement元素中使用,用于导入其他dependencyManagement的配置。

    依赖范围含义编译测试运行例子
    compile编译时用到的依赖,依赖的默认值YYYspring-core
    test仅测试时用到的依赖YJUnit
    provided容器已提供的依赖YYservlet-api
    runtime运行时用到了依赖YYJDBC驱动实现
    system操作系统提供的依赖YY本地的,maven仓库外的类库文件

    依赖的传递性

    maven通过pom文件中,在标签工程的直接依赖,如果也使用pom文件来声明自己的直接依赖,直接依赖的直接依赖也是同样,那么如此循环下去,工程的直接依赖以及所有间接依赖就都可以通过传递性获知。因此,每个工程只需要在自己的pom文件中声明好自己直接依赖即可

    依赖的传递性和依赖的作用范围有关。下表中,最左边一列表示工程的第一直接依赖范围,第一行表示工程的第二直接依赖范围(即工程直接依赖的直接依赖),中间的交叉单元格表示传递性依赖范围(为空表示依赖不会传递,即不存在依赖关系)。

    1 2compiletestprovidedruntime
    compilecompileruntime
    testtesttest
    providedprovidedprovidedprovided
    runtimeruntimeruntime

    父子继承关系的项目的依赖,不论什么范围(compile、test、provided、runtime)可以由父项目传递(继承)下给子项目。因此可以利用父工程pom文件,实现所有子工程依赖“一改全改”。

    依赖冲突的解决原则

    • 路径近者优先

      A–>B–>C–>D–>X(1.6)
      A–>E–>D–>X(2.0)
      

      X(2.0)距离项目A更近,项目A使用X(2.0)

    • 先声明者优先

      A–>B–> X(1.6)
      A–>C–> X(2.0)
      

      路径相同时,B先于C声明,则项目A使用X(1.6)

    可选依赖&排除依赖

    可选依赖和排除依赖都是阻断依赖传递的方法。可选依赖阻断的是依赖本项目的项目对本项目的依赖之间的依赖关系,排除依赖阻断的是本项目和间接依赖之间的依赖关系。

    • 可选依赖

    在这里插入图片描述

    项目B的某些依赖不推荐被依赖B的项目所使用时,需要将这些依赖声明成可选依赖。可选依赖不会被传递,即X和Y不会被A依赖。如果项目A想使用X作为依赖,则需要在自己的pom文件中重新声明。

    • 排除依赖

      项目A不想使用他的某些间接依赖时使用。如项目A所的依赖没有正确的设置它们的依赖集。被排除的依赖不会被传递,即依赖项目A的项目,不会依赖被A排除的依赖。

    依赖的统一配置

    pom文件中,某些重复出现的常量值可能需要同步变动,如需要统一的版本号。此时,为实现pom文件一改全改的需求,就需要使用\ </properties>标签,声明常量名和常量值,并在常量出现的地方,使用${常量名}的方式引用常量。如:

    <properties>
        <springframework.version>属性值</springframework.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework,version}</version>
        </dependency>
    </dependencies>
    

    POM

    • 定义

      Project Object Model:项目对象模型。是 Maven 项目核心基本工作单元

      放在工程目录下,文件命名为 pom.xml,包含了关于maven项目的项目构建配置信息,主要包括项目自身的信息,项目的依赖,项目运行所需环境信息(如:jdk,tomcat)。

      maven是根据 pom.xml 来识别maven工程的

      pom.xml在打包以后就会变成.pom文件

      在maven中执行maven命令:在 pom.xml 上右键

    Super POM

    所有的 POM 都继承自一个父 POM,用于继承默认设置,帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被重写。

    pom文件没有显示声明继承关系时,Maven有一个默认POM作为 Super POM

    Maven 使用 effective pom(Super pom + 工程自己的 pom)来执行相关的目标。

    父 POM 通过<parent></parent>标签指定

     <parent>
        <groupId>com.mycompany.app</groupId>
        <artifactId>my-app</artifactId>
        <version>1</version>
      </parent>
    

    使用时需知知识

    标准目录结构

    maven的标准项目结构如下,当然也可以通过更改pom.xml来配置适合自己的项目结构。

    project (项目根目录)

    • src (源码)
      • main (主程序)
        • java (java源码)
        • resources (应用资源)
        • filters (资源过滤器文件)
        • webapp (web应用资源)
      • test (测试程序)
        • java
        • resources
        • filters
      • it (集成测试(主要针对插件))
      • assembly (装配描述符)
      • site (站点)
    • target (编译结果,存放java项目编译后生成的.class文件)
    • LICENSE.txt
    • NOTICE.txt (项目所依赖的库所需的通知和属性)
    • README.txt
    • pom.xml:maven的核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置

    坐标-完全限定名

    构件(项目的依赖插件,以及该项目的构建输出)的完全限定名,用于在maven的各种仓库中,唯一地定位一个构件。

    构件在maven仓库中对应的目录groupId/artifactId/version。如下面例子对应的构件的文件夹为:com/didispace/charpter1-1/0.0.1-SNAPSHOT。

    构件名字为artifactId-version[-classifier].packaging。如下面例子对应的文件的名字为 charpter1-1-0.0.1-SNAPSHOT.jar。

    <!-- Maven的坐标包含,但不仅限于以下子标签: -->
    <!-- 工程组名                 (必须) -->
    <groupId>com.didispace</groupId>
    <!-- 工程名(jar包名字前半部分)  (必须) -->
    <artifactId>chapter1-1</artifactId>
    <!-- 工程版本(jar包名字后半部分)(必须) -->
    <version>0.0.1-SNAPSHOT</version>
    <!-- 工程打包方式             (可选,默认为jar) -->
    <packaging>jar</packaging>
    

    除了groupId,artifactId,version,packaging外,还有一个元素classifier:

    该元素用来帮助定义项目构建输出的一些附属构件。附属构件和主构件对应,包括项目的Java文档和源代码等。附属构件不是项目直接默认生成的,需要单独用一些插件来生成,因此不能像 groupId等元素一样直接定义。

    仓库

    • 分类

      • 项目仓库:项目内文件夹中的依赖包
        需要在pom.xml中配置proper

        <--! 格式 -->
        <repositories>
           <repository>
             <id>仓库唯一标识符</id>
             <name>仓库的描述</name>
             <url>仓库的路径</url>
           </repository>
        </repositories>
        
        <--! 例子 -->
        <repositories>
           <repository>
             <id>in-project</id>
             <name>In Project Repo</name>
             <url>file:///${project.basedir}\libs</url>
           </repository>
        </repositories>
        

        其中,${project.basedir}是pom.xml在系统中的路径。file:/// 的含义

        当然,本地仓库和远程仓库也可以通过上述标签配置,只需将仓库的项目的URL改成项目地址。

      • 本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有maven工程服务。

        默认的仓库位置为:

         [系统当前用户home目录]/.m2/repository
        

        修改本地库位置:在MAVEN_HOME/conf/setting.xml文件中修改

      • 远程仓库

        • 私服:搭建在局域网环境中,为局域网范围内所有maven工程服务,主流使用Nexus。

          有本地主机需要的jar包时,为本地主机提供jar包;没有本地主机需要的jar包时,代替本地主机从中央仓库下载需要的jar包。

        • 中央仓库:Maven社区提供的,为全世界所有maven工程服务。maven的默认远程仓库,安装时自带配置,需要联网访问。

        • 其他公共库:需要在POM中手动配置。

      • 外部依赖

        由于一些原因,存在于某个不是本地仓库和远程仓库下的依赖。例子

        <dependencies>
            <!-- 在这里添加你的依赖 -->
            <dependency>
                <groupId>ldapjdk</groupId>  <!-- 库名称,也可以自定义 -->
                <artifactId>ldapjdk</artifactId>    <!--库名称,也可以自定义-->
                <version>1.0</version> <!--版本号-->
                <scope>system</scope> <!--作用域-->
                <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath> <!--项目根目录下的lib文件夹下-->
            </dependency> 
        </dependencies>
        
    • 内容

      maven仓库中所有内容都按照统一方式管理和查找。仓库中的内容(即构件)包括:

      • maven插件
      • 第三方的框架或工具的jar包等依赖
      • 我们自己开发的项目的模块:需要执行 mvn install 命令,才能将包打入到仓库
    • 使用顺序

      本地仓库–>私服–>中央仓库–>其他远程仓库

      上一个没有,去下一个查找,连接私服和中央仓库均需要联网

    快照

    需要依赖处于不断更新状态的的版本的依赖(快照)时,Maven 会在每次构建时检查快照最新版本。快照版本通过在版本号后面加SNAPSHOT或者日期和常规版本进行区分。

    <dependencies>
          <dependency>
          <groupId>data-service</groupId>
             <artifactId>data-service</artifactId>
             <version>1.0-SNAPSHOT</version>
             <!-- 或者 <version>1.0-20190212.221414-13</version> -->
             <!-- 上面的表示2019年2月12日,22点14分14秒,第13个版本 -->
             <scope>test</scope>
          </dependency>
    </dependencies>
    
    

    继承

    • 定义:

      多个模块的pom存在很多相同配置时,为减少重复代码,统一配置信息,maven通过将相同配置信息写到一个父pom文件中,这些模块的pom文件作为子pom文件,继承父POM文件中的配置(即,可以不用显示声明父pom中已经存在的相关配置信息)。

    • 使用:

      • 声明一个父模块,父模块的打包方式为pom(通过在父pom文件中,设置<packaging>pom</packaging>实现),父模块一般只需要定义好pom.xml中的依赖即可,无需编写其他代码。在父模块中的pom文件中,写入所有子模块的统一配置信息,在所有子模块的<parent>标签中配置父模块信息,包括<groupId>、<artifactId>、<version>以及<relativePath>。其中,<relativePath>的默认值为 …/pom.xml,即maven默认父POM在上一层目录。

      • 如果子模块中需要使用和父模块中不一样的配置,则子模块应该显式声明。子模块会继承所有父模块相关的依赖配置(包括compile、test、provided、runtime)。

      • 可继承的pom元素

        • groupId

        • version

        • description:项目的描述信息

        • organization:项目的组织信息

        • inceptionYear:项目的创始年份

        • url:项目的URL地址

        • developers:项目的开发者信息

        • contributions:项目的贡献者信息

        • distributionManagement:项目的部署配置

        • issueManagement:项目的缺陷跟踪系统信息

        • ciManagement:项目的持续集成系统信息

        • scm:项目的版本控制系统信息

        • mailingLists:项目的邮件列表信息

        • properties:自定义的Maven属性

        • dependencies:项目的依赖配置

        • dependencyManagement:项目的依赖管理配置

          <!--dependencyManagement标签下的依赖,不会在父项目中引入依赖,也不会给他的子模块引入依赖,只有子类显示声明(如只包含groupId和artifactId)该标签下的依赖时,才会继承依赖的配置-->
          <dependencyManagement>
              <dependencies>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-core</artifactId>
                      <version>2.0</version>
                  </dependency>
                  <dependency>
                      <groupId>com.juvenxu.mvnbook.account</groupId>
                      <artifactId>account-parent</artifactId>
                      <version>1.0-SHAPSHOP</version>
                      <type>pom</type>
                      <!--将依赖范围设为import,导入其他dependencyManagement的配置-->
                      <scope>import</scope>
                  </dependency>
              </dependencies>
          </dependencyManagement>
          
        • repositories:项目的仓库配置

        • build:项目的源码目录配置、输出目录配置、插件配置、插件管理配置等

        • reporting:项目的报告输出目录配置、报告插件配置等

    聚合

    • 定义:

      通过一个打包方式为pom的maven项目中,声明任意数量的module元素来实现一次性构建多个模块。当被构建的各个模块存在依赖关系时,maven会自动识别各个模块间的依赖关系,先构建被依赖的模块。

    • 使用:

      • 为了方便用户构建项目,通常将聚合模块放在项目目录最顶层,其他模块最为聚合模块的子模块。

      • module元素的值对应被构建模块和当前POM的相对目录。

    项目模板 Archetype

    为了帮助程序员快速创建一个项目结构,maven提供了archetype(原型/项目模板)插件。

    命令

    执行mvn命令时,需要调用bin目录下的脚本,大多数maven命令都需要依赖插件才能执行。

    maven的命令跨平台(因为是java脚本),在Windows、Linux、Mac都是一样的命令。

    执行和声明周期过程有关的maven命令,必须在pom.xml所在目录

    • [1] 清理:mvn clean
    • [2] 编译:mvn compile
    • [3] 编译测试:mvn test-compile
    • [4] 执行测试:mvn test
    • [5] 打包:mvn package
    • [6] 安装:mvn install
    • [7] 部署:mvn site

    常见问题

    生命周期和插件的关系?

    每套生命周期对应一个接口/抽象类,生命周期中的每个阶段(phase)对应一个方法声明。生命周期定义了phase的顺序,但是没有实现方法。插件目标goal可以看做是生命周期各个phase对应方法的实现,为复用代码,多个相似功能的goal组合成一个插件。使用maven命令执行到生命周期某个phase时,是通过将该phase和对应插件goal绑定实现的。maven的插件高度易扩展,可以自定义配置,插件和phase间的绑定关系也可以自定义。

    不推荐使用IDE内嵌的Maven的原因

    • IDE内嵌的maven通常比较新,不一定稳定
    • IDE内嵌的maven和系统安装的maven的命令如果是不同版本,会造成构建行为不一致

    什么是构建?

    构建(build)对应的就是maven的三个生命周期,其中核心是default

    什么是构件?

    构件包括构建项目时使用的依赖、插件,以及该项目的构建完成后的输出。

    构件通过坐标定位,根据坐标在仓库中取得。

    命令和插件的关系

    maven命令的执行,使用的是maven安装目录下的bin目录中的脚本。

    大部分maven命令的执行,需要依赖插件,即bin目录中的脚本会调用相关插件实现特定功能。

    maven的配置文件有哪些?

    maven的配置文件包括:

    • pom.xml

      某个项目范围内有效

    • %USER_HOME%/.m2/settings.xml

      某个用户范围内有效

    • ${maven.home}/conf/settings.xml

      全局范围有效

    其他:

    • maven可以通过settings.xml文件设置默认jdk,且不同maven可以识别的jdk版本会不同

    artifact是什么?

    artifact是maven中的一个概念,对应的是被打包文件的名字,也就对应一个被打包的文件。在IntelliJ IDEA中,module是编译、运行、测试和调试的单位,也是打包的单位。因此IDEA中使用maven时,一个module对应一个artifact包。

    参考文献

    https://blog.csdn.net/wangdong5678999/article/details/72848044 maven生命周期
    https://www.cnblogs.com/luotaoyeah/p/3819001.html maven的生命周期和插件
    https://www.runoob.com/maven/maven-tutorial.html maven 菜鸟教程
    https://www.cnblogs.com/tooy/p/7364303.html 可选依赖和排除依赖
    https://blog.csdn.net/weixin_42112635/article/details/87465997 外部依赖
    https://www.runoob.com/maven/maven-snapshots.html 快照
    https://blog.csdn.net/xiaoniaox/article/details/79029130 artifact 《Maven实战》
    https://blog.csdn.net/zlgydx/article/details/51130627 maven 仓库配置 pom中repositories属性 - CSDN
    https://blog.csdn.net/zhangbeizhen18/article/details/91353832 使用IntelliJ IDEA创建基于maven的父工程与子工程

    展开全文
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 之所以会提出这个问题,是因为即使使用Maven我们仍然可以进行B/S结构项目的开发。从表述层、业务逻辑层到持久化层再到数据库都有成熟的解决方案——使用Maven我们一样可以开发项目啊?所以我们有必要通过企业...

    第一章 Why

    Maven是干什么用的?这是很多同学在学完这个课程后最大的问题。之所以会提出这个问题,是因为即使不使用Maven我们仍然可以进行B/S结构项目的开发。从表述层、业务逻辑层到持久化层再到数据库都有成熟的解决方案——不使用Maven我们一样可以开发项目啊?所以我们有必要通过企业开发中的实际需求来看一看哪些方面是我们现有技术的不足。

    1.1 添加第三方jar包

    在今天的JavaEE开发领域,有大量的第三方框架和工具可以供我们使用。要使用这些jar包最简单的方法就是复制粘贴到WEB-INF目录下的lib目录下。但是这会导致每次创建一个新的工程就需要将jar包重复复制到lib目录下,从而造成工作区中存在大量重复的文件。

    而使用Maven后每个jar包只在本地仓库中保存一份,需要jar包的工程只需要维护一个文本形式的jar包的引用——我们称之为“坐标”。不仅极大的节约了存储空间,让项目更轻巧,更避免了重复文件太多而造成的混乱。

    1.2 jar包之间的依赖关系

    jar包往往不是孤立存在的,很多jar包都需要在其他jar包的支持下才能够正常工作,我们称之为jar包之间的依赖关系。最典型的例子是:commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar,如果没有IO包,FileUpload包就不能正常工作。

    那么问题来了,你知道你所使用的所有jar包的依赖关系吗?当你拿到一个新的从未使用过的jar包,你如何得知他需要哪些jar包的支持呢?如果不了解这个情况,导入的jar包不够,那么现有的程序将不能正常工作。再进一步,当你的项目中需要用到上百个jar包时,你还会人为的,手工的逐一确认它们依赖的其他jar包吗?这简直是不可想象的。

    而引入Maven后,Maven就可以替我们自动的将当前jar包所依赖的其他所有jar包全部导入进来,无需人工参与,节约了我们大量的时间和精力。用实际例子来说明就是:通过Maven导入commons-fileupload-1.3.jar后,commons-io-2.0.1.jar会被自动导入,程序员不必了解这个依赖关系。

    1.3 处理jar包之间的冲突

    上一点说的是jar包不足项目无法正常工作,但其实有的时候jar包多了项目仍然无法正常工作,这就是jar包之间的冲突。

    举个例子:我们现在有三个工程MakeFriend、HelloFriend、和Hello。MakeFriend依赖HelloFriend,HelloFriend依赖Hello。而Hello依赖log4j.1.2.17.jar,HelloFriend依赖log4j.1.2.14.jar。如下图所示:

    那么MakeFriend工程的运行时环境中该导入log4j.1.2.14.jar呢还是log4j.1.2.17.jar呢?

    这样的问题一个两个还可以手工解决,但如果系统中存在几十上百的jar包,他们之间的依赖关系会非常复杂,几乎不可能手工实现依赖关系的梳理。

    使用Maven就可以自动的处理jar包之间的冲突问题。因为Maven中内置了两条依赖原则:最短路径者优先和先声明者优先,上述问题MakeFriend工程会自动使用log4j.1.2.14.jar。

    1.4 获取第三方jar包

    JavaEE开发中需要使用到的jar包种类繁多,几乎每个jar包在其本身的官网上的获取方式都不尽相同。为了查找一个jar包找遍互联网,身心俱疲,没有经历过的人或许体会不到这种折磨。不仅如此,费劲心血找的jar包里有的时候并没有你需要的那个类,又或者又同名的类没有你要的方法——以不规范的方式获取的jar包也往往是不规范的。

    使用Maven我们可以享受到一个完全统一规范的jar包管理体系。你只需要在你的项目中以坐标的方式依赖一个jar包,Maven就会自动从中央仓库进行下载并同时下载这个jar包所依赖的其他jar——规范、完整、准确!一次性解决所有问题!

    Tips:在这里我们顺便说一下,统一的规范几乎可以说成是程序员的最高信仰。如果没有统一的规范,就意味着每个具体的技术都各自为政,需要以诸多不同的特殊的方式加入到项目中;好不容易加入进来还会和其他技术格格不入,最终受苦的是我们。而任何一个领域的统一规范都能够极大的降低程序员的工作难度,减少工作量。例如:USB接口可以外接各种设备,如果每个设备都有自己独特的接口,那么不仅制造商需要维护各个接口的设计方案,使用者也需要详细了解每个设备对应的接口,无疑是非常繁琐的。

    1.5 将项目拆分成多个工程模块

    随着JavaEE项目的规模越来越庞大,开发团队的规模也与日俱增。一个项目上千人的团队持续开发很多年对于JavaEE项目来说再正常不过。那么我们想象一下:几百上千的人开发的项目是同一个Web工程。那么架构师、项目经理该如何划分项目的模块、如何分工呢?这么大的项目已经不可能通过package结构来划分模块,必须将项目拆分成多个工程协同开发。多个模块工程中有的是Java工程,有的是Web工程。

    那么工程拆分后又如何进行互相调用和访问呢?这就需要用到Maven的依赖管理机制。大家请看我们的Survey调查项目拆分的情况:

    上层模块依赖下层,所以下层模块中定义的API都可以为上层所调用和访问。

    1.6 实现项目的分布式部署

    在实际生产环境中,项目规模增加到一定程度后,可能每个模块都需要运行在独立的服务器上,我们称之为分布式部署,这里同样需要用到Maven。

    第二章 What

    如果上面的描述能够使你认识到使用Maven是多么的重要,我们下面就来介绍一下Maven是什么。

    2.1 自动化构建工具

    Maven这个单词的本意是:专家,内行。读音是['meɪv(ə)n]或['mevn],不要读作“妈文”。

    Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。在JavaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁:

    Make→Ant→Maven→Gradle→其他……

    那么什么是构建呢?

    2.2 构建的概念

    构建并不是创建,创建一个工程并不等于构建一个项目。要了解构建的含义我们应该由浅入深的从以下三个层面来看:

    ①纯Java代码

    大家都知道,我们Java是一门编译型语言,.java扩展名的源文件需要编译成.class扩展名的字节码文件才能够执行。所以编写任何Java代码想要执行的话就必须经过编译得到对应的.class文件。

    ②Web工程

    当我们需要通过浏览器访问Java程序时就必须将包含Java程序的Web工程编译的结果“拿”到服务器上的指定目录下,并启动服务器才行。这个“拿”的过程我们叫部署

    我们可以将未编译的Web工程比喻为一只生的鸡,编译好的Web工程是一只煮熟的鸡,编译部署的过程就是将鸡炖熟。

    Web工程和其编译结果的目录结构对比见下图:

    ③实际项目

    在实际项目中整合第三方框架,Web工程中除了Java程序和JSP页面、图片等静态资源之外,还包括第三方框架的jar包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才可以运行。

    所以综上所述:构建就是以我们编写的Java代码、框架配置文件、国际化等其他资源文件、JSP页面和图片等静态资源作为“原材料”,去生产出一个可以运行的项目的过程。

    那么项目构建的全过程中都包含哪些环节呢?

    2.3 构建环节

    ①清理:删除以前的编译结果,为重新编译做好准备。

    ②编译:将Java源程序编译为字节码文件。

    ③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。

    ④报告:在每一次测试后以标准的格式记录和展示测试结果。

    ⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对应war包。

    ⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。

    ⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。

    2.4 自动化构建

    其实上述环节我们在Eclipse中都可以找到对应的操作,只是不太标准。那么既然IDE已经可以进行构建了我们为什么还要使用Maven这样的构建工具呢?我们来看一个小故事:

    这是阳光明媚的一天。托马斯向往常一样早早的来到了公司,冲好一杯咖啡,进入了自己的邮箱——很不幸,QA小组发来了一封邮件,报告了他昨天提交的模块的测试结果——有BUG。“好吧,反正也不是第一次”,托马斯摇摇头,进入IDE,运行自己的程序,编译打包部署到服务器上,然后按照邮件中的操作路径进行测试。“嗯,没错,这个地方确实有问题”,托马斯说道。于是托马斯开始尝试修复这个BUG,当他差不多有眉目的时候已经到了午饭时间。

    下午继续工作。BUG很快被修正了,接着托马斯对模块重新进行了编译打包部署,测试之后确认没有问题了,回复了QA小组的邮件。

    一天就这样过去了,明媚的阳光化作了美丽的晚霞,托马斯却觉得生活并不像晚霞那样美好啊。

    让我们来梳理一下托马斯这一天中的工作内容

    从中我们发现,托马斯的很大一部分时间花在了“编译、打包、部署、测试”这些程式化的工作上面,而真正需要由“人”的智慧实现的分析问题和编码却只占了很少一部分。

    能否将这些程式化的工作交给机器自动完成呢?——当然可以!这就是自动化构建。

    那么Maven又是如何实现自动化构建的呢?简单的说来就是它可以自动的从构建过程的起点一直执行到终点:

    2.5 Maven核心概念

    Maven之所以能够实现自动化的构建,和它的设计是紧密相关的。我们对Maven的学习就围绕它的九个核心概念展开:

    ①POM

    ②约定的目录结构

    ③坐标

    ④依赖管理

    ⑤仓库管理

    ⑥生命周期

    ⑦插件和目标

    ⑧继承

    ⑨聚合

    第三章 How

    在这一节中,我们来看看Maven核心程序的安装和本地仓库的必要设置。然后我们就可以编写第一个Maven程序了。

    • 检查JAVA_HOME环境变量。

    Maven是使用Java开发的,所以必须知道当前系统环境中JDK的安装目录。

    C:\Windows\System32>echo %JAVA_HOME%

    C:\Java\jdk1.8.0_45

    • 解压Maven的核心程序。

    将apache-maven-3.5.0-bin.zip解压到一个非中文无空格的目录下。例如:

    D:\Server\apache-maven-3.5.0

    • 配置环境变量。

    M2_HOME   

    D:\Server\ apache-maven-3.5.0

    path

    %M2_HOME%\bin或D:\Server\ apache-maven-3.5.0\bin

    ④查看Maven版本信息验证安装是否正确

    ⑤配置本地仓库

    [1]Maven默认的本地仓库:~\.m2\repository目录。

    Tips:~表示当前用户的目录。

    [2]Maven的核心程序并不包含具体功能,仅负责宏观调度。具体功能由插件来完成。Maven核心程序会到本地仓库中查找插件。如果本地仓库中没有就会从远程中央仓库下载。此时如果不能上网则无法执行Maven的具体功能。为了解决这个问题,我们可以将Maven的本地仓库指向一个在联网情况下下载好的目录。

    [3]Maven的核心配置文件位置:

    解压目录\ D:\Server\ apache-maven-3.5.0\conf\settings.xml

    [4]设置方式

    <localRepository>以及准备好的仓库位置</localRepository>

    <localRepository>D:/RepMaven</localRepository>

    第四章 第一个Maven程序(练习常用命令)

    ●第一步:创建约定的目录结构

    Hello

            src

            ——main

            ————java

            ————resources

            ——test

            ————java

            ————resources

            pom.xml

    main目录用于存放主程序。

    test目录用于存放测试程序。

    java目录用于存放源代码文件。

    resources目录用于存放配置文件和资源文件。

    ●第二步:创建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.atguigu.maven</groupId>

           <artifactId>Hello</artifactId>

           <version>0.0.1-SNAPSHOT</version>

           <name>Hello</name>

           <dependencies>

                  <dependency>

                         <groupId>junit</groupId>

                         <artifactId>junit</artifactId>

                         <version>4.9</version>

                         <scope>test</scope>

                  </dependency>

           </dependencies>

    </project>

    ●第三步:编写主代码

    src/main/java/com/atguigu/maven目录下新建文件Hello.java

    package com.atguigu.maven;

    public class Hello {

           public String sayHello(String name){

                  return "Hello "+name+"!";

           }

    }

    ●第四步:编写测试代码

    /src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java

    package com.atguigu.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);    //断言

           }

    }

    ●第五步:运行几个基本的Maven命令

    ①打开cmd命令行,进入Hello项目根目录(pom.xml文件所在目录)执行mvn compile命令,查看根目录变化

    • cmd 中继续录入mvn clean命令,然后再次查看根目录变化
    • cmd 中录入 mvn clean compile命令, 查看根目录变化
    • cmd 中录入 mvn test-compile命令,查看target目录变化
    • cmd 中录入 mvn clean test命令,查看target目录变化
    • cmd 中录入mvn clean package命令,查看target目录变化
    • cmd中录入mvn source:jar命令,查看target目录变化

    注意:运行Maven命令时一定要进入pom.xml文件所在的目录!

    第五章 POM

    Project Object Model:项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型。Maven工程的核心配置。可以说学习Maven就是学习pom.xml文件中的配置。

    第六章 约定的目录结构

    现在JavaEE开发领域普遍认同一个观点:约定>配置>编码。意思就是能用配置解决的问题就不编码,能基于约定的就不进行配置。而Maven正是因为指定了特定文件保存的目录才能够对我们的Java工程进行自动化构建。

    目录结构含义参见前面的描述。

    第七章 坐标

    7.1 几何中的坐标

    [1]在一个平面中使用x、y两个向量可以唯一的确定平面中的一个点。

    [2]在空间中使用x、y、z三个向量可以唯一的确定空间中的一个点。

    7.2 Maven的坐标

    使用如下三个向量在Maven的仓库中唯一的确定一个Maven工程。

    [1]groupId:公司或组织的域名倒序+当前项目名称

    [2]artifactId:当前项目的模块名称

    [3]version:当前模块的版本

    <groupId>com.atguigu.maven</groupId>

    <artifactId>Hello</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    7.3 如何通过坐标到仓库中查找jar包

    [1]将gav三个向量连起来

    com.atguigu.maven+Hello+0.0.1-SNAPSHOT

    [2]以连起来的字符串作为目录结构到仓库中查找

    com/atguigu/maven/Hello/0.0.1-SNAPSHOT/Hello-0.0.1-SNAPSHOT.jar

    ※注意:我们自己的Maven工程必须执行安装操作才会进入仓库。安装的命令是:mvn install

    第八章 第二个Maven工程(练习依赖引用)

    8.1 目录结构

    HelloFriend

            src

            ——main

            ————java

            ————resources

            ——test

            ————java

            ————resources

            pom.xml

    8.2 POM文件

    <?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.atguigu.maven</groupId>

             <artifactId>HelloFriend</artifactId>

             <version>0.0.1-SNAPSHOT</version>

             <name>HelloFriend</name>

            

                  <dependencies>

                         <dependency>

                                <groupId>junit</groupId>

                                <artifactId>junit</artifactId>

                                <version>4.9</version>

                                <scope>test</scope>

                         </dependency>           

                        

                         <dependency>

                                <groupId>com.atguigu.maven</groupId>

                                <artifactId>Hello</artifactId>

                                <version>0.0.1-SNAPSHOT</version>

                                <scope>compile</scope>

                         </dependency>

                        

                  </dependencies>

           </project>

    8.3 主程序

    在src/main/java/com/atguigu/maven目录下新建文件HelloFriend.java

    package com.atguigu.maven;    

           import com.atguigu.maven.Hello;

           public class HelloFriend {

                  public String sayHelloToFriend(String name){

                         Hello hello = new Hello();

                         String str = hello.sayHello(name)+" I am "+this.getMyName();

                         System.out.println(str);

                         return str;

                  }

                  public String getMyName(){

                         return "John";

                  }

           }

    8.4 测试程序

    在/src/test/java/com/atguigu/maven目录下新建测试文件HelloFriendTest.java

    package com.atguigu.maven;    

    import static junit.framework.Assert.assertEquals;

    import org.junit.Test;

    import com.atguigu.maven.Hello;

          

    public class HelloFriendTest {

           @Test

           public void testHelloFriend(){

                  HelloFriend helloFriend = new HelloFriend();

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

                  assertEquals("Hello litingwei! I am John",results); 

           }

    }

    8.5 关键:对Hello的依赖

    这里Hello就是我们的第一个Maven工程,现在HelloFriend对它有依赖。那么这个依赖能否成功呢?更进一步的问题是:HelloFriend工程会到哪里去找Hello呢?

    答案是:本地仓库。任何一个Maven工程会根据坐标到本地仓库中去查找它所依赖的jar包。如果能够找到则可以正常工作,否则就不行。

    第九章 依赖管理

    9.1 基本概念

    当A jar包需要用到B jar包中的类时,我们就说A对B有依赖。例如:commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar。

    通过第二个Maven工程我们已经看到,当前工程会到本地仓库中根据坐标查找它所依赖的jar包。

    配置的基本形式是使用dependency标签指定目标jar包的坐标。例如:

           <dependencies>

                  <dependency>

                         <!—坐标 -->

                         <groupId>junit</groupId>

                         <artifactId>junit</artifactId>

                         <version>4.10</version>

                         <!-- 依赖的范围 -->

                         <scope>test</scope>

                  </dependency>

           </dependencies>

    9.2 直接依赖和间接依赖

    如果A依赖B,B依赖C,那么A→B和B→C都是直接依赖,而A→C是间接依赖。

    9.3 依赖的范围

    当一个Maven工程添加了对某个jar包的依赖后,这个被依赖的jar包可以对应下面几个可选的范围:

    compile

    [1]main目录下的Java代码可以访问这个范围的依赖

    [2]test目录下的Java代码可以访问这个范围的依赖

    [3]部署到Tomcat服务器上运行时放在WEB-INF的lib目录下

    例如:对Hello的依赖。主程序、测试程序和服务器运行时都需要用到。

    test

    [1]main目录下的Java代码不能访问这个范围的依赖

    [2]test目录下的Java代码可以访问这个范围的依赖

    [3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下

    例如:对junit的依赖。仅仅是测试程序部分需要。

    provided

    [1]main目录下的Java代码可以访问这个范围的依赖

    [2]test目录下的Java代码可以访问这个范围的依赖

    [3]部署到Tomcat服务器上运行时不会放在WEB-INF的lib目录下

    例如:servlet-api在服务器上运行时,Servlet容器会提供相关API,所以部署的时候不需要。

    ④runtime[了解]

    [1]main目录下的Java代码不能访问这个范围的依赖

    [2]test目录下的Java代码可以访问这个范围的依赖

    [3]部署到Tomcat服务器上运行时放在WEB-INF的lib目录下

    例如:JDBC驱动。只有在测试运行和在服务器运行的时候才决定使用什么样的数据库连接。

    ⑤其他:import、system等。

    各个依赖范围的作用可以概括为下图:

    9.4 依赖的传递性

    当存在间接依赖的情况时,主工程对间接依赖的jar可以访问吗?这要看间接依赖的jar包引入时的依赖范围——只有依赖范围为compile时可以访问。例如:

    Maven工程

    依赖范围

    对A的可见性

    A

    B

    C

    compile

    D

    test

    ×

    E

    provided

    ×

    9.5 依赖的原则:解决jar包冲突

    ①路径最短者优先

    ②路径相同时先声明者优先

    这里“声明”的先后顺序指的是dependency标签配置的先后顺序。

    9.6 依赖的排除

    有的时候为了确保程序正确可以将有可能重复的间接依赖排除。请看如下的例子:

    ●假设当前工程为survey_public,直接依赖survey_environment。

    ●survey_environment依赖commons-logging的1.1.1对于survey_public来说是间接依赖。

    ●当前工程survey_public直接依赖commons-logging的1.1.2

    ●加入exclusions配置后可以在依赖survey_environment的时候排除版本为1.1.1的commons-logging的间接依赖

    <dependency>

           <groupId>com.atguigu.maven</groupId>

           <artifactId>Survey160225_4_Environment</artifactId>

           <version>0.0.1-SNAPSHOT</version>

           <!-- 依赖排除 -->

           <exclusions>

                  <exclusion>

                         <groupId>commons-logging</groupId>

                         <artifactId>commons-logging</artifactId>

                  </exclusion>

           </exclusions>

    </dependency>

    <dependency>

           <groupId>commons-logging</groupId>

           <artifactId>commons-logging</artifactId>

           <version>1.1.2</version>

    </dependency>

    9.7 统一管理目标jar包的版本

    以对Spring的jar包依赖为例:Spring的每一个版本中都包含spring-core、spring-context等jar包。我们应该导入版本一致的Spring jar包,而不是使用4.0.0的spring-core的同时使用4.1.1的spring-context。

    <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-core</artifactId>

           <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-context</artifactId>

           <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-jdbc</artifactId>

           <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-orm</artifactId>

           <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-web</artifactId>

           <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

           <groupId>org.springframework</groupId>

           <artifactId>spring-webmvc</artifactId>

           <version>4.0.0.RELEASE</version>

    </dependency>

    问题是如果我们想要将这些jar包的版本统一升级为4.1.1,是不是要手动一个个修改呢?显然,我们有统一配置的方式:

    <properties>

           <spring.version>4.1.1.RELEASE</spring.version>

    </properties>

    ……

                  <dependency>

                         <groupId>org.springframework</groupId>

                         <artifactId>spring-core</artifactId>

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

                  </dependency>

                  <dependency>

                         <groupId>org.springframework</groupId>

                         <artifactId>spring-context</artifactId>

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

                  </dependency>

                  <dependency>

                         <groupId>org.springframework</groupId>

                         <artifactId>spring-jdbc</artifactId>

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

                  </dependency>

                  <dependency>

                         <groupId>org.springframework</groupId>

                         <artifactId>spring-orm</artifactId>

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

                  </dependency>

                  <dependency>

                         <groupId>org.springframework</groupId>

                         <artifactId>spring-web</artifactId>

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

                  </dependency>

                  <dependency>

                         <groupId>org.springframework</groupId>

                         <artifactId>spring-webmvc</artifactId>

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

                  </dependency>

    这样一来,进行版本调整的时候只改一改地方就行了。

    第十章 仓库

    10.1 分类

    [1]本地仓库:为当前本机电脑上的所有Maven工程服务。

    [2]远程仓库

    (1)私服:架设在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。

    (2)中央仓库:架设在Internet上,为全世界所有Maven工程服务。

    (3)中央仓库的镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求。

    10.2 仓库中的文件

    [1]Maven的插件

    [2]我们自己开发的项目的模块

    [3]第三方框架或工具的jar包

    ※不管是什么样的jar包,在仓库中都是按照坐标生成目录结构,所以可以通过统一的方式查询或依赖。

    第十一章 生命周期

    11.1 什么是Maven的生命周期

    ●Maven生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven就可以自动化的执行构建命令了。

    ●Maven有三套相互独立的生命周期,分别是:

    Clean Lifecycle在进行真正的构建之前进行一些清理工作。

    Default Lifecycle构建的核心部分,编译,测试,打包,安装,部署等等。

    Site Lifecycle生成项目报告,站点,发布站点。

    再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

    每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean,这个clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。

    11.2 clean生命周期

    Clean生命周期一共包含了三个阶段:

    ①pre-clean 执行一些需要在clean之前完成的工作

    ②clean 移除所有上一次构建生成的文件

    ③post-clean 执行一些需要在clean之后立刻完成的工作

    11.3 Site生命周期

    ①pre-site 执行一些需要在生成站点文档之前完成的工作

    ②site 生成项目的站点文档

    ③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备

    ④site-deploy 将生成的站点文档部署到特定的服务器上

    这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。

    11.4 Default生命周期

    Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:

    validate

    generate-sources

    process-sources

    generate-resources

    process-resources 复制并处理资源文件,至目标目录,准备打包。

    compile 编译项目的源代码。

    process-classes

    generate-test-sources

    process-test-sources

    generate-test-resources

    process-test-resources 复制并处理资源文件,至目标测试目录。

    test-compile 编译测试源代码。

    process-test-classes

    test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。

    prepare-package

    package 接受编译好的代码,打包成可发布的格式,如JAR。

    pre-integration-test

    integration-test

    post-integration-test

    verify

    install将包安装至本地仓库,以让其它项目依赖。

    deploy将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。

    11.5 生命周期与自动化构建

    运行任何一个阶段的时候,它前面的所有阶段都会被运行,例如我们运行mvn install 的时候,代码会被编译,测试,打包。这就是Maven为什么能够自动执行构建过程的各个环节的原因。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。

    第十二章 插件和目标

    ●Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。

    ●每个插件都能实现多个功能,每个功能就是一个插件目标。

    ●Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。

    例如:compile就是插件maven-compiler-plugin的一个功能;pre-clean是插件maven-clean-plugin的一个目标。

    第十五章 继承

    15.1 为什么需要继承机制

    由于非compile范围的依赖信息是不能在“依赖链”中传递的,所以有需要的工程只能单独配置。例如:

    Hello

    <dependency>

           <groupId>junit</groupId>

           <artifactId>junit</artifactId>

           <version>4.9</version>

           <scope>test</scope>

    </dependency>

    HelloFriend

    <dependency>

           <groupId>junit</groupId>

           <artifactId>junit</artifactId>

           <version>4.9</version>

           <scope>test</scope>

    </dependency>

    MakeFriend

    <dependency>

           <groupId>junit</groupId>

           <artifactId>junit</artifactId>

           <version>4.9</version>

           <scope>test</scope>

    </dependency>

    此时如果项目需要将各个模块的junit版本统一为4.9,那么到各个工程中手动修改无疑是非常不可取的。使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。

    15.2 创建父工程

    创建父工程和创建一般的Java工程操作一致,唯一需要注意的是:打包方式处要设置为pom

    15.3 在子工程中引用父工程

    <parent>

           <!-- 父工程坐标 -->

           <groupId>...</groupId>

           <artifactId>...</artifactId>

           <version>...</version>

           <relativePath>从当前目录到父项目的pom.xml文件的相对路径</relativePath>

    </parent>

     

    <parent>

           <groupId>com.atguigu.maven</groupId>

           <artifactId>Parent</artifactId>

           <version>0.0.1-SNAPSHOT</version>

          

           <!-- 指定从当前子工程的pom.xml文件出发,查找父工程的pom.xml的路径 -->

           <relativePath>../Parent/pom.xml</relativePath>

    </parent>

    此时如果子工程的groupId和version如果和父工程重复则可以删除。

    15.4 在父工程中管理依赖

    将Parent项目中的dependencies标签,用dependencyManagement标签括起来

    <dependencyManagement>

           <dependencies>

                  <dependency>

                         <groupId>junit</groupId>

                         <artifactId>junit</artifactId>

                         <version>4.9</version>

                         <scope>test</scope>

                  </dependency>

           </dependencies>

    </dependencyManagement>

    在子项目中重新指定需要的依赖,删除范围和版本号

    <dependencies>

           <dependency>

                  <groupId>junit</groupId>

                  <artifactId>junit</artifactId>

           </dependency>

    </dependencies>

    第十六章 聚合

    16.1 为什么要使用聚合

    将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行clean操作。而使用了聚合之后就可以批量进行Maven工程的安装、清理工作。

    16.1 如何配置聚合

    在总的聚合工程中使用modules/module标签组合,指定模块工程的相对路径即可

    <modules>

           <module>../Hello</module>

           <module>../HelloFriend</module>

           <module>../MakeFriends</module>

    </modules>

     直接在此工程下执行mvn install 会将所有聚合的项目按其依赖关系自动安装到本地仓库中。

    展开全文
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 支持各种Git工作流程的Maven插件,包括Vincent Driessen和 。 当前,Git版本控制系统的Java实现支持 。 该插件从命令行运行Git和Maven命令,以确保所有Git功能正常运行。 变更日志 看看有什么变化 安装 该插件...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同...

    更新于2021-08-13 22:55:12

    欢迎关注微信公众号【技术人成长之路】

    【技术人成长之路】,助力技术人成长!更多精彩文章第一时间在公众号发布哦!

    本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽

    整理的Java知识体系主要包括基础知识,工具,并发编程,数据结构与算法,数据库,JVM,架构设计,应用框架,中间件,微服务架构,分布式架构,程序员的一些思考,团队与项目管理,运维,权限,推荐书籍,云计算,区块链等,包含了作为一个Java工程师在开发工作学习中需要用到或者可能用到的绝大部分知识。千里之行始于足下,希望大家根据自己的薄弱点,查缺补漏,根据自己感兴趣的方面多学习,学的精通一点,从现在开始行动起来。路漫漫其修远兮,吾将上下而求索,不管编程开发的路有多么难走,多么艰辛,我们都将百折不挠,不遗余力地去追求和探索

    文章目录

    Java面试总结

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…

    序号内容链接地址
    1Java基础知识面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390612
    2Java集合容器面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588551
    3Java异常面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390689
    4并发编程面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104863992
    5JVM面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390752
    6Spring面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397516
    7Spring MVC面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397427
    8Spring Boot面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397299
    9Spring Cloud面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397367
    10MyBatis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/101292950
    11Redis面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/103522351
    12MySQL数据库面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104778621
    13消息中间件MQ与RabbitMQ面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588612
    14Dubbo面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104390006
    15Linux面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104588679
    16Tomcat面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397665
    17ZooKeeper面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104397719
    18Netty面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/104391081
    19架构设计&分布式&数据结构与算法面试题(2020最新版)https://thinkwon.blog.csdn.net/article/details/105870730

    基础知识

    Java概述

    序号内容链接地址
    1Java简介https://thinkwon.blog.csdn.net/article/details/94353575
    2Java发展历程https://thinkwon.blog.csdn.net/article/details/94353653
    3Java语言特点https://thinkwon.blog.csdn.net/article/details/94354013
    4JDK安装与环境变量配置https://thinkwon.blog.csdn.net/article/details/94353907
    5JVM、JRE和JDK的关系https://thinkwon.blog.csdn.net/article/details/101369973
    6Java是编译型还是解释型语言https://thinkwon.blog.csdn.net/article/details/108678327

    基础语法

    大部分已完成

    待整理:

    Java开发必会的反编译知识(附支持对Lambda进行反编译的工具)

    一文读懂什么是Java中的自动拆装箱

    Java的枚举类型用法介绍

    类、枚举、接口、数组、可变参数

    泛型、序列化

    序号内容链接地址
    1Java标识符https://thinkwon.blog.csdn.net/article/details/101637454
    2Java关键字(Java 8版本)https://thinkwon.blog.csdn.net/article/details/101642385
    3Java注释https://thinkwon.blog.csdn.net/article/details/101643185
    4Java访问修饰符https://thinkwon.blog.csdn.net/article/details/101643412
    5Java分隔符https://thinkwon.blog.csdn.net/article/details/101643617
    6Java转义字符https://thinkwon.blog.csdn.net/article/details/101643769
    7Java进制https://thinkwon.blog.csdn.net/article/details/101643936
    8Java流程控制语句https://thinkwon.blog.csdn.net/article/details/101645978
    9Java流程控制语句-顺序结构https://thinkwon.blog.csdn.net/article/details/101644820
    10Java流程控制语句-分支结构https://thinkwon.blog.csdn.net/article/details/101645224
    11Java流程控制语句-循环结构https://thinkwon.blog.csdn.net/article/details/101645757
    12Java表达式https://thinkwon.blog.csdn.net/article/details/101648114
    13Java运算符https://thinkwon.blog.csdn.net/article/details/101649002
    14Java变量https://thinkwon.blog.csdn.net/article/details/101649292
    15Java常量https://thinkwon.blog.csdn.net/article/details/101649446
    16Java数据类型https://thinkwon.blog.csdn.net/article/details/101649568
    17Java反射https://thinkwon.blog.csdn.net/article/details/100128361
    18Java语法糖https://thinkwon.blog.csdn.net/article/details/100103689
    19Java注解https://thinkwon.blog.csdn.net/article/details/100178709
    20JSON简介https://thinkwon.blog.csdn.net/article/details/100642585
    21Properties类简介https://thinkwon.blog.csdn.net/article/details/100667783
    22XML简介https://thinkwon.blog.csdn.net/article/details/100642425
    23YML简介https://thinkwon.blog.csdn.net/article/details/100642870
    24Java8新特性-Lambda表达式https://thinkwon.blog.csdn.net/article/details/100642932
    25Java基础语法https://thinkwon.blog.csdn.net/article/details/94354151

    面向对象

    待整理:

    抽象

    继承、封装、多态

    接口、抽象类、内部类

    序号内容链接地址
    1什么是面向对象https://thinkwon.blog.csdn.net/article/details/100667386

    集合框架

    迭代器、增强for、泛型

    序号内容链接地址
    1Java集合框架总结https://thinkwon.blog.csdn.net/article/details/98844796
    2ArrayList(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/98845119
    3HashMap(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/98845487
    4LinkedHashMap(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/102574293
    5LinkedList(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/102573923
    6TreeMap(JDK1.8)源码解析https://thinkwon.blog.csdn.net/article/details/102571883

    IO流

    待整理:

    File、递归

    字节流、字节缓冲流

    编码表、编码方式、转换流、序列化、序列化流、打印流、commons-io

    网络编程

    网络概述、网络模型

    Socket原理机制

    UDP

    TCP/IP

    协议、OSI 七层协议、HTTP、HTTP2.0、HTTPS

    网络安全

    ​ XSS、CSRF、SQL注入、Hash Dos、脚本注入、漏洞扫描工具、验证码

    ​ DDoS防范、用户隐私信息保护、序列化漏洞

    ​ 加密解密、对称加密、哈希算法、非对称加密

    ​ 服务安全、数据安全、数据备份

    ​ 网络隔离、登录跳板机、非外网分离

    ​ 认证、授权

    常用API

    String、StringBuffer、StringBuilder、正则表达式

    Number、Radom、Math、System、包装类

    Arrays、Collections

    日期时间API

    序号内容链接地址
    1Java7日期时间APIhttps://thinkwon.blog.csdn.net/article/details/110777654
    2史上最全Java7日期时间工具类https://thinkwon.blog.csdn.net/article/details/110779441
    3Java8日期时间APIhttps://thinkwon.blog.csdn.net/article/details/111087199
    4史上最全Java8日期时间工具类https://thinkwon.blog.csdn.net/article/details/111116600

    常用工具类库

    待整理:OkHttp、commons-lang3

    序号内容链接地址
    1HttpClient工具类https://thinkwon.blog.csdn.net/article/details/101391489
    2WGS84地球坐标系,GCJ02火星坐标系,BD09百度坐标系简介与转换https://thinkwon.blog.csdn.net/article/details/101392187
    3Lombok简介、使用、工作原理、优缺点https://thinkwon.blog.csdn.net/article/details/101392808
    4Java几种常用JSON库性能比较https://thinkwon.blog.csdn.net/article/details/94354358

    单元测试

    JUnit

    异常

    序号内容链接地址
    1Java异常总结https://thinkwon.blog.csdn.net/article/details/94346911
    2Java异常架构与异常关键字https://thinkwon.blog.csdn.net/article/details/101676779
    3Java异常处理流程https://thinkwon.blog.csdn.net/article/details/101677638
    4如何选择异常类型https://thinkwon.blog.csdn.net/article/details/94346911
    5Java异常常见面试题https://thinkwon.blog.csdn.net/article/details/101681073
    6Java异常处理最佳实践https://thinkwon.blog.csdn.net/article/details/94347002

    日志

    序号内容链接地址
    1常用日志框架Log4j,Logback,Log4j2性能比较与日志门面SLF4J简介https://thinkwon.blog.csdn.net/article/details/101621135
    2日志作用https://thinkwon.blog.csdn.net/article/details/101619725
    3Apache Log4j2详解https://thinkwon.blog.csdn.net/article/details/95043111
    4Log4j2同步日志,混合日志和异步日志配置详解https://thinkwon.blog.csdn.net/article/details/101625124
    5Log4j2配置文件详解https://thinkwon.blog.csdn.net/article/details/101629302
    6Log4j2的Appenders配置详解https://thinkwon.blog.csdn.net/article/details/101625820
    7Log4j2的Filters配置详解https://thinkwon.blog.csdn.net/article/details/101627162
    8Log4j2的Policy触发策略与Strategy滚动策略配置详解https://thinkwon.blog.csdn.net/article/details/101628222
    9Log4j2的Loggers配置详解https://thinkwon.blog.csdn.net/article/details/101628736

    Java8新特性

    序号内容链接地址
    1Java8新特性-Lambda表达式https://thinkwon.blog.csdn.net/article/details/113764085
    2Java8新特性-Optionalhttps://thinkwon.blog.csdn.net/article/details/113791796
    3Java8新特性-Streamhttps://thinkwon.blog.csdn.net/article/details/113798096
    4Java8新特性-Base64https://thinkwon.blog.csdn.net/article/details/113798575
    5Java8新特性-日期时间APIhttps://thinkwon.blog.csdn.net/article/details/111087199

    工具

    IDEA

    序号内容链接地址
    1IDEA常用配置和常用插件https://thinkwon.blog.csdn.net/article/details/101020481
    2IDEA中Maven依赖下载失败解决方案https://thinkwon.blog.csdn.net/article/details/101312918
    3在IDEA中使用Linux命令https://thinkwon.blog.csdn.net/article/details/106320360

    Eclipse & STS

    序号内容链接地址
    1Eclipse & Spring Tool Suite常用配置https://thinkwon.blog.csdn.net/article/details/101025543

    Maven

    序号内容链接地址
    1Maven简介https://thinkwon.blog.csdn.net/article/details/94346090
    2Maven安装与配置https://thinkwon.blog.csdn.net/article/details/94346569
    3Maven依赖冲突https://thinkwon.blog.csdn.net/article/details/101483020
    4手动安装Maven依赖https://thinkwon.blog.csdn.net/article/details/101483478
    5Maven部署jar包到远程仓库https://thinkwon.blog.csdn.net/article/details/101483769
    6Maven私服Nexus安装与使用https://thinkwon.blog.csdn.net/article/details/94346681

    Docker

    序号内容链接地址
    1使用Docker安装GitLabhttps://thinkwon.blog.csdn.net/article/details/95042797
    2虚拟机和容器有什么不同https://thinkwon.blog.csdn.net/article/details/107476886
    3Docker 从入门到实践系列一 - 什么是Dockerhttps://thinkwon.blog.csdn.net/article/details/107477065
    4Docker 从入门到实践系列二 - Docker 安装https://thinkwon.blog.csdn.net/article/details/117638107
    5Docker 从入门到实践系列三 - Docker 常用命令https://thinkwon.blog.csdn.net/article/details/117638128
    6Docker 从入门到实践系列四 - Docker 容器编排利器 Docker Composehttps://thinkwon.blog.csdn.net/article/details/119511551

    Git

    序号内容链接地址
    1Git简介https://thinkwon.blog.csdn.net/article/details/94346816
    2版本控制https://thinkwon.blog.csdn.net/article/details/101449228
    3Git忽略文件.gitignore详解https://thinkwon.blog.csdn.net/article/details/101447866
    4Git与SVN的区别https://thinkwon.blog.csdn.net/article/details/101449611
    5常用Git命令https://thinkwon.blog.csdn.net/article/details/101450420
    6Git,GitHub与GitLab的区别https://thinkwon.blog.csdn.net/article/details/101470086

    GitLab

    GitKraken

    Navicat

    并发编程

    基础知识

    序号内容链接地址
    1并发编程的优缺点https://thinkwon.blog.csdn.net/article/details/102020811
    2线程的状态和基本操作https://thinkwon.blog.csdn.net/article/details/102027115
    3进程和线程的区别(超详细)https://thinkwon.blog.csdn.net/article/details/102021274
    4创建线程的四种方式https://thinkwon.blog.csdn.net/article/details/102021143

    并发理论

    序号内容链接地址
    1Java内存模型https://thinkwon.blog.csdn.net/article/details/102073578
    2重排序与数据依赖性https://thinkwon.blog.csdn.net/article/details/102073858
    3as-if-serial规则和happens-before规则的区别https://thinkwon.blog.csdn.net/article/details/102074107
    4Java并发理论总结https://thinkwon.blog.csdn.net/article/details/102074440

    并发关键字

    序号内容链接地址
    1Java并发关键字-synchronizedhttps://thinkwon.blog.csdn.net/article/details/102243189
    2Java并发关键字-volatilehttps://thinkwon.blog.csdn.net/article/details/102243670
    3Java并发关键字-finalhttps://thinkwon.blog.csdn.net/article/details/102244477

    Lock体系

    待整理:

    公平锁 & 非公平锁

    乐观锁 & 悲观锁

    可重入锁 & 不可重入锁

    互斥锁 & 共享锁

    死锁

    序号内容链接地址
    1Lock简介与初识AQShttps://thinkwon.blog.csdn.net/article/details/102468837
    2AQS(AbstractQueuedSynchronizer)详解与源码分析https://thinkwon.blog.csdn.net/article/details/102469112
    3ReentrantLock(重入锁)实现原理与公平锁非公平锁区别https://thinkwon.blog.csdn.net/article/details/102469388
    4读写锁ReentrantReadWriteLock源码分析https://thinkwon.blog.csdn.net/article/details/102469598
    5Condition源码分析与等待通知机制https://thinkwon.blog.csdn.net/article/details/102469889
    6LockSupport详解https://thinkwon.blog.csdn.net/article/details/102469993

    并发容器

    序号内容链接地址
    1并发容器之ConcurrentHashMap详解(JDK1.8版本)与源码分析https://thinkwon.blog.csdn.net/article/details/102506447
    2并发容器之ConcurrentLinkedQueue详解与源码分析https://thinkwon.blog.csdn.net/article/details/102508089
    3并发容器之CopyOnWriteArrayList详解https://thinkwon.blog.csdn.net/article/details/102508258
    4并发容器之ThreadLocal详解https://thinkwon.blog.csdn.net/article/details/102508381
    5ThreadLocal内存泄漏分析与解决方案https://thinkwon.blog.csdn.net/article/details/102508721
    6并发容器之BlockingQueue详解https://thinkwon.blog.csdn.net/article/details/102508901
    7并发容器之ArrayBlockingQueue与LinkedBlockingQueue详解https://thinkwon.blog.csdn.net/article/details/102508971

    线程池

    序号内容链接地址
    1线程池ThreadPoolExecutor详解https://thinkwon.blog.csdn.net/article/details/102541900
    2Executors类创建四种常见线程池https://thinkwon.blog.csdn.net/article/details/102541990
    3线程池之ScheduledThreadPoolExecutor详解https://thinkwon.blog.csdn.net/article/details/102542299
    4FutureTask详解https://thinkwon.blog.csdn.net/article/details/102542404

    原子操作类

    序号内容链接地址
    1原子操作类总结https://thinkwon.blog.csdn.net/article/details/102556910

    并发工具

    序号内容链接地址
    1并发工具之CountDownLatch与CyclicBarrierhttps://thinkwon.blog.csdn.net/article/details/102556958
    2并发工具之Semaphore与Exchangerhttps://thinkwon.blog.csdn.net/article/details/102557034

    并发实践

    序号内容链接地址
    1实现生产者消费者的三种方式https://thinkwon.blog.csdn.net/article/details/102557126

    数据结构与算法

    数据结构

    序号内容链接地址
    1红黑树详细分析(图文详解),看了都说好https://thinkwon.blog.csdn.net/article/details/102571535
    1、数组
    2、栈
    3、队列
    4、链表
    5、树
    	二叉树
        完全二叉树
        平衡二叉树
        二叉查找树(BST)
        红黑树
        B,B+,B*树
        LSM 树
    
    字段是不是数据结构
    

    算法

    语言只是编程工具,算法才是编程之魂!

    1、排序算法:快速排序、归并排序、计数排序
    2、搜索算法:回溯、递归、剪枝
    3、图论:最短路径、最小生成树、网络流建模
    4、动态规划:背包问题、最长子序列、计数问题
    5、基础技巧:分治、倍增、二分法、贪心算法
    
    宽度优先搜索
    深度优先搜索
    广度优先
    双指针
    扫描线
    
    朴素贝叶斯
    推荐算法
    

    排序算法

    序号内容链接地址
    1史上最全经典排序算法总结(Java实现)https://thinkwon.blog.csdn.net/article/details/95616819
    2冒泡排序(Bubble Sort)https://thinkwon.blog.csdn.net/article/details/101534473
    3选择排序(Selection Sort)https://thinkwon.blog.csdn.net/article/details/101534721
    4插入排序(Insertion Sort)https://thinkwon.blog.csdn.net/article/details/101537804
    5希尔排序(Shell Sort)https://thinkwon.blog.csdn.net/article/details/101538166
    6归并排序(Merge Sort)https://thinkwon.blog.csdn.net/article/details/101538756
    7快速排序(Quick Sort)https://thinkwon.blog.csdn.net/article/details/101543580
    8堆排序(Heap Sort)https://thinkwon.blog.csdn.net/article/details/101543941
    9计数排序(Counting Sort)https://thinkwon.blog.csdn.net/article/details/101544159
    10桶排序(Bucket Sort)https://thinkwon.blog.csdn.net/article/details/101544356
    11基数排序(Radix Sort)https://thinkwon.blog.csdn.net/article/details/101545529

    LeetCode

    序号内容链接地址
    1LeetCode第1题 两数之和(Two Sum)https://thinkwon.blog.csdn.net/article/details/103113049
    2LeetCode第3题 无重复字符的最长子串(Longest Substring Without Repeating Characters)https://thinkwon.blog.csdn.net/article/details/103113969
    3LeetCode第7题 整数反转(Reverse Integer)https://thinkwon.blog.csdn.net/article/details/103113167
    4LeetCode第9题 回文数(Palindrome Number)https://thinkwon.blog.csdn.net/article/details/103113151
    5LeetCode第13题 罗马数字转整数(Roman to Integer)https://thinkwon.blog.csdn.net/article/details/103113519
    6LeetCode第14题 最长公共前缀(Longest Common Prefix)https://thinkwon.blog.csdn.net/article/details/103113700
    7LeetCode第20题 有效的括号(Valid Parentheses)https://thinkwon.blog.csdn.net/article/details/103113848
    8LeetCode第26题 删除排序数组中的重复项(Remove Duplicates from Sorted Array)https://thinkwon.blog.csdn.net/article/details/103113097

    数据库

    Oracle

    MySQL

    数据库基础知识

    序号内容链接地址
    1MySQL语句分类https://thinkwon.blog.csdn.net/article/details/106610851
    2MySQL插入语句insert into,insert ignore into,insert into … on duplicate key update,replace into-解决唯一键约束https://thinkwon.blog.csdn.net/article/details/106610789
    3MySQL复制表的三种方式https://thinkwon.blog.csdn.net/article/details/106610810
    4MySQL删除表的三种方式https://thinkwon.blog.csdn.net/article/details/106610831
    5MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别https://thinkwon.blog.csdn.net/article/details/106610859

    数据类型

    引擎

    索引

    三大范式

    常用SQL语句

    存储过程与函数

    视图

    MySQL优化

    事务

    数据备份与还原

    Redis

    序号内容链接地址
    1Redis总结https://thinkwon.blog.csdn.net/article/details/99999584
    2Redis使用场景https://thinkwon.blog.csdn.net/article/details/101521497
    3Redis数据类型https://thinkwon.blog.csdn.net/article/details/101521724
    4Redis持久化https://thinkwon.blog.csdn.net/article/details/101522209
    5Redis过期键的删除策略https://thinkwon.blog.csdn.net/article/details/101522970
    6Redis数据淘汰策略https://thinkwon.blog.csdn.net/article/details/101530624
    7Redis与Memcached的区别https://thinkwon.blog.csdn.net/article/details/101530406
    8Redis常见面试题(精简版)https://thinkwon.blog.csdn.net/article/details/103522351
    9Redis中缓存雪崩、缓存穿透等问题的解决方案https://thinkwon.blog.csdn.net/article/details/103402008
    10阿里云Redis开发规范学习总结https://thinkwon.blog.csdn.net/article/details/103400250
    11Redis开发常用规范https://thinkwon.blog.csdn.net/article/details/103401781
    12这可能是最中肯的Redis规范了https://thinkwon.blog.csdn.net/article/details/103401978

    Java虚拟机

    深入理解Java虚拟机

    序号内容链接地址
    1深入理解Java虚拟机-走近Javahttps://thinkwon.blog.csdn.net/article/details/103804387
    2深入理解Java虚拟机-Java内存区域与内存溢出异常https://thinkwon.blog.csdn.net/article/details/103827387
    3深入理解Java虚拟机-垃圾回收器与内存分配策略https://thinkwon.blog.csdn.net/article/details/103831676
    4深入理解Java虚拟机-虚拟机执行子系统https://thinkwon.blog.csdn.net/article/details/103835168
    5深入理解Java虚拟机-程序编译与代码优化https://thinkwon.blog.csdn.net/article/details/103835883
    6深入理解Java虚拟机-高效并发https://thinkwon.blog.csdn.net/article/details/103836167

    架构设计

    高可用架构

    高并发架构

    可伸缩架构

    集群

    设计模式

    常用设计模式

    创建型:
    单例模式、工厂模式、抽象工厂模式

    结构型:
    适配器模式、外观模式、代理模式、装饰器模式

    行为型:
    观察者模式、策略模式、模板模式

    序号内容链接地址
    1设计模式https://thinkwon.blog.csdn.net/article/details/96829572

    创建型模式

    序号内容链接地址
    1抽象工厂模式https://thinkwon.blog.csdn.net/article/details/101382584
    2单例模式https://thinkwon.blog.csdn.net/article/details/101382855
    3工厂模式https://thinkwon.blog.csdn.net/article/details/101383285
    4建造者模式https://thinkwon.blog.csdn.net/article/details/101383401
    5原型模式https://thinkwon.blog.csdn.net/article/details/101383491

    结构型模式

    序号内容链接地址
    1代理模式https://thinkwon.blog.csdn.net/article/details/101384436
    2过滤器模式https://thinkwon.blog.csdn.net/article/details/101384514
    3桥接模式https://thinkwon.blog.csdn.net/article/details/101384584
    4适配器模式https://thinkwon.blog.csdn.net/article/details/101384619
    5外观模式https://thinkwon.blog.csdn.net/article/details/101384676
    6享元模式https://thinkwon.blog.csdn.net/article/details/101384716
    7装饰器模式https://thinkwon.blog.csdn.net/article/details/101384753
    8组合模式https://thinkwon.blog.csdn.net/article/details/101384786

    行为型模式

    序号内容链接地址
    1备忘录模式https://thinkwon.blog.csdn.net/article/details/101383582
    2策略模式https://thinkwon.blog.csdn.net/article/details/101383647
    3迭代器模式https://thinkwon.blog.csdn.net/article/details/101383722
    4访问者模式https://thinkwon.blog.csdn.net/article/details/101383780
    5观察者模式https://thinkwon.blog.csdn.net/article/details/101383872
    6解释器模式https://thinkwon.blog.csdn.net/article/details/101383930
    7空对象模式https://thinkwon.blog.csdn.net/article/details/101384001
    8命令模式https://thinkwon.blog.csdn.net/article/details/101384090
    9模板模式https://thinkwon.blog.csdn.net/article/details/101384138
    10责任链模式https://thinkwon.blog.csdn.net/article/details/101384195
    11中介者模式https://thinkwon.blog.csdn.net/article/details/101384251
    12状态模式https://thinkwon.blog.csdn.net/article/details/101384315

    J2EE模式

    序号内容链接地址
    1MVC模式https://thinkwon.blog.csdn.net/article/details/101381701
    2传输对象模式https://thinkwon.blog.csdn.net/article/details/101382134
    3服务定位器模式https://thinkwon.blog.csdn.net/article/details/101382179
    4拦截过滤器模式https://thinkwon.blog.csdn.net/article/details/101382210
    5前端控制器模式https://thinkwon.blog.csdn.net/article/details/101382247
    6数据访问对象模式https://thinkwon.blog.csdn.net/article/details/101382287
    7业务代表模式https://thinkwon.blog.csdn.net/article/details/101382356
    8组合实体模式https://thinkwon.blog.csdn.net/article/details/101382390

    实践应用

    序号内容链接地址
    1业务复杂=if else?刚来的大神竟然用策略+工厂彻底干掉了他们!https://thinkwon.blog.csdn.net/article/details/102924813

    应用框架

    如何学习一个框架或者技术

    • 是什么,简介,概述

    • 有什么用,用途,使用场景

    • 怎么用,在实际开发中的应用,注意事项

    • 优缺点

    • 框架原理,工作流程,工作原理

    • 常见面试题

    • 源码分析,核心类,核心方法,设计模式

    • 发布博客,在开发和实践中,博客反馈中持续改进

    • 与同事朋友交流,技术论坛,技术分享中持续丰富知识

    常用框架

    • 集成开发工具(IDE):Eclipse、MyEclipse、Spring Tool Suite(STS)、Intellij IDEA、NetBeans、JBuilder、JCreator

    • JAVA服务器:tomcat、jboss、websphere、weblogic、resin、jetty、apusic、apache

    • 负载均衡:nginx、lvs

    • web层框架:Spring MVC、Struts2、Struts1、Google Web Toolkit(GWT)、JQWEB

    • 服务层框架:Spring、EJB

    • 持久层框架:Hibernate、MyBatis、JPA、TopLink

    • 数据库:Oracle、MySql、MSSQL、Redis

    • 项目构建:maven、ant

    • 持续集成:Jenkins

    • 版本控制:SVN、CVS、VSS、GIT

    • 私服:Nexus

    • 消息组件:IBM MQ、RabbitMQ、ActiveMQ、RocketMq

    • 日志框架:Commons Logging、log4j 、slf4j、IOC

    • 缓存框架:memcache、redis、ehcache、jboss cache

    • RPC框架:Hessian、Dubbo

    • 规则引擎:Drools

    • 工作流:Activiti

    • 批处理:Spring Batch

    • 通用查询框架:Query DSL

    • JAVA安全框架:shiro、Spring Security

    • 代码静态检查工具:FindBugs、PMD

    • Linux操作系统:CentOS、Ubuntu、SUSE Linux、

    • 常用工具:PLSQL Developer(Oracle)、Navicat(MySql)、FileZilla(FTP)、Xshell(SSH)、putty(SSH)、SecureCRT(SSH)、jd-gui(反编译)

    Spring

    序号内容链接地址
    1Spring简介、设计理念、优缺点、应用场景https://thinkwon.blog.csdn.net/article/details/102810748
    2Spring模块组成(框架组成、整体架构、体系架构、体系结构)https://thinkwon.blog.csdn.net/article/details/102810819
    3Spring容器中bean的生命周期https://thinkwon.blog.csdn.net/article/details/102866432
    4控制反转(IoC)与依赖注入(DI)详解https://thinkwon.blog.csdn.net/article/details/102912332

    《Spring实战》读书笔记

    序号内容链接地址
    1《Spring实战》读书笔记-第1章 Spring之旅https://thinkwon.blog.csdn.net/article/details/103097364
    2《Spring实战》读书笔记-第2章 装配Beanhttps://thinkwon.blog.csdn.net/article/details/103527675
    3《Spring实战》读书笔记-第3章 高级装配https://thinkwon.blog.csdn.net/article/details/103536621
    4《Spring实战》读书笔记-第4章 面向切面的Springhttps://thinkwon.blog.csdn.net/article/details/103541166
    5《Spring实战》读书笔记-第5章 构建Spring Web应用程序https://thinkwon.blog.csdn.net/article/details/103550083
    6《Spring实战》读书笔记-第6章 渲染Web视图https://thinkwon.blog.csdn.net/article/details/103559672
    7《Spring实战》读书笔记-第7章 Spring MVC的高级技术https://thinkwon.blog.csdn.net/article/details/103562467

    Spring MVC

    MyBatis

    序号内容链接地址
    1MyBatis官方文档https://thinkwon.blog.csdn.net/article/details/100887995
    2MyBatis官方文档-简介https://thinkwon.blog.csdn.net/article/details/100887076
    3MyBatis官方文档-入门https://thinkwon.blog.csdn.net/article/details/100887176
    4MyBatis官方文档-XML 配置https://thinkwon.blog.csdn.net/article/details/100887349
    5MyBatis官方文档-XML 映射文件https://thinkwon.blog.csdn.net/article/details/100887478
    6MyBatis官方文档-动态 SQLhttps://thinkwon.blog.csdn.net/article/details/100887702
    7MyBatis官方文档-Java APIhttps://thinkwon.blog.csdn.net/article/details/100887746
    8MyBatis官方文档-SQL 语句构建器类https://thinkwon.blog.csdn.net/article/details/100887821
    9MyBatis官方文档-日志https://thinkwon.blog.csdn.net/article/details/100887951
    10MyBatis功能架构https://thinkwon.blog.csdn.net/article/details/101295025
    11MyBatis工作原理https://thinkwon.blog.csdn.net/article/details/101293609
    12MyBatis核心类https://thinkwon.blog.csdn.net/article/details/101293216
    13MyBatis面试宝典https://thinkwon.blog.csdn.net/article/details/101292950
    14MyBatis实现一对一,一对多关联查询https://thinkwon.blog.csdn.net/article/details/101322334
    15MyBatis缓存https://thinkwon.blog.csdn.net/article/details/101351212

    MyBatis 源码分析

    序号内容链接地址
    1MyBatis 源码分析 - MyBatis入门https://thinkwon.blog.csdn.net/article/details/114808852
    2MyBatis 源码分析 - 配置文件解析过程https://thinkwon.blog.csdn.net/article/details/114808962
    3MyBatis 源码分析 - 映射文件解析过程https://thinkwon.blog.csdn.net/article/details/115423167
    4MyBatis 源码分析 - SQL 的执行过程https://thinkwon.blog.csdn.net/article/details/115603376
    5MyBatis 源码分析 - 内置数据源https://thinkwon.blog.csdn.net/article/details/116331419
    6MyBatis 源码分析 - 缓存原理https://thinkwon.blog.csdn.net/article/details/116809942
    7MyBatis 源码分析 - 插件机制https://thinkwon.blog.csdn.net/article/details/116809961

    Quartz

    序号内容链接地址
    1Quartz简介https://thinkwon.blog.csdn.net/article/details/109936696

    Hibernate

    Shiro

    Spring Security

    Netty

    搜索引擎

    Lucene/Solr

    Elasticsearch

    ELK

    中间件

    消息中间件

    RabbitMQ

    RocketMQ

    ActiveMQ

    Kafka

    远程过程调用中间件

    Dubbo

    数据访问中间件

    Sharding JDBC

    MyCat

    Web应用服务器

    Tomcat

    待整理:Tomcat各组件作用 Tomcat集群 Tomcat面试题

    序号内容链接地址
    1Win10安装Tomcat服务器与配置环境变量https://thinkwon.blog.csdn.net/article/details/102622905
    2Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项https://thinkwon.blog.csdn.net/article/details/102717537
    3Tomcat与JDK版本对应关系,Tomcat各版本特性https://thinkwon.blog.csdn.net/article/details/102622738
    4Tomcat目录结构https://thinkwon.blog.csdn.net/article/details/102619466
    5Tomcat乱码与端口占用的解决方案https://thinkwon.blog.csdn.net/article/details/102622824
    6Tomcat系统架构与请求处理流程https://thinkwon.blog.csdn.net/article/details/102676442
    7史上最强Tomcat8性能优化https://thinkwon.blog.csdn.net/article/details/102744033

    Nginx

    缓存

    本地缓存

    客户端缓存

    服务端缓存

    ​ web缓存,Redis,Memcached,Ehcache

    其他

    Zookeeper

    微服务与分布式

    Spring Boot

    序号内容链接地址
    1application.yml与bootstrap.yml的区别https://thinkwon.blog.csdn.net/article/details/100007093
    2一分钟了解约定优于配置https://thinkwon.blog.csdn.net/article/details/101703815

    Spring Cloud

    序号内容链接地址
    1Spring Cloud入门-十分钟了解Spring Cloudhttps://thinkwon.blog.csdn.net/article/details/103715146
    2Spring Cloud入门-Eureka服务注册与发现(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103726655
    3Spring Cloud入门-Ribbon服务消费者(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103729080
    4Spring Cloud入门-Hystrix断路器(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103732497
    5Spring Cloud入门-Hystrix Dashboard与Turbine断路器监控(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103734664
    6Spring Cloud入门-OpenFeign服务消费者(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103735751
    7Spring Cloud入门-Zuul服务网关(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103738851
    8Spring Cloud入门-Config分布式配置中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103739628
    9Spring Cloud入门-Bus消息总线(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103753372
    10Spring Cloud入门-Sleuth服务链路跟踪(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103753896
    11Spring Cloud入门-Consul服务注册发现与配置中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103756139
    12Spring Cloud入门-Gateway服务网关(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103757927
    13Spring Cloud入门-Admin服务监控中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103758697
    14Spring Cloud入门-Oauth2授权的使用(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103761687
    15Spring Cloud入门-Oauth2授权之JWT集成(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103763364
    16Spring Cloud入门-Oauth2授权之基于JWT完成单点登录(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103766368
    17Spring Cloud入门-Nacos实现注册和配置中心(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103769680
    18Spring Cloud入门-Sentinel实现服务限流、熔断与降级(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103770879
    19Spring Cloud入门-Seata处理分布式事务问题(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103786102
    20Spring Cloud入门-汇总篇(Hoxton版本)https://thinkwon.blog.csdn.net/article/details/103786588

    服务注册发现

    服务配置

    负载均衡

    服务调用

    服务限流

    熔断降级

    网关路由

    服务权限

    链路追踪

    分布式事务

    分布式缓存

    分布式会话

    日志收集

    服务监控

    消息驱动

    数据处理流

    自动化测试与部署

    第三方支持

    分布式协调服务Zookeeper

    程序员的一些思考

    序号内容链接地址
    1程序员写个人技术博客的价值与意义https://thinkwon.blog.csdn.net/article/details/102980571
    2Java知识体系最强总结(2020版)https://thinkwon.blog.csdn.net/article/details/103592572
    3博客之星,有你的鼓励更精彩https://thinkwon.blog.csdn.net/article/details/112517796

    团队与项目管理

    需求调研

    项目管理

    序号内容链接地址
    1Worktile、Teambition与Tower项目管理软件对比https://thinkwon.blog.csdn.net/article/details/106064807

    代码管理

    文档管理

    序号内容链接地址
    1几款常见接口管理平台对比https://thinkwon.blog.csdn.net/article/details/106064883
    2Swagger2常用注解说明https://thinkwon.blog.csdn.net/article/details/107477801

    测试

    Python

    序号内容链接地址
    1Win10安装Python3.9https://thinkwon.blog.csdn.net/article/details/112411897
    2Anaconda安装https://thinkwon.blog.csdn.net/article/details/112412165
    3PyCharm2020.3.2安装https://thinkwon.blog.csdn.net/article/details/112412497
    4PyCharm常用配置和常用插件https://thinkwon.blog.csdn.net/article/details/112412783

    运维

    常规监控

    APM

    持续集成(CI/CD):Jenkins,环境分离

    自动化运维:Ansible,puppet,chef

    测试:TDD 理论,单元测试,压力测试,全链路压测,A/B 、灰度、蓝绿测试

    虚拟化:KVM,Xen,OpenVZ

    容器技术:Docker

    云技术:OpenStack

    DevOps

    操作系统

    计算机操作系统

    计算机原理

    Linux

    CPU

    进程,线程,协程

    CentOS8

    序号内容链接地址
    1VMware Workstation Pro 16搭建CentOS8虚拟机集群https://thinkwon.blog.csdn.net/article/details/115058171
    2CentOS8安装Dockerhttps://thinkwon.blog.csdn.net/article/details/115056214
    3CentOS8搭建Nacos1.4.0集群https://thinkwon.blog.csdn.net/article/details/115056401
    4CentOS8安装GitLab13.7.2https://thinkwon.blog.csdn.net/article/details/115056528
    5CentOS8安装MySQL8https://thinkwon.blog.csdn.net/article/details/115055934

    推荐书籍

    序号内容链接地址
    1读书清单-计算机https://thinkwon.blog.csdn.net/article/details/108077754

    读书笔记

    序号内容链接地址
    1高效休息法-读书笔记https://thinkwon.blog.csdn.net/article/details/118638191
    2斯坦福高效睡眠法-读书笔记https://thinkwon.blog.csdn.net/article/details/108349844
    3高效能人士的七个习惯-读书笔记https://thinkwon.blog.csdn.net/article/details/108941111
    4富爸爸穷爸爸-读书笔记https://thinkwon.blog.csdn.net/article/details/109261723
    5如何阅读一本书-读书笔记https://thinkwon.blog.csdn.net/article/details/115422659
    6人性的弱点-读书笔记https://thinkwon.blog.csdn.net/article/details/116809824
    7麦肯锡极简工作法-读书笔记https://thinkwon.blog.csdn.net/article/details/118638191

    云计算

    IaaS、SaaS、PaaS、虚拟化技术、openstack、Serverlsess

    搜索引擎

    Solr、Lucene、Nutch、Elasticsearch

    权限管理

    Shiro、Spring Security

    区块链

    哈希算法、Merkle树、公钥密码算法、共识算法、Raft协议、Paxos 算法与 Raft 算法、拜占庭问题与算法、消息认证码与数字签名

    展开全文
  • Maven的作用通俗介绍

    万次阅读 多人点赞 2017-02-12 10:19:40
    原文地址好像已经失效了,经过本人的研究与学习,并且在工作中实际的使用,总结了更为详细的Maven入门学习教程,具体学习教程如下:https://gitbook.cn/gitchat/activity/5bfa2f90a95c936f223658ba ... Maven...
  • 文章目录Java中Maven基础详解(包括maven工作原理、安装配置、IDEA建立Maven工程)当前主要的Java构建工具Maven基本概念:1、项目构建生命周期:2、项目中jar包管理3、Maven项目信息管理Maven安装与配置配置Maven本地...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 插件功能 取代公开的身份 解决依赖版本范围 根据范围排除依赖项 可选地包括传递依赖 根据xml标签名称删除pom.xml成员 用生成的pom.xml.flatten切换项目pom.xml Maven目标 插件演示 比较结果 原始 生成的 用法示例...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...
  • 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,444
精华内容 28,977
关键字:

maven主要功能不包括