maven基础/java包管理器

news/2024/9/29 8:42:15/

Maven

  • 在构建java项目的时候,总是会碰到下载依赖和对项目结构的疑问,以下内容就是我对现在最常用之一的java包管理器maven的学习笔记

一、情景和作用以及前置步骤

1.1情景和作用

解决依赖管理和项目构建

  • 核心文件:pom.xml,类似于package.json,makefile文件

  • 类似于npm、make的作用

  • 当下载依赖的时候默认是先从本地仓库查找,如果没有去就去私服仓库(可以用Nexus配置)或者中央仓库寻找。

  • 项目的构建需要将源文件编译成一个jar包或war包,maven提供了自动化的标准流程,通过该流程可以实现自动化打包

    在这里插入图片描述

1.2前置步骤

maven_24">1.2.1安装maven
  1. 前备知识

    • 需要JDK版本>=1.7
  2. 下载链接

    • https://maven.apache.org/download.cgi
  3. 配置setting.json

    • 配置maven依赖安装路径

      <localRepository><路径></localRepository>
      
    • 配置镜像源

          <mirror><id>aliyunmaven</id> <mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></mirror><mirror><id>maven-default-http-blocker</id>   <!-- 镜像的唯一表示 --><mirrorOf>external:http:*</mirrorOf>  <!-- 镜像的范围,*表示匹配所有,该镜像只对http协议有效,https协议无效,--><name>Pseudo repository to mirror external repositories initially using HTTP.</name><url>http://0.0.0.0/</url><blocked>true</blocked></mirror>
      
    • (可以不配)指定maven默认打包java项目的JDK版本。但是因为项目中的pom.xml优先级高于它,java项目一般也会在pom.xml中指定JDK版本

          <profile> <id>jdk-1.8</id>  <activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk>  </activation>  <properties>  <maven.compiler.source>1.8</maven.compiler.source>  <maven.compiler.target>1.8</maven.compiler.target>  <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>  </properties>   </profile>
      
maven_83">1.2.2简单开始maven
  1. 创建maven项目

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5 -DinteractiveMode=false
    
    • -DgroupId代表的是域名(通常反过来写)
    • -DartifactId是项目的唯一标识
    • -DarchetypeArtifactId项目的目录结构
    目录结构
    my-app
    |-- pom.xml
    `-- src|-- main|   `-- java|       `-- com|           `-- mycompany|               `-- app|                   `-- App.java`-- test`-- java`-- com`-- mycompany`-- app`-- AppTest.java
    
  2. 流程

    • 编译项目

      mvn compile
      
    • 测试项目(测试代码的逻辑性)

      mvn test
      
    • 打包项目(打包使得源代码和环境集合在一起,实现可移植性,适合企业开发)

       mvn package
      
    • 执行项目

      • 如果你的项目是一个 可执行的 JAR 文件,你可以使用 java -jar 命令来运行它。首先,确保你的 pom.xml 文件中有一个 mainClass 配置用于指定主类。典型的配置如下:

        <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><archive><manifest><mainClass>com.mycompany.app.App</mainClass> <!-- 主类路径 --></manifest></archive></configuration></plugin></plugins>
        </build>
        
        java -jar target/my-app-1.0-SNAPSHOT.jar
        
      • 直接运行项目中的主类

        • 如果你想直接运行某个类(不打包),可以使用 Maven 的 exec:java 插件。首先,确保在 pom.xml 文件中添加了 exec-maven-plugin 插件:

          <build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>3.0.0</version><configuration><mainClass>com.mycompany.app.App</mainClass> <!-- 主类路径 --></configuration></plugin></plugins>
          </build>
          
          mvn exec:java -Dexec.mainClass="com.mycompany.app.App"
          
    • 清理项目

      mvn clean
      
maven_194">1.2.3idea中使用maven
  1. 创建项目,大部分框架都集成了maven,都有默认的maven项目目录结构,默认配置。可以通过下图的地方去修改maven配置

    在这里插入图片描述

    这里maven home path就是自己的maven下载路径,改User setting file<setting.xml的路径>和Local repository记得勾选旁边的Override。

二、基础知识

2.1Maven的生命周期和插件

  1. 右边maven中的Profiles(比如不同java版本)是setting.json中配置的,如果配置多个就会有多个,但是一般的Spring项目没有的,因为在生成项目的时候,我们会指定很多参数,并不是单纯的maven项目,是在pom.xml中配置的,当然也可以实现在pom.xml中配置实现不同版本的切换

    在这里插入图片描述

  2. Lifecycle这些生命周期是依靠于下方的一个或多个插件的,idea中可以直接点击生命周期执行

    在这里插入图片描述

    阶段描述对应命令
    clean清理项目,删除上一次构建生成的文件mvn clean
    validate验证项目是否正确且所有必要信息都可用mvn validate
    compile编译源代码mvn compile
    test使用适当的测试框架执行测试mvn test
    package将编译后的代码打包成可分发格式,如 JAR 或 WARmvn package
    verify运行任何检查,验证包的有效性mvn verify
    install将包安装到本地 Maven 仓库mvn install
    site生成项目的站点文档mvn site
  • 一般的顺序也是这样
  • groupId、artifactId、version构成了jar包的唯一标识
  • 命令行支持mvn <阶段> <阶段>这种操作,是先执行第一个任务,再第二个任务

maven_240">2.2maven的核心特性:依赖下载管理

  1. scope标签

    • 属性

      下面是用 Markdown 格式编写的 Maven scope 属性作用总结表:

      Scope编译时测试时运行时最终打包用途
      compile默认值,依赖在编译、测试、运行时都可用,通常用于核心库。
      runtime依赖在运行时可用,编译时不可用,适用于编译时不需要但运行时需要的库(如 JDBC 驱动)。
      test仅在测试阶段可用,不会包含在最终构建中,适用于测试框架(如 JUnit、Mockito)。
      system使用本地文件路径的依赖,不从 Maven 仓库下载,需通过 systemPath 指定。
      provided编译、测试时可用,运行时由目标环境提供,不打包在最终项目中(如 Servlet API)。
    • 极其不推荐system,因为转移开发环境很容易出问题

    • pom.xml中下载依赖的时候,本身就会通过配置过的maven的repository仓库来寻找依赖,找到了就不用下载。也可以通过把scpoed属性值改为system,再加上system-path路径使得使用别的路径的依赖,但上方也说了极其不推荐

  2. 添加依赖

    • 进入maven的repository仓库网站

      https://mvnrepository.com/

    • 搜索需要下载的依赖

      在这里插入图片描述

    • 选择版本号

      在这里插入图片描述

    • 点击版本号,复制链接,并加入pom.xml

      在这里插入图片描述

  3. 依赖传递

    • 直接写在pom.xml的依赖是直接依赖,写到xml中的文件有可能依赖别的文件,依赖的文件就和现在的项目的关系就是间接依赖了,maven会帮我们自动解析,但是要注意,maven只会解析属性scpoed值为compile的依赖(但如果是在父模块中定义的就不是了)
  4. 依赖冲突:使用同一个依赖的不同版本

    • 最短路径选择:当你拉取其他人的仓库时,如果该仓库依赖于不同版本的同一库,Maven 会根据依赖树的最短路径原则选择版本。这意味着如果某个依赖通过更少的中间依赖达到目的,它会被优先选择。

    • 优先级:在自己的项目中,列出的依赖顺序也会影响最终选择的版本。通常,首先出现的依赖会被优先使用,这使得在 pom.xml 中的依赖顺序变得重要。

    • 手动解决依赖

      • 当一个模块使用了其它两个模块的jar包,每个jar包都有spring-jdbc,但版本不一样,这个时候,maven有自动的调节方案,可以看到child-test3这个模块的jdbc黑了

        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

        • 如果我就要使用test3的怎么办呢

          1. 使用exclusions标签,再在里面加入单数的exclusion标签,添加要忽略的jar包的坐标,注意不需要版本号,因为会把该jar包所有的这个类型的依赖全部忽略掉,然后重启,发现test2没了,test3也黑,是因为ideabug,重启后就ok了

            在这里插入图片描述

          2. 在所需的jar包的pom.xml文件中加入optional选项,true就是屏蔽,有图和第一个方法有同样bug,重启idea即可

            在这里插入图片描述

  5. 父子项目

    • 当多个子模块需要的依赖都一样,可以通过父模块安装好,供子模块使用,父模块不会打包。比如电商平台会有:商品模块、用户模块等

    • 新建一个项目,父模块不需要打包等操作,可以直接删除src文件夹。

      • 注意把父模块中的pom.xml中的packaging改为pom,表示不需要打包,一般来说都是jar包,web项目为war包。
      • 然后会出现modules标签,里面是子模块的信息。
    • 新建一个子模块

      在这里插入图片描述

      子模块的pom.xml,parent直接移用了父模块的坐标,子模块的groupId直接继承父模块的groupId

    • 注意spring,项目不会直接继承夫模块的groupId,而是单独拥有,会有以下好处

      1. 模块化和独立性

      • 使用不同的 groupId 可以使每个子模块更加独立,便于管理和维护。这样,子模块可以在不同的项目中独立使用,避免了依赖于父模块的紧耦合关系。

      2. 版本控制

      • 不同的 groupId 可以让子模块拥有独立的版本控制。这意味着可以单独更新子模块的版本,而不影响父模块或其他子模块。

      3. 发布和分发

      • 当子模块需要单独发布到 Maven 仓库时,使用不同的 groupId 可以确保它们可以被其他项目直接引用。这在企业级开发中尤其常见。

      4. 清晰的组织结构

      • 采用不同的 groupId 可以帮助在项目中建立更清晰的层次结构和模块组织,便于团队成员理解各个模块的用途和职责。

      5. 避免冲突

      • 如果子模块和父模块的 groupId 相同,可能会在依赖解析时引发混淆或冲突。使用不同的 groupId 可以避免这种情况。

      6. 符合 Maven 约定

      • Maven 鼓励通过 groupId 来反映项目的组织结构或领域。不同的 groupId 可以更好地反映子模块的业务逻辑或功能特性。
        在这里插入图片描述
  • dependencyManagement

    • 在这个标签中定义的模块不会被子模块直接继承,在子模块中再引入模块,不写版本号,就是直接引用父模块中的

      在这里插入图片描述
      在这里插入图片描述

  • spring.version多个依赖使用同个版本

    使用方式如图

    在这里插入图片描述

  • 参考GeekHour‘

  • 如有问题,可以反馈给我,感谢读者的观看啦


http://www.ppmy.cn/news/1531847.html

相关文章

web - RequestResponse

##Request&Response 1&#xff0c;Request和Response的概述 Request是请求对象&#xff0c;Response是响应对象。这两个对象在我们使用Servlet的时候有看到&#xff1a; 此时&#xff0c;我们就需要思考一个问题request和response这两个参数的作用是什么? request:获取请…

windows端后端运行python程序,类似nohup

假如是py文件&#xff1a; start /min python test.py 相当于Linux中&#xff1a; nohup python test.py &如果是Pyinstaller打包的exe程序&#xff1a; start /b cmd /c xxx.exe > output.log 2>&amp;1其中 /b 表示在新窗口中打开程序&#x…

Linux云计算 |【第四阶段】RDBMS1-DAY2

主要内容&#xff1a; 常用函数&#xff08;函数分类1&#xff1a;单行、分组&#xff1b;函数分类2&#xff1a;字符、数学、日期、流程控制&#xff09;、分组查询group by、连接查询 一、常用函数 1. 按使用方式分类 ① 单行函数 单行函数&#xff08;Scalar Functions&…

爬虫技术深潜:探究 JsonPath 与 XPath 的语法海洋与实战岛屿

Python爬虫中JSON与XML字符串的XPath和JsonPath过滤语法区别对比 在信息爆炸的互联网时代&#xff0c;数据抓取成为了获取宝贵信息的关键技能。对于技术爱好者&#xff0c;特别是Python程序员来说&#xff0c;熟练掌握JSON和XML数据解析方法至关重要。本文旨在深入探讨这两种格…

详解2024 openAi最新gpt o1模型分析

探索 GPT 的 O1 模型:一场人工智能的革命 在人工智能领域,尤其是自然语言处理(NLP)领域,模型的不断迭代和升级为我们带来了前所未有的机遇。最近,OpenAI 发布了全新的 O1 模型,这一创新不仅在技术上取得了重大突破,也为各行各业的应用提供了更多可能性。本文将深入探讨…

Scrapy框架入门

一、Scrapy简介 Scrapy是一款快速而强大的web爬虫框架&#xff0c;基于Twisted的异步处理框架、Twisted是事件驱动的。 Scrapy是由python实现的爬虫框架&#xff1a;架构清晰、可扩展性强、可以灵活完成需求。 一、Scrapy应用 scrapy及其他模块的安装 pip3 install scrapy…

使用OpenCVSharp实现图像拼接详解

文章目录 1. 读取图像2. 特征检测与描述3. 特征匹配4. 单应性矩阵计算5. 图像拼接6. 显示结果总结1. 读取图像 首先,准备要拼接的图像。确保这些图像有重叠区域,这是拼接成功的关键。 using OpenCvSharp;class ImageStitching {static void Main(){// 读取待拼接的图像

生物信息常用编辑器:轻量/强大/可定制/跨平台支持的编辑器之神 - vim

Emacs 被誉为神的编辑器&#xff0c;而 vim 是编辑器之神。本人曾经是 Emacs 的粉丝&#xff0c;不过后来不知不觉&#xff0c;已经是 vim 的重度用户&#xff0c;而 Emacs 却很长时间没用了。 如果你开始在生物信息学中编写代码或处理大量文本数据&#xff0c;选择一个合适的文…