2020年12月6日星期日

初始自动化构建工具-Maven

             

01 自动化构建工具:Maven
   浏览器
   表示层、表述层、表现层:①视图层:H5、CSS、JS、JSP等 ②控制层:Servlet、Action(Struts2)、Handler(SpringMVC)等
   业务逻辑层:Spring IOC / AOP
   持久化层:JDBC、DBUtils、SpringTemplate、Hibernate、Mybatis
   数据库:Mysql、Oracle

02 目前的技术在开发中存在的问题
  ① 一个项目就是一个工程
  ② 项目中需要的jar包必须手动"复制"、"粘贴"到 WEB-INF / lib 目录下
  ③ jar 包需要别人替我们准备好,或到官网下载
  ④ 一个 ja r包依赖的其它 jar 包需要自己手动加入到项目中,FileUpload组件->IO组件

03 Maven是什么
  ① Maven一款服务于Java平台的自动化构建工具。
    Make-->Ant-->Maven-->Gradle
  ② 构建
    (1)概念:以"Java源文件","框架配置文件","JSP","HTML","图片"等资源为原材料,去"生产"一个可以运行的项目的过程
        编译,部署,搭建
    (2)编译:Java 源文件(User.java)->编译->Class字节码文件(User.class)->交给JVM去执行
    (3)部署:一个 BS 项目最终运行的并不是动态Web 工程本身,而是这个动态 Web 工程的"编译结果":动态Web工程->编译、部署->编译结果
  动态 Web 工程目录结构:
  工程名
    src  源码
    JRE System Library  运行时环境
    Apache Tomcat v6.0  运行时环境

    build  源码的字节码文件
    WebContent  前端页面展示
      META-INF
      WEB-INF
        lib
        web.      index.jsp
  ③构建过程中的各个环节
   (1)清理:将以前编译得到的旧的 class 字节码文件删除,为下一次编译做准备
   (2)编译:将 Java 源程序编译成 class 字节码文件
   (3)测试:自动测试,自动调用 junit 程序
   (4)报告:测试程序执行的记过
   (5)打包:动态 Web 工程打war 包,Java工程打 jar 包
   (6)安装:Maven 特定的概念--将打包得到的文件复制到"仓库"中指定位置
   (7)部署:将动态 Web 工程生成的war 复制到 Servlet 容器的指定目录下,使其可以运行
  ④自动化构建

04 安装 Maven核心程序
  ① 检查 JAVA_HOME 环境变量
  ② 解压Maven 核心包文件,放在一个无中文无空格的路径下
  ③ 配置Maven 相关环境变量
   (1)MAVEN_HOME或M2_HOME :Maven核心包解压后的路径
   (2)Path:追加Maven核心包解压后的路径 / bin
  ④ 验证:运行 mvn -v,查看 Maven 版本

05 Maven的核心概念
  ① 约定的目录结构
  ② POM
  ③ 坐标
  ④ 依赖
  ⑤ 仓库
  ⑥ 生命周期/插件/目标
  ⑦ 继承
  ⑧ 聚合

06 第一个 Maven 工程
  ① 创建 Maven 约定的目录结构
  Hello  工程名
  |  src  源码
  |  |  main  主程序
  |  |  |  java  Java源文件
  |  |  |  resources  存放框架或其它工具配置文件
  |  |  test  测试程序
  |  |  |  java
  |  |  |  resources
  |  pom.xm  Maven配置核心文件

  ② 为什么要遵守约定的目录结构
    约定 > 配置 > 编码
  ③ pom.

07 常用Maven 命令
  ① 注意:执行与构建过程相关的Maven的命令时,需要进入pom.   与构建过程相关:编译,测试,打包
  ② 常用命令:
   (1)mvn clean:清理
   (2)mvn compile:编译主程序
   (3)mvn test-compile:编译测试主程序
   (4)mvn test:执行测试
   (5)mvn package:打包
   (6)mvn install:安装
   (7)mvn site:生成站点

08 关于联网问题
  ① Maven 的核心程序中仅仅定义了抽象的声明周期,但是具体的工作必须由特定的插件来完成,而插件本身并不包含在 Maven 的核心程序中。
  ② 当我们指定的 Maven 命令需要用到某些插件时,Maven 核心程序会首先到本地仓库中查找。
  ③ 本地仓库的默认位置:[系统用户] \ .m2 \ repository
  ④ Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网到中央仓库下载。
  ⑤ 如果此时无法连接外网下载,则构建失败。
  ⑥ 修改默认本地仓库的位置可以让 Maven 核心程序到我们事先准备好的目录下查找插件
    (1)找到 Maven 解压目录 \ conf \ settings.    (2)在 setting.    (3)将<localRepository>/path/to/local/repo</localRepository>从注释中取出
    (4)将标签体内容修改为已经准备好的 Maven 仓库路径,如:
       <localRepository> F:Maven </localRepository>
  执行 mvn compile 命令会在 src 级目录下生成 target 文件(含字节码文件)
  执行 mvn test-compile 命令会在 src 级目录下生成 target 文件(含字节码文件)
  执行 mvn package命令会在 src 级目录下生成target / *.jar 文件,以及辅助文件和测试报告
  执行 mvn test 命令会删除 target 文件(含字节码文件)

09 POM
  ① 含义:Porject Object Model 项目对象模型
    DOM:Document Object Model
  ② pom.    重要程度相当于 web.

10 坐标
  ① 数学中的坐标,平面中的X、Y标识平面中的任何一点,空间的X、Y、Z标识空间中的任何一点
  ② Maven的坐标
    使用下面三个向量在仓库中唯一定位一个 Maven工程
    (1) groupid:公司或组织名倒序 + 项目名:<groupid>com.cxj.maven</groupid>
    (2) artfactid:模块名:<artifactid>Hello</artifactid>
    (3) version:版本:<version>1.0.1</version>
  ③ Maven工程的坐标与仓库中路径的对应关系,各自对应

11 仓库
  ① 仓库的分类
    (1) 本地仓库:在当前计算机系统文件中,为当前电脑上所有的 Maven 工程服务
    (2) 远程仓库:
      a 私服:搭建在局域网,为局域网范围内的所有 Maven工程服务
      b 中央仓库:架设在Internet 上,为全世界所有 Maven 工程服务
      c 中央仓库镜像:架设在各个大洲,为中央仓库分担流量,减轻中央仓库的压力,同时更快响应用户的请求
  ② 仓库中保存的内容
    (1) Maven 自身所需的插件
    (2) 第三方框架或工具的 jar 包,(第一方是JDK,第二方是开发人员)
    (3) 我们自己开发的 Maven 工程

12 第二个 Maven 工程(RELEASE:稳定版本,SNAPSHOT:不稳定版本)
  ① 建 Maven 工程:Hello ,HelloFriend
  ② 在 HelloFriend 工程中引用 Hello工程中的类
  ③ 在 HelloFriend 工程下的 pom.  <dependencies>
    <dependency>
      <groupid>com.cxj.maven<groupid>
      <artifactid>Hello</artifactid>
      <version>1.0.0-SNAPSHOT</version>
      <scop>compile</scop>
    </dependency>
  </dependencies>
  ④ 进入 HelloFriend 工程的 pom.  ⑤ 出现编译失败,无法解析依赖信息。是因为 Hello 工程没有 执行 mvn install 安装命令
  ⑥ 因此先将 Hello 工程执行 mvn install ,再将 HelloFriend 工程执行 mvn compile 即可

13 依赖
  ① Maven 解析依赖信息时会到本地仓库中查找被依赖的jar包
    对于我们自己开发的 Maven 工程,使用 install 命令安装后就可以进入仓库
  ② 依赖的范围 <scop>:compile 、test、provided
    (1) compile(如:spring-core)
       是否对主程序有效:有效
       是否对测试程序有效:有效
       是否参与打包:参与
       是否参与部署:参与
    (2) test(如:junit)
       是否对主程序有效:无效
       是否对测试程序有效:有效
       是否参与打包:不参与
       是否参与部署:不参与
    (3) provided:依赖一些特定的 API(不是开发人员写的类,如:servlet-api.jar,由服务器提供)
       是否对主程序有效:有效
       是否对测试程序有效:有效
       是否参与打包:不参与
       是否参与部署:不参与

14 生命周期:Clean、Default、Site
  ①各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行
    Default生命周期常用的阶段:

validategenerate-sourcesprocess-sourcesgenerate-resourcesprocess-resources  复制并处理资源文件,至目标目录,准备打包compile  编译项目的源代码process-classesgenerate-test-sourcesprocess-test-sourcesgenerate-test-resourcesprocess-test-resources  复制并处理资源文件,至目标测试目录test-compile  编译测试源代码process-test-classestest  使用合适的单元测试框架运行测试,这些测试代码不会被打包或部署prepare-packagepackage  接收编译好的代码,打包成可发布的格式,如:JARpre-integration-testintegration-test

  ② Maven 的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。
  ③ Maven 核心程序为例更好的实现自动化构建,按照这一的特点
  ④ 插件和目标
    (1) 生命周期的各个阶段仅仅定义了要执行的任务是什么
    (2) 各个阶段和插件的目标是对应的
    (3) 相似的目标由特定的插件来完成
    (4)可以将目标看作"调用插件功能的命令"

15 Eclipse 中设置 Maven 插件(eclipse中内置了Maven,默认由自带的Maven)
  ①Window->preferences->Maven->Installations->Add :指定Maven 核心程序的位置。
  ②Window->preferences->Maven->User Settings :指定 conf / settings.  ③ 基本操作
    (1) 创建 Maven 版的Java 工程
      a. Window->Perspective->Customize Perspective->Menu Visibility->File->New->Maven Project,将Maven Project加入到快捷键New中
      b. New->Maven Project->勾选 " Create a simple project (skip archetype selection)",如不勾选,则在下一步中勾选"maven-archetype-quickstart"
         输入Group Id , Artifact Id,Version,Package(jar、war、pom),确定finish
      c. 改JDK版本,手动改:,,,,自动改:打开settings.

<profile>  <id>jdk-1.7</id>  <activation>    <activeByDefault>true</activeByDefault>    <jdk>1.7</jdk>  </activation>  <properties>    <maven.compiler.source>1.7</maven.compiler.source>    <maven.compiler.target>1.7</maven.compiler.target>    <maver.compiler.compilerVersion>1.7</maven.comiler.compilerVersion>  </properties></profile>

若不能识别,则提高Maven版本即可
   (2)创建 Maven 版的JavaWeb 工程
      a. New->Maven Project->勾选 " Create a simple project (skip archetype selection)",如不勾选,则在下一步中勾选"maven-archetype-quickstart"
         输入Group Id , Artifact Id,Version,Package(jar、war、pom),确定finish
      b. 右键工程-->Properties-->Project Facets-->去掉Dynamic Web Module-->Apply-->再勾选Dynamic Web Module-->
         点击"Further configuration availbale..."-->在Content directory中输入src/main/webapp
   (3)执行 Maven 命令:run as-->再选择响应的 Maven命令
   (4)手动创建的Maven 工程导入Eclipse 时,需要选择导入Maven Project,不能以Java 工程导入
  ④ 在 setting.

<dependency>  <groupid>javax<groupid>  <artifactid>servlet-api</artifactid>  <version>2.5</version>  <scop>provided</scop></dependency>

16 依赖
  ① 依赖的传递性,好处:可以传递的依赖不必在每个模块工程中都重复声明,在"最下面"的工程中依赖一次即可(<scop>compile</scop>,test和provided只提供给本项目使用,不能传递)
    若项目 A 依赖与项目 B,当在项目 B 中加入其它依赖时,项目 B 的运行环境中也会加入相应的依赖,
  ② 依赖的排除,若项目A依赖与项目 B,当在项目 B 中加入其它依赖时,若加入的依赖版本过低,则需要排除,项目A需要自己加高版本依赖,
如:在 A 的 pom.

<dependency>  <groupid>B<groupid>  <artifactid>B</artifactid>  <version>B</version>  <scop>B</scop>  <exclusions>    <groupId>commons-logging</groupId>    <artifactId>commons-logging</artifactId>  </exclusions></denpendcy>

  ③ A-->B-->C,若项目 A 依赖项目 B,项目 B依赖 项目 C,当项目C 和项目B 传递上来两个版本不一致的junit-api.jar时,最短路径优先
  ④ A--B,A--C,若项目A 依赖 项目B,项目A 依赖 项目 C,当项目B 和项目 C传递上来两个版本不一致的junit-api.jar时,最先声明者优先(指dependency标签的声明顺序)
  ⑤ 依赖的原则:解决模块工程之间的jar 包冲突问题
  ⑥ 统一管理依赖的版本:使用 properties 标签。如:依赖的spring 包由很多同时它们的版本一致,要修改时,手动注意修改??如:

<properties>  <atcxj.spring.version>4.0.0.RELEASE<atcxj.spring.version>  //自定义声明的标签:<atcxj.spring.version >,引用时:<version>&{atcxj.spring.version}</version>  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  //编码</properties><dependencies>  <dependency>    <groupid>org.springframeword<groupid>    <artifactid>spring-orm</artifactid>    <version>&{atcxj.spring.version}</version>  <dependency><dependency>    <groupid>org.springframework<groupid>    <artifactid>spring-web</artifactid>    <version>&{atcxj.spring.version}</version>  <dependency></dependencies>

  ⑦ propeties 标签并不只能用于声明依赖的版本号,凡是需要统一声明后再引用的场合都可以使用。

17 继承
  ① 现状
    Hello依赖的junit:4.0
    HelloFriend依赖的junit:4.0
    MakeFriend依赖的junit:4.9
   由于 test 范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致。
  ② 需求:统一管理各个模块工程中对 junit 依赖的版本
  ③ 解决思路:将junit 依赖统一提取到"父"工程中,在子工程中声明 junit 依赖时不指定版本,以父工程中统一设定的为准,同时也便于修改。
  ④ 操作步骤
    (1) 创建一个 Maven 工程作为父工程,注意:打包方式为pom,如:父工程中pom.

<groupid>com.cxj.maven<groupid><artifactid>Parent</artifactid><version>0.0.2-SNAPSHOT</version><packaging>pom</packaging>

    (2) 在子工程中声明对父工程的引用,子工程中pom.

<parent>  //<parent>标签在<dependencies>标签外部  <groupid>com.cxj.maven<groupid>  <artifactid>Parent</artifactid>  <version>0.0.2-SNAPSHOT</version>  <relativePath>../Parent/pom.//以当前文件为基准的父工程pom.</parent>

    (3) 将子工程的坐标中与父工程中重复的内容删除
    (4) 在父工程中统一管理 junit 的依赖

<dependencyManagement>  <dependencies>    <dependency>      <groupid>junit</groupid>      <artifactid>junit</artifactid>      <version>4.0</version>      <scop>test</scop>    </dependency>  </dependencies></dependencyManagement>

    (5) 在子工程中删除junit 依赖的版本号部分,此时子工程中 junit 的版本就是父工程中管理的junit 版本,若不删除则使用的就是该 junit 版本

18 聚合(一键安装各个模块工程)
  ① 使用情景:当工程模块之间有依赖后,执行 mvn compile 时,需要被依赖的项目模块提前执行 mvn install
  ② 配置方式:在一个"总的聚合工程" 中配置各个参与聚合的模块

<modules>../Hello</modules><modules>../HelloFriend</modules><modules>../MakeFriends</modules>  //无先后顺序

  ③ 使用方式:在聚合工程的 pom.

19 自动部署:就是将项目打包,然后存放到 tomcat 服务器运行,在命令行中使用 mvn deploy

<build>  //配置当前工程构建过程中的特殊设置|  <finalName>AtCxjWeb</finalName>|  <plugins>  //配置构建过程中需要使用的插件|  |  <plugin>|  |  |  <groupId>org.codehaus.cargo</groupId>  //cargo 是一家专门 "启动sevlet容器"的组织|  |  |  <artifactId>cargo-maven2-pligin</artifactId>|  |  |  <version>1.2.3</version>|  |  |  <configurations>|  |  |  |  <container>|  |  |  |  |  <containerId>tomcat6x<containerId>|  |  |  |  |  <home>D:\DevInstall\apache-tomcat-6.0.39</home>  //当前系统中容器的位置|  |  |  |  </container>|  |  |  |  <configuration>|  |  |  |  |  <type>existing</type>|  |  |  |  |  <home>D:\DevInstall\apache-tomcat-6.0.39</home>|  |  |  |  |  <properties>|  |  |  |  |    <cargo.servlet.port>8989</cargo-servlet-port>  //如果tomcat 端口为默认值8080则不必设置该属性|  |  |  |  |  </properties>|  |  |  |  </configuration>|  |  |  </configurations>|  |  |  <executions>  //配置插件在什么情况下执行|  |  |  |  <execution>|  |  |  |  |  <id>cargo-run</id>|  |  |  |  |  <phase>install</phase>  //生命周期的阶段|  |  |  |  |  <goals>|  |  |  |  |  |  <goal>run<goal>  //生命周期的目标|  |  |  |  |  </goals>|  |  |  |  </execution>|  |  |  </executions>|  |  </plugin>|  </plugins></build>

20 查找依赖的网址:

https://mvnrepository.com

 









原文转载:http://www.shaoqun.com/a/494975.html

自贸区跨境通网站:https://www.ikjzd.com/w/1329

败欧洲网站:https://www.ikjzd.com/w/1555

贝恩投资公司:https://www.ikjzd.com/w/1336


01自动化构建工具:Maven   浏览器   表示层、表述层、表现层:①视图层:H5、CSS、JS、JSP等②控制层:Servlet、Action(Struts2)、Handler(SpringMVC)等   业务逻辑层:SpringIOC/AOP   持久化层:JDBC、DBUtils、SpringTemplate、Hibernate、Mybatis   数据库:Mysql、Oracle02目
photobucket:photobucket
insider:insider
增城哪里最好玩?哪里的东西最好吃?:增城哪里最好玩?哪里的东西最好吃?
盘点:美国部分州最美风景:盘点:美国部分州最美风景
川龙峡森林峡谷漂流介绍?惠州川龙峡森林峡谷漂流好玩么?:川龙峡森林峡谷漂流介绍?惠州川龙峡森林峡谷漂流好玩么?