编程的蜗牛

颓废,始于首次的懒惰与原谅。

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Maven-maven基础

一、Maven概述

  Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。将项目开发和管理过程抽象成一个项目对象模型Project Object Model(POM)

   Maven作用:

  1.项目构建:提供标准的、跨平台的自动化项目构建方式。

  2.依赖管理:方便快捷的管理项目依赖资源包(jar),避免资源间的版本冲突问题。

  3.统一开发结构:提供标准的、统一的项目结构。

   

  仓库:用于存储资源,包含各种jar包。

  1.仓库分类

  本地仓库:自己电脑上存储资源的仓库,连接远程仓库获取资源。

  远程仓库:非本机电脑上的仓库,为本地仓库提供资源。

    中央仓库:Maven团队维护,存储所有资源的仓库。

    私服:部门/公司范围内存储资源的常客,从中央仓库获取资源。

  私服的作用:

    保存具有版权的资源,包含购买或者自主研发的jar。(中央仓库中的jar都是开源的,不能存储具有版权的资源。)

    一定范围内共享资源,仅对内部开放,不对外共享。

   2.坐标

  Maven中的坐标是用于描述仓库中资源的位置。

  Maven中坐标主要组成:

  • modelVersion: 这个XML文件所使用的POM格式的版本。
  • groupId: 相当于这个project的所有者或者机构的一个标识,一般是com.company.xxx这种格式。
  • artifactId:  这个project最后所生成的文档(jar、war)的名字,比如对于junit这个开源的project,它的artifactId就是junit。
  • packaging: 这个project的打包的类型,一般是war、jar等值。
  • version: project的版本。
  • name: project的名字,生成文档等内容的时候会用的这个名字。

  Maven坐标的作用:

  使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工种交给计算机完成。

  3.本地仓库的位置配置。

  Maven启动后,会自动保存下载的资源到本地仓库。

  默认位置:当前目录位置位于,登录用户名所有目录下.m2文件夹中。

<localRepository>${user.home}/.m2/repository</localRepository> 

  自定义位置:当前目录位置位于,D:\maven\repository文件夹中。

<localRepository>D:\maven\repository</localRepository>

  4.远程仓库位置配置

  默认仓库配置:默认连接的远程仓库位置。

复制代码
<repositories>
  <repository>
    <id>central</id>
    <name>Central Repository</name>
    <url>https://repo.maven.apache.org/maven2</url>
    <layout>default</layout>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
</repositories>
复制代码

  镜像仓库配置:可以在setting文件中配置阿里云镜像仓库。

复制代码
<mirrors>
<!-- 配置具体的仓库的下载镜像-->
  <mirror>
  <!-- 此镜像的唯一标识,用于区分mirror元素 -->
    <id>nexus-aliyun</id>
    <!--对哪种仓库进行镜像,简单说就是替代哪个仓库 -->
    <mirrorOf>central</mirrorOf>
    <!-- 镜像名称-->
    <name>Nexus aliyun</name>
    <!-- 镜像URL -->
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  </mirror>
</mirrors>
复制代码

  二、IDEA创建Maven项目

   1.依赖管理

  依赖配置:依赖指当前项目运行所需的jar,一个项目可以设置多个依赖。

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

  依赖传递:依赖具有传递性。

  在项目往往需要引入多个依赖, 而引入的依赖又会引入其他的依赖。

  例如: 项目中引入了spring-core依赖, 而spring-core又依赖commons-logging。因为项目直接引入了spring-core依赖,则spring-core为项目的第一直接依赖, 而因为spring-core引入了commons-logging依赖, 则commons-logging为项目的一个传递性依赖。

  有了Maven的传递性依赖机制,不用担心引入多余的依赖。 Maven会解析各个直接依赖的POM, 将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。

  直接传递:在当前项目中通过依赖配置建立依赖关系。

  间接传递:不是自己直接配置,而是通过依赖传递的jar包。

  依赖传递冲突问题:

    路径优先:当依赖中出现相同的资源时,层级越深,优先级越低、层级越浅,优先级越高。

    声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的。

    特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。

  可选依赖:指对外隐藏当前所依赖的资源——不透明。

复制代码
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <!--false没有任何变化,true时候,jar包在项目中是被隐藏的,但是会起作用-->
    <optional>true</optional>
</dependency>
复制代码

  排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本——不需要该jar包

复制代码
<dependency>
    <groupId>com.xxxx</groupId>
    <artifactId>com.xxxx</artifactId>
    <version>1.0.0</version>
    <exclusions>
  <!--排除掉了log4j,之后在该项目中log4j不可用--> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
复制代码

  依赖范围:依赖jar默认情况下可以在任何地方使用,可以通过scope标签来设定范围。

  作用范围:

    主程序范围有效(main文件夹范围内)。

    测试范围有效(test文件夹范围内)。

    是否参与打包(package指令范围内)。

     

  依赖范围传递:带有依赖范围的资源在进行传递时,作用范围将受到影响。

    

   2.生命周期与插件。

  生命周期:每个生命周期的各个环节都是由各种插件完成。Maven有三个相互独立的生命周期(Maven的这三个生命周期不能看成一个整体)。   

       

  • mvn clean:清理编译的项目。
  • mvn compile:编译项目。
  • mvn test:测试项目(运行测试类)。
  • mvn package:负责将我们的项目打包。
  • mvn install:将这个项目安装到仓库中 。

  Clean生命周期(Clean Lifecycle)
  Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

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

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

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

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

 

  Default生命周期(Default Lifecycle)
  Default Lifecycle是构建的核心部分,编译,测试,打包,部署等等,Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。

  一些比较重要和常用的阶段:

  compile 编译项目的源代码。

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

  deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

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

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

  test-compile 编译测试源代码。

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

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

  Site生命周期(Site Lifecycle)
  Site Lifecycle 生成项目报告,站点,发布站点,站点的文档(站点信息,依赖..)。

  Site生命周期,生成站点信息四个阶段:

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

  site 生成项目的站点文档。

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

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

   插件:https://blog.csdn.net/lk142500/article/details/93387210

  例如:Tomcat7运行插件

复制代码
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.1</version>
      <configuration>
        <port>80</port>
        <path>/</path>
      </configuration>
    </plugin>
  </plugins>
</build>
复制代码

   三、分模块开发设计

  1.聚合

  作用:聚合用于快速构建Maven工程,一次性构建多个项目/模块。

  注意:参与聚合操作的模块最终执行顺序与模块间的依赖有关,与配置顺序无关。

  制作方式:

    创建一个空模块,打包类型定义为pom

<packaging>pom</packaging>

    定义当前模块进行构建操作时关联的其他模块名称。例如:

<modules>
  <module>../ssm_controller</module>
  <module>../ssm_service</module>
  <module>../ssm_dao</module>
  <module>../ssm_pojo</module>
</modules>

  2.继承

  作用:通过继承可以实现在子工程中沿用父工程的配置。

  制作方式:

  在子工程中声明父工程坐标对应的位置。

复制代码
<!--定义该工程的父工程 -->
<parent>
  <groupId>com.xxxx</groupId>
  <artifactId>ssm</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!-- 填写父工程的pom文件地址 -->
  <relativePath>../ssm/pom.xml</relativePath>
</parent>
复制代码

  在父工程中定义依赖管理:

  Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找拥有dependencyManagement 元素的项目,然后使用它指定的版本号。

复制代码
<!-- 声明父工程此处进行依赖管理-->
<dependencyManagement>
    <!-- 具体的依赖-->
    <dependencies>
    <!--spring环境 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <!--版本控制-->
            <version>5.1.9.RELEASE</version>
        </dependency>
    <dependencies>
<dependencyManagement>            
复制代码

  3.属性

  自定义属性:作用是等同于定义变量,方便统一维护。

复制代码
<!-- 自定义属性-->
<properties>
    <spring.version>5.1.9.RELEASE</spring.version>
    <junit.version>4.12</junit.version>
</properties>


<!-- 调用属性-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
复制代码

  4.版本管理

    SNAPSHOT(快照版本)

  项目开发过程中,为了方便团队成员合作,解决模块间相互依赖和实时更新的问题,开发者对每个模块进行构建时候,输出的临时性版本叫做快照版本(测试阶段版本),快照版本会随着开发的进展不断更新。

    RELEASE(发布版本)

  项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构建文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本。

  

posted on   粼溪  阅读(65)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示