[Java]maven从入门到进阶

news2024/9/23 1:32:25

介绍

apache旗下的开源项目,用于管理和构建java项目的工具

官网: Welcome to The Apache Software Foundation!

1.依赖管理

通过简单的配置, 就可以方便的管理项目依赖的资源(jar包), 避免版本冲突问题

优势: 基于项目对象模型(POM),通过一小段描述信息来管理项目的构建

2.统一目录结构

提供标准, 统一的项目结构

3.项目构建

标准跨平台(linux/windows/MacOs)的自动化项目构建方式

POM

仓库

用来管理和存储jar包

1.本地仓库

  1. 本机的仓库, 计算机上的一个目录
  2. 项目中使用的依赖会先在本地仓库中查找

2.远程仓库

  1. 公司/团队维护的仓库
  2. 需要配置,不配置就直连中央仓库
  3. 下载流程
  • 本地仓库中不存在的依赖再来远程仓库查找
  • 依赖存在直接下载使用
  • 依赖不存在去中央仓库下载
  1. 好处
  • 连接中央的仓库的速度较慢, 因为要访问外网
  • 使用中央仓库可以方便其他同事复用依赖
  • 提高团队整体的依赖下载速度

3.中央仓库

官方维护的仓库

依赖查找循序: 本地仓库->远程仓库(私服)->中央仓库

下载

安装

单独安装Maven, Maven的安装包是一个绿色软件, 解压即可使用

说明:

  1. 测试: nvm -v

目录

  1. bin-> 可执行的程序
  2. conf/settings -> 配置文件
  3. mvn_pepo -> 本地仓库
  4. lib -> maven依赖的jar包资源

集成Maven

IEDA中集成Maven有两种方式, 可以配置当前项目, 比较繁琐, 也可以全局配置Maren, 比较推荐

1.当前项目

  1. 选择IDEA中的File -> Settings -> Build, Execution, Deployment -> Build Tools -> Mwven
  2. 设置IEAC使用本地安装的Maven, 并修改配置文件以及本地仓库路径

2.全局配置

使用

创建Maven项目

1.先创建空项目

2.创建模块,选择Maven,选择JDK,点击Next

3.填写模块名称,坐标信息,点击finish,创建完成

目录结构

1.基本信息

项目基本信息存放在pom.xml配置文件中

<!-- 项目坐标 -->
<groupId>itheima.com</groupId>
<artifactId>maven_helloworld</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- 项目运行和打包的jdk版本   -->
<properties>
   <maven.compiler.source>17</maven.compiler.source>
   <maven.compiler.target>17</maven.compiler.target>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

2.Maven坐标

Maven中的坐标是资源的唯一标识, 通过坐标可以定位资源位置

作用: 使用坐标来定义项目或引入项目的依赖

组成:

groupld: 定义当前项目隶属的组织名称, 一般为域名倒写

artifactId: 定义当前Maven项目名称, 一般是模块名称

version: 定义当前项目版本号

3.src根目录

  1. main: 项目资源
  • java: 源代码
  • resources: 配置文件
  1. test: 测试资源
  • java: 源代码
  • resources: 配置文件(使用较少,默认不创建)
  1. target: 编译后的字节码文件

4.HelloWord

1.连包带类创键文件

2.helloworld代码

导入Maven项目

方式1

展开右侧Maven面板->选择+号 ->选择到pom.xml文件 ->导入

方式2

通过IDEA导入Maven项目, 注意要选到 pom.xml 文件

移除Maven项目

这里的移除只是在IDEA中移除maven模块, 资源还存在于文件夹中

依赖管理

依赖配置

依赖: 当前项目运行所需要的jar包, 一个项目可以引入很多依赖

  1. 编写<dependencies></dependencies>标签
  2. 嵌套<dependency></dependency>标签
  3. 定义依赖坐标
<dependencies>
  <dependency>
     //组织名
     <groupId>junit</groupId>  
     //模块名
     <artifactId>junit</artifactId> 
     //版本号
     <version>4.12</version>  
  </dependency>
</dependencies>
  1. 坐标信息查询: https://mvnrepository.com/
  2. 添加坐标后,不会立即生效, 点击刷新的按钮即可 (如果没有刷新按钮可以手动刷新)

  1. 查看依赖以及依赖版本

  1. 如果引入的依赖, 本地仓库不存在, 将会连接远程仓库/中央仓库下载, 这个过程比较耗时

依赖传递

Maven项目中的依赖具有传递性, 项目中配置的依赖是直接依赖, 项目依赖的依赖就是间接依赖

查看依赖关系

方法1: 通过maven面板查看

方法2: 打开pom.xml文件, 右键选择Diagrams -> show Dependencies

排除依赖

A依赖B, B依赖C, 默认A就会依赖C, 不想让A依赖C, 就可以使用依赖排除, 主动断开依赖的资源, 被排除的资源无需指定版本

<dependency>
   <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
     <!--依赖排除-->
     <exclusions>
       <exclusion>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
     </exclusion>
     <!--依赖排除-->
   </exclusions>
</dependency>

依赖范围

依赖的jar包, 默认情况下, 在任何地方都可以使用, 可以通过<scoped></scoped>标签设置其作用范围

  <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
     <scope>text</scope>
  </dependency>

可选参数

生命周期

Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一

分类

Maven有3套相互独立的生命周期

  1. clean: 清理工作
  • clean: 移除上一次构建生成的文件
  1. default: 核心工作(如: 编译,测试,打包,安装,部署)
  • compile: 编译项目源代码
  • text: 运行测试
  • package: 将编译后的文件打包, 如jar, war包
  • install: 安装项目到本地仓库
  1. site: 生成报告,发布站点等

执行顺序

在同一套生命周期中, 当运行后面的阶段时, 前面的阶段都会运行

  1. 双击执行install周期, 但是test等周期默认也会执行
  2. 如果需要的话, 可以指定禁用周期

执行

执行maven指定的生命周期有两种方式

1.命令执行

在项目所在目录使用命令行工具, 执行指定命令, 执行maven的声明周期

  • mvn clean
  • mvn compile
  • mvn package
  • mvn test
2.双击执行

在idea中使用maven工具栏, 双击生命周期执行

3.执行原理

maven本身不执行任何操作, 所有的操作都是通过绑定的插件进行的, 所以maven的本质是一个插件集合

  1. 当我们双击生命周期阶段,运行程序时
  2. 实际上是与生命周期绑定的插件在工作

分模块设计

将项目按照功能拆分成若干个子模块, 方便项目的管理和维护, 也方便模块间的相互调用, 资源共享

需求: 完成tlias项目的模块拆分

拆分实体类Pojo

目标: 创建maven 模快 tlias-pojo, 存放实体类

1.新建模块: new Module -> Maven -> Next

2.转移实体类: 连包带类一起复制到新模块中

3.在新模块中引入实体类需要的依赖, 以解决报错

    <dependencies>
        <!-- lombok依赖  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>

4.引入模块: 在原始的项目中引入拆出去的模块

   <!--  拆分的tlias-pojo模块 -->
   <dependency>
        <groupId>com.itheima</groupId>
        <artifactId>tlias-pojo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

拆分工具类Utils

目标: 创建maven 模块 tlias-utils, 存放相关工具类

步骤: 与拆分实体类的步骤一致

注意: 引入web起步依赖时, 由于没有父工程限制, 需要指定版本, 版本与项目工程中的保持一致

继承

继承关系

继承描述的是两个工程间的关系, 子工程可以继承父工程中的配置信息, 常见于依赖关系的继承

1.作用: 简化依赖配置, 统一管理依赖

2.继承关系: 子工程继承父工程, 父工程继承spring-boot-stater-parent工程

3.目录结构: 两种工程结构都可以, 但是嵌套的父子结构看上去更清晰

需求: 改造tlias项目

1.创建父工程

  • 创建maven模块tlias-parent, 该工程为父工程, 设置打包方式为pom(默认jar)

  • 父工程不写具体逻辑代码,可以把src删掉
  • 让父工程设置继承官方工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    //1.继承官方工程 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        // 注意版本号
        <version>3.2.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.itheima</groupId>
    <artifactId>tlias-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--   2.设置打包方式为pom -->
    <packaging>pom</packaging>

    <dependencies>
        <!-- lombok依赖  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

</project>

2.子工程继承父工程: pom.xml文件中

// 配置继承关系
<parent>
    <groupId>com.itheima</groupId>
    <artifactId>tlias-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    // 指定父工程相对位置
    <relativePath>../tlias-parent/pom.xml</relativePath>
</parent>

3.管理共有依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <dependencies>
        <!-- lombok依赖  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
    </dependencies>

</project>
  • 在父工程中配置子工程共有的依赖, 子工程会自动继承父工程的依赖
  • 若父子工程都配置了同一个依赖的不同版本, 最终以子工程为准

版本锁定

在Maven中, 可以在父工程的pom文件中, 通过 <dependencyManagement> 来统一管理依赖版本

<!--  版本锁定  -->
<dependencyManagement>
    <dependencies>
        <!--JWT令牌生成-->
        <dependency>
          <groupId>io.jsonwebtoken</groupId>
          <artifactId>jjwt</artifactId>
          <version>0.9.1</version>
        </dependency>       
   </dependencies>
</dependencyManagement>
<dependencies>
    <!-- JWT令牌依赖-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
    </dependency>
</dependencies>
  1. 通过版本锁定, 分散在子工程的依赖版本由父工程统一管理
  2. 版本锁定只管理版本, 子程序还是需要引入依赖的, 只是不需要指定版本了

自定义属性: 父工程统一管理依赖版本后, 可以使用自定义属性, 集中定义依赖版本, 无需上下翻找

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>

        <!--  自定义属性 -->
        <!--  格式: 自定义属性名.version -->
        <lombok.version>1.18.24</lombok.version>
        <mybatis.version>3.0.3</mybatis.version>
        <pagehelper.version>1.4.6</pagehelper.version>
        <fastjson.version>1.2.76</fastjson.version>
        <aliyunsdkoss.version>3.15.1</aliyunsdkoss.version>
        <jaxbapi.version>2.3.1</jaxbapi.version>
        <activation.version>1.1.1</activation.version>
        <jaxbruntime.version>2.3.3</jaxbruntime.version>
        <jjwt.version>0.9.1</jjwt.version>
    </properties>

    <dependencies>
        <!-- lombok依赖  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            //  属性引用 
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

    <!--  版本锁定  -->
    <dependencyManagement>
        <dependencies>
            <!--  mybatis起步依赖  -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            ... ...
        </dependencies>
    </dependencyManagement>
</project>
  1. dependencies是直接依赖, 在父工程中配置了依赖, 子工程就会直接继承下来
  2. dependencyManagement是版本管理, 只管理依赖的版本, 使用时子工程仍然需要引入依赖坐标

聚合

项目开发完成后需要打包, 分模块开发时, 打包前需要手动安装其他模块, 保证本地仓库中存在该模块, 才能打包成功, 否则可能会找不到相关模块, 造成打包失败

概念: 聚合就是把多个模块作为一个整体进行项目构建, 简化项目打包过程

  1. 聚合工程: 一个不具有业务功能的工程(有且只有一个pom文件),
  2. 最佳实践: 通常情况下, 聚合工程和继承中的父工程共用一个
  3. 实际作用: 构建项目直接在聚合工程上构建, 无需手动构建依赖关系

实现: maven中可以通过<modules>设置当前聚合工程所包含的子模块名称

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!--聚合其他模块-->
    <modules>
        <module>../tlias-pojo</module>
        <module>../tlias-utils</module>
        <module>../tlias_web_management</module>
    </modules>

   ... ...
</project>
  1. 打包: 在聚合工程中聚合其他模块, 然后再聚合工程上构建项目
  2. 执行: 聚合工程中所包含的模块, 在构建时, 会自动根据模块间的依赖关系设置构建顺序, 与书写顺序无关

继承与聚合的关系

私服

私服是一种特殊的远程仓库, 它是架设在局域网内的仓库服务, 用来代理位于外部的中央仓库, 解决团队内部资源共享和资源同步的问题

  1. 使用私服后, 依赖查找顺序为: 本地仓库 -> 私服 -> 中央仓库

使用私服就是学习资源的的上传与下载

  1. RELEASE(发行版本): 功能趋于稳定, 当前更新停止, 可以用于发行的版本, 储存在私服中的RELEASE仓库中
  2. SNAPSHOT(快照版本): 功能不稳定, 尚处于开发中的版本,即快照版本, 储存在私服的SHAPSHOT仓库中
  3. CENTRAL(官方版本): 中央仓库中下载的依赖, 储存在私服的CENTRAL仓库中

连接私服是比较固定的操作, 资料中也提供了配置文档, 可以参照配置

  1. 设置私服的访问用户名和密码 (maven安装目录/settings.xml文件/server中配置)

  1. IDEA中的maven工程的pom文件中配置上传(发布)地址

  1. 设置私服依赖下载的仓库组地址( settings.xml中的mirrors / profiles中配置)

资源上传: 执行maven的deploy生命周期, 发布资源到私服中, 同私服的其他同事就可以下载使用了

  1. 资源上传到私服的位置, 由资源的版本决定

资源下载: 连接私服后, 引用依赖的坐标, 刷新后, maven就会自动到私服中下载资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第六天旅游线路规划

第五天&#xff1a;从贾登峪返回乌鲁木齐&#xff1b; 第六天&#xff1a;从乌鲁木齐到天山天池&#xff0c;晚上回乌鲁木齐住宿。 第六天从乌鲁木齐到天山天池景区入口的的规划结果见下图&#xff1a; 1、行程安排 根据上面的耗时情况&#xff0c;规划一天的行程安排如下&a…

OFDM简介

OFDM(Orthogonal Frequency Division Multiplexing)全称为正交频分复用&#xff0c;在无线通信中被广泛应用。本文结合下图对OFDM的基本原理进行说明。 图1. OFDM信号生成流程示意图 上图为OFDM信号生成、传输和接收的整体流程图。结合该流程图对其中每一个模块进行详细说明。 …

Logstash 安装与部署(无坑版)

下载 版本对照关系&#xff1a;ElasticSearch 7.9.2 和 Logstash 7.9.2 &#xff1b; 官方下载地址 选择ElasticSearch版本一致的Logstash版本 https://www.elastic.co/cn/downloads/logstash 下载链接&#xff1a;https://artifacts.elastic.co/downloads/logstash/logst…

一、XML与Tomcat

文章目录 1. XML简介1.1 什么是XML1.2 XML的作用 2. XML语法2.1 文档声明2.2 xml 注释2.3 元素&#xff08;标签&#xff09;2.4 xml 属性2.5 语法规则2.5.1 所有XML元素都须有关闭标签&#xff08;也就是闭合&#xff09;2.5.2 XML 标签对大小写敏感2.5.3 XML 必须正确地嵌套2…

# windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次

windows 运行框输入mrt提示错误&#xff1a;Windows 找不到文件’mrt’。请确定文件名是否正确后&#xff0c;再试一次 一、错误描述&#xff1a; 当您在 windows 运行框中输入mrt并收到错误提示“Windows 找不到文件’mrt’。请确定文件名是否正确后,再试”时&#xff0c;这…

【无人机设计与控制】四旋翼无人机轨迹跟踪及避障Matlab代码

摘要 本文主要研究了四旋翼无人机在复杂环境中的轨迹跟踪与避障控制策略。通过Matlab/Simulink对四旋翼无人机进行了建模与仿真。系统集成了避障算法&#xff0c;使得无人机在执行任务时能够有效避开障碍物&#xff0c;保证飞行的安全性与稳定性。 理论 无人机飞行控制通常涉…

着色器 简介

着色器&#xff08;Shader&#xff09;是运行在 GPU 上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说&#xff0c;着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序&#xff0c;因为它们之间不能相互通信&#xff1b;它们之间…

【JavaSE】--数组的定义与使用

文章目录 1. 数组的基本概念1.1 什么是数组1.2 数组的创建及初始化1.2.1 数组的创建1.2.2 数组的初始化 1.3 数组的使用1.3.1 数组中元素访问1.3.2 遍历数组 2. 数组是引用类型2.1 初识JVM的内存分布2.2 基本类型变量与引用类型变量的区别2.3 再谈引用变量2.4 认识null 3. 数组…

es的封装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、类和接口介绍0.封装思想1.es的操作分类 二、创建索引1.成员变量2.构造函数2.添加字段3.发送请求4.创建索引总体代码 三.插入数据四.删除数据五.查询数据 前…

公共建筑能耗监测系统解决方案

jianzhunenghao 建筑节能监测系统公共建筑能耗监测系统建筑能耗监测系统节能监测系统能耗监测建筑能耗监测能耗分析能耗管理能耗预测能耗监控能耗监测平台建筑能耗 介绍 能耗监控系统是为耗电量、耗水量、耗气量&#xff08;天然气量或者煤气量&#xff09;、集中供热耗热量…

STHS34PF80高灵敏度红外感应器(2)----InfraredPD存在感应检测

STHS34PF80人体存在传感器.2--InfraredPD存在感应检测 概述视频教学样品申请完整代码下载硬件准备开启CRC串口设置开启X-CUBE-MEMS1InfraredPD文件InfraredPD算法库注意事项对应DEMOMX_MEMS_InitMX_MEMS_Processt_obj_comp&#xff08;补偿后的物体温度&#xff09;t_obj_chang…

清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程

清理C盘缓存是维护电脑性能、释放磁盘空间的重要步骤。以下是一个详细且操作简单的教程&#xff0c;旨在帮助用户通过一键或几步操作完成C盘缓存的清理。 1.使用Windows系统自带工具 磁盘清理 1.打开磁盘清理工具&#xff1a; -按下“WinE”打开文件资源管理器…

数据结构与算法——Java实现 5.链表

目录 一、定义 链表的分类 二、性能 随机访问 插入或删除 三、单向链表 链表内部节点类 ① 增加&#xff08;插入&#xff09; 1.头插法 2.寻找最后一个节点位置 3.尾插法 4.根据索引位置插入 ② 删除 1.删除首个结点 2.获取链表的指定索引节点 3.删除链表指定索引元素节点 4.删…

【Java】【力扣】83.删除排序链表中的重复元素

题目 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输出&#…

js 控制台自动 debugger

在全局文件中加入以下代码&#xff0c;即可打开控制台自动调试 setInterval(function() {check() }, 1000); var check function() {function doCheck() {(function() {}["constructor"]("debugger")())doCheck()}try {doCheck()} catch (err) {} }; che…

Flask-WTF的使用

组织一个 Flask 项目通常需要遵循一定的结构&#xff0c;以便代码清晰、可维护。下面是一个典型的 Flask 项目结构&#xff1a; my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── templat…

T3打卡-天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.导入数据&#xff1a; #设置GPU import tensorflow as tf gpustf.config.list_physical_devices("GPU") if gpus:gpu0gpus[0]tf.config.experime…

Android OkHttp源码分析(一):为什么OkHttp的请求速度很快?为什么可以高扩展?为什么可以高并发

目录 一、为什么要使用OkHhttp? 在不使用OkHhttp之前&#xff0c;我们都是在使用什么&#xff1f;使用HttpURLConnection&#xff0c;那么我们看看HttpURLConnection发起一次请求&#xff0c;两次请求要花多长时间&#xff0c;而OkHttp花多长时间。HttpURLConnection会比okht…

【银河麒麟高级服务器操作系统实例】tcp_mem分析处理全过程内核参数调优参考

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 系统中出现大量的TCP: out of memory…

Mina protocol - 体验教程

Mina protocol - 体验教程 一、零知识证明( Zero Knowledge Proof )1、零知识证明&#xff08;ZKP&#xff09;的基本流程工作流程&#xff1a; 2、zkApp 的优势&#xff1a;3、zkApp 每个方法的编译过程&#xff1a; 二、搭建第一个zkapp先决条件1、下载或者更新 zkApp CLI​2…