maven学习笔记总结

news2024/11/27 14:33:39

目录

一、maven简介

二、GAVP属性

三、基于 IDLE 的 Maven 工程创建

1)java标准工程(Javase)的创建

2)java企业工程(Javaee)的创建

a)手动创建

b)插件方式创建(file / settings / plugins / marketplace)

四、Maven工程项目结构说明

五、依赖管理和配置

六、依赖传递和依赖冲突(不用管,就是一种原理说明,总之用maven导入总是对的)

七、依赖导入失败场景和解决方案

八、构建概念

九、继承与聚合

1、继承语法

2、父工程依赖统一管理

3、聚合概念

4、聚合作用

5、聚合语法

6、聚合演示

十、总结


一、maven简介

Maven 是一款为 Java 项目构建管理、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。

二、GAVP属性

Maven工程相对之前的工程,多出一组gavp属性,gav需要我们在创建项目的时指定,p有默认值,后期通过配置文件修改。

既然要填写的属性,我们先行了解下这组属性的含义!

Maven 中的 GAVP 是指 GroupIdArtifactIdVersionPackaging 等四个属性的缩写,其中前三个是必要的,而 Packaging 属性为可选项。

这四个属性主要为每个项目在maven仓库总做一个标识,类似人的《姓-名》。有了具体标识,方便maven软件对项目进行管理和互相引用!

GAV遵循一下规则:

1) GroupID 格式:com.{公司/BU }.业务线.[子业务线],最多 4 级。

    说明:{公司/BU} 例如:alibaba/taobao/tmall/aliexpress 等 BU 一级;子业务线可选。

    正例:com.taobao.tddl 或 com.alibaba.sourcing.multilang  com.atguigu.java

2) ArtifactID 格式:产品线名-模块名。语义不重复不遗漏,先到仓库中心去查证一下。

    正例:tc-client / uic-api / tair-tool / bookstore

3) Version版本号格式推荐:主版本号.次版本号.修订号 1.0.0

    1) 主版本号:当做了不兼容的 API 修改,或者增加了能改变产品方向的新功能。

    2) 次版本号:当做了向下兼容的功能性新增(新增类、接口等)。

    3) 修订号:修复 bug,没有修改方法签名的功能加强,保持 API 兼容性。

    例如: 初始→1.0.0  修改bug → 1.0.1  功能调整 → 1.1.1等

Packaging定义规则:

  指示将项目打包为什么类型的文件,idea根据packaging值,识别maven项目类型!

  packaging 属性为 jar(默认值),代表普通的Java工程,打包以后是.jar结尾的文件。

  packaging 属性为 war,代表Java的web工程,打包以后.war结尾的文件。

  packaging 属性为 pom,代表不会打包,用来做继承的父工程。

三、基于 IDLE 的 Maven 工程创建

1)java标准工程(Javase)的创建

先创建一个空项目,方便以后把所有项目都放在该目录之下

再new一个新的module

Javase创建完毕(注意:此处省略了version,直接给了一个默认值<version>1.0-SNAPSHOT</version>。自己后期可以在项目中随意修改!)

2)java企业工程(Javaee)的创建

a)手动创建

创建一个javase maven工程

手动添加web项目结构文件

最后进行刷新和校验

项目的webapp文件夹出现小蓝点,代表成功!!

b)插件方式创建(file / settings / plugins / marketplace)

创建一个javase maven工程

右键、使用插件快速补全web项目

若小蓝点没出来,重启ldea就行。

四、Maven工程项目结构说明

Maven 是一个强大的构建工具,它提供一种标准化的项目结构,可以帮助开发者更容易地管理项目的依赖、构建、测试和发布等任务。

以下是 Maven Web 程序的文件结构及每个文件的作用:

- pom.xml:Maven 项目管理文件,用于描述项目的依赖和构建配置等信息。

- src/main/java:存放项目的 Java 源代码。

- src/main/resources:存放项目的资源文件,如配置文件、静态资源等。

- src/main/webapp/WEB-INF:存放 Web 应用的配置文件。

- src/main/webapp/index.html:Web 应用的入口页面。

- src/test/java:存放项目的测试代码。

- src/test/resources:存放测试相关的资源文件,如测试配置文件等。

五、依赖管理和配置

Maven 依赖管理是 Maven 软件中最重要的功能之一。Maven 的依赖管理能够帮助开发人员自动解决软件包依赖问题,使得开发人员能够轻松地将其他开发人员开发的模块或第三方框架集成到自己的应用程序或模块中,避免出现版本冲突和依赖缺失等问题。

我们通过定义 POM 文件,Maven 能够自动解析项目的依赖关系,并通过 Maven 仓库自动下载和管理依赖,从而避免了手动下载和管理依赖的繁琐工作和可能引发的版本冲突问题。

重点: 编写pom.xml文件!

maven项目信息属性配置和读取:

<!-- 模型版本 -->

<modelVersion>4.0.0</modelVersion>

<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->

<groupId>com.companyname.project-group</groupId>

<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->

<artifactId>project</artifactId>

<!-- 版本号 -->

<version>1.0.0</version>

<!--打包方式

    默认:jar

    jar指的是普通的java项目打包方式! 项目打成jar包!

    war指的是web项目打包方式!项目打成war包!

    pom不会讲项目打包!这个项目作为父工程,被其他工程聚合或者继承!后面会讲解两个概念

-->

<packaging>jar/pom/war</packaging>

依赖管理和添加:

​
<!--

   通过编写依赖jar包的gav必要属性,引入第三方依赖!

   scope属性是可选的,可以指定依赖生效范围!

   依赖信息查询方式:

      1. maven仓库信息官网 https://mvnrepository.com/

      2. maven search插件搜索

 -->

<dependencies>

    <!-- 引入具体的依赖包 -->

    <dependency>

        <groupId>log4j</groupId>

        <artifactId>log4j</artifactId>

        <version>1.2.17</version>

        <!--

            生效范围

            - compile :main目录 test目录   打包打包 [默认]

            - provided:main目录 test目录  Servlet

            - runtime: 打包运行                    MySQL

            - test:            test目录                      junit

         -->

        <scope>runtime</scope>

    </dependency>

</dependencies>

​

依赖版本提取和维护:

<!--声明版本-->

<properties>

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

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



  <!--命名随便,内部制定版本号即可!-->

  <junit.version>4.11</junit.version>

  <!-- 也可以通过 maven规定的固定的key,配置maven的参数!如下配置编码格式!-->

  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>



  </properties>



<dependencies>

  <dependency>

    <groupId>junit</groupId>

    <artifactId>junit</artifactId>

    <!--引用properties声明版本 -->

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

  </dependency>

</dependencies>

六、依赖传递和依赖冲突(不用管,就是一种原理说明,总之用maven导入总是对的)

依赖传递指的是当一个模块或库 A 依赖于另一个模块或库 B,而 B 又依赖于模块或库 C,那么 A 会间接依赖于 C。这种依赖传递结构可以形成一个依赖树。

当我们引入一个库或框架时,构建工具(如 Maven、Gradle)会自动解析和加载其所有的直接和间接依赖,确保这些依赖都可用。

依赖传递的作用是:

1. 减少重复依赖:当多个项目依赖同一个库时,Maven 可以自动下载并且只下载一次该库。这样可以减少项目的构建时间和磁盘空间。

2. 自动管理依赖: Maven 可以自动管理依赖项,使用依赖传递,简化了依赖项的管理,使项目构建更加可靠和一致。

3. 确保依赖版本正确性:通过依赖传递的依赖,之间都不会存在版本兼容性问题,确实依赖的版本正确性!

当直接引用或者间接引用出现了相同的jar包! 这时呢,一个项目就会出现相同的重复jar包,这就算作冲突!依赖冲突避免出现重复依赖,并且终止依赖传递!

maven自动解决依赖冲突问题能力,会按照自己的原则,进行重复依赖选择。同时也提供了手动解决的冲突的方式,不过不推荐!

解决依赖冲突(如何选择重复依赖)方式:

 1. 自动选择原则

      - 短路优先原则(第一原则)

          A—>B—>C—>D—>E—>X(version 0.0.1)

          A—>F—>X(version 0.0.2)

         则A依赖于X(version 0.0.2)。

     - 依赖路径长度相同情况下,则“先声明优先”(第二原则)

          A—>E—>X(version 0.0.1)

          A—>F—>X(version 0.0.2)

          在<depencies></depencies>中,先声明的,路径相同,会优先选择!

七、依赖导入失败场景和解决方案

在使用 Maven 构建项目时,可能会发生依赖项下载错误的情况,主要原因有以下几种:

1. 下载依赖时出现网络故障或仓库服务器宕机等原因,导致无法连接至 Maven 仓库,从而无法下载依赖。

2.  依赖项的版本号或配置文件中的版本号错误,或者依赖项没有正确定义,导致 Maven 下载的依赖项与实际需要的不一致,从而引发错误。

3.  本地 Maven 仓库或缓存被污染或损坏,导致 Maven 无法正确地使用现有的依赖项,并且也无法重新下载!

解决方案:

1. 检查网络连接和 Maven 仓库服务器状态。

2. 确保依赖项的版本号与项目对应的版本号匹配,并检查 POM 文件中的依赖项是否正确。

3. 清除本地 Maven 仓库缓存(lastUpdated 文件),因为只要存在 lastupdated 缓存文件,刷新也不会重新下载。本地仓库中,根据依赖的 gav 属性依次向下查找文件夹,最终删除内部的文件,刷新重新下载即可!

例如: pom.xml依赖

<dependency>

  <groupId>com.alibaba</groupId>

  <artifactId>druid</artifactId>

  <version>1.2.8</version>

</dependency>

    文件:

    脚本使用:

八、构建概念

项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。

主动触发场景:

- 重新编译 : 编译不充分, 部分文件没有被编译!

- 打包 : 独立部署到外部服务器软件,打包部署

- 部署本地或者私服仓库 : maven工程加入到本地或者私服仓库,供其他工程使用

命令方式构建:

语法: mvn 构建命令  构建命令....

可视化方式构建:

构建命令周期:

构建生命周期可以理解成是一组固定构建命令的有序集合,触发周期后的命令,会自动触发周期前的命令!也是一种简化构建的思路!

- 清理周期:主要是对项目编译生成文件进行清理

    包含命令:clean

- 默认周期:定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分

    包含命令:compile - test - package - install / deploy

- 报告周期

    包含命令:site

    打包: mvn clean package

   本地仓库: mvn clean install

最佳使用方案:

打包: mvn clean package

重新编译: mvn clean compile

本地部署: mvn clean install

周期,命令和插件:

周期→包含若干命令→包含若干插件!

使用周期命令构建,简化构建过程!

最终进行构建的是插件!

插件配置(解决war包版本和JDK版本不兼容的问题):

<build>

   <!-- jdk17 和 war包版本插件不匹配 -->

    <plugins>

        <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-war-plugin</artifactId>

            <version>3.2.2</version>

        </plugin>

    </plugins>

</build>

九、继承与聚合

Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。

继承作用:

作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理!

它的背景是:

对一个比较大型的项目进行了模块拆分。

一个 project 下面,创建了很多个 module。

每一个 module 都需要配置自己的依赖信息。

它背后的需求是:

多个模块要使用同一个框架,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一管理。

使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。

1、继承语法

父工程:

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

<artifactId>pro03-maven-parent</artifactId>

<version>1.0-SNAPSHOT</version>

<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->

<packaging>pom</packaging>

子工程:

<!-- 使用parent标签指定当前工程的父工程 -->

<parent>

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

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

  <artifactId>pro03-maven-parent</artifactId>

  <version>1.0-SNAPSHOT</version>

</parent>



<!-- 子工程的坐标 -->

<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->

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

<artifactId>pro04-maven-module</artifactId>

<!-- <version>1.0-SNAPSHOT</version> -->

2、父工程依赖统一管理

父工程声明版本:

<!-- 使用dependencyManagement标签配置对依赖的管理 -->

<!-- 被管理的依赖并没有真正被引入到工程 -->

<dependencyManagement>

  <dependencies>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-core</artifactId>

      <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-beans</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-expression</artifactId>

      <version>4.0.0.RELEASE</version>

    </dependency>

    <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-aop</artifactId>

      <version>4.0.0.RELEASE</version>

    </dependency>

  </dependencies>

</dependencyManagement>

子工程引用版本

<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。  -->

<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->

<!-- 具体来说是由父工程的dependencyManagement来决定。 -->

<dependencies>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-core</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-beans</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-expression</artifactId>

  </dependency>

  <dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-aop</artifactId>

  </dependency>

</dependencies>

3、聚合概念

Maven 聚合是指将多个项目组织到一个父级项目中,通过触发父工程的构建,统一按顺序触发子工程构建的过程!!

4、聚合作用

1)统一管理子项目构建:通过聚合,可以将多个子项目组织在一起,方便管理和维护。

2)优化构建顺序:通过聚合,可以对多个项目进行顺序控制,避免出现构建依赖混乱导致构建失败的情况。

5、聚合语法

父项目中包含的子项目列表。

<project>

  <groupId>com.example</groupId>

  <artifactId>parent-project</artifactId>

  <packaging>pom</packaging>

  <version>1.0.0</version>



  <modules>

    <module>child-project1</module>

    <module>child-project2</module>

  </modules>

</project>

6、聚合演示

通过触发父工程构建命令、引发所有子模块构建!产生反应堆!

十、总结

核心点

掌握目标

安装

maven安装、环境变量、maven配置文件修改

工程创建

gavp属性理解、JavaSE/EE工程创建、项目结构

依赖管理

依赖添加、依赖传递、版本提取、导入依赖错误解决

构建管理

构建过程、构建场景、构建周期等

继承和聚合

理解继承和聚合作用、继承语法和实践、聚合语法和实践

以上,maven学习笔记总结

祝好。

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

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

相关文章

模电笔记。。。。

模电 2.8 蜂鸣器 按照蜂鸣器驱动方式分为有源蜂鸣器和无源蜂鸣器 有源的有自己的震荡电路&#xff0c;无源的要写代码控制。 里面有个线圈&#xff0c;相当于电感&#xff0c;储能&#xff0c;通直隔交。 蜂鸣器的参数&#xff1a;额定电压&#xff0c;工作电压&#xff0…

vue3递归组件---树形组件

第一种方式&#xff0c;直接自己调用自己 Tree.vue <template><div class"tree"><div v-for"(item, index) in data" :key"item.name">每一层 {{ item.name }}<Tree v-if"item?.children?.length" :dataitem…

IT外包驻场加速企业IT创新

随着科技的快速发展&#xff0c;企业在追求创新和应用IT技术方面面临挑战。IT外包驻场服务成为许多企业的选择&#xff0c;助力企业实现快速、高效的IT项目实施和应用。 IT外包驻场服务的主要目标是帮助企业在IT创新方面取得突破。这种服务模式不仅仅是提供技术支持&#xff0c…

java 之 继承与多态的详细介绍

文章目录 类的继承1. 基本语法2. 继承的特点3. 方法的重写&#xff08;方法的覆盖&#xff09;super 关键字1. 调用父类的构造器2. 访问父类的成员变量3. 调用父类的方法4. 在构造器中调用父类方法封装性以及访问修饰符抽象方法1. 声明抽象类2. 抽象方法3. 继承抽象类4. 抽象类…

继承与派生(2)

1.派生类的权限&#xff1a;派生类的成员函数可以访问基类的public和protected类型的成员&#xff0c;而派生类的对象只能访问public类型的成员 2.创建顺序&#xff08;先创造后析构&#xff09;&#xff1a;基类函数&#xff0c;派生类函数&#xff0c;组合类函数 类的组合按…

12v转48v升压电源芯片:参数、特点及应用领域

12v转48v升压电源芯片&#xff1a;参数、特点及应用领域 随着电子设备的日益普及&#xff0c;电源芯片的需求也在不断增长。今天我们将介绍一款具有广泛应用前景的升压电源芯片——12v转48v升压电源芯片。该芯片具有宽输入电压范围、高效率、固定工作频率等特点&#xff0c;适…

ShardingSphere 使用distinct或者GROUP BY 报类强转的错

ShardingSphere 使用distinct或者GROUP BY 报错 distinct 使用sharding-sphere分表后 对于使用distinct 会报错 类型对象属性转化异常 &#xff0c;但是去掉DISTINCT后 成功运行 无报错 返回结果正常 但是没有了去重 SELECT DISTINCTlog.* FROMwork_log log,work_log_visi…

网络运维与网络安全 学习笔记2023.12.1

网络运维与网络安全 学习笔记 第三十二天 今日目标 ACL原理与类型、基本ACL配置、高级ACL配置 高级ACL之ICMP、高级ACL之telnet ACL原理与类型 项目背景 为了企业的业务安全&#xff0c;要求不同部门对服务器有不同的权限 PC1不能访问Server PC2允许访问Server 允许其他所…

【C语言】网络字节序和主机字节序

网络字节序和主机字节序是计算机中字节的两种排序方式&#xff0c;它们主要用于解决不同计算机之间数据通信的问题。 一、网络字节序 也被称为大端字节序&#xff0c;是一种标准的字节序。在网络通信中&#xff0c;如果两台主机的字节序不同&#xff0c;可能会导致数据解释的二…

使用命令行移除VSAN中故障磁盘

原创作者&#xff1a;运维工程师 谢晋 使用命令行移除VSAN中故障磁盘 前提故障盘移除 前提 客户有套VSAN环境内有一台服务器的磁盘组出现了一块故障的数据盘&#xff0c;但该盘已经处于完全掉线状态&#xff0c;无法进行正常移除。如下图&#xff1a; 如果遇到这种情况&am…

电子眼+无人机构建平安城市视频防控监控方案

电子眼&#xff08;也称为监控摄像机&#xff09;可以通过安装在城市的不同角落&#xff0c;实时监控城市的各个地方。它们可以用于监测交通违法行为、监控公共场所的安全以及实时监测特定区域的活动情况。通过电子眼的应用&#xff0c;可以帮助警方及时发现并响应各类安全事件…

Linux文件系统与基础IO

文章目录 1 C文件接口1.1 fopen1.2 fwrite、fread、rewind、fclose 2 文件系统调用2.1 open2.1.1 参数2&#xff1a;flags2.1.2 参数3&#xff1a;mode2.1.3 返回值——file descriptor 2.2 write2.3 read2.4 close 3 文件的本质3.1 struct file3.2 一个进程如何与多个文件相关…

倒计时模块复习

经典回顾倒计时 倒计时的基本布局介绍。 一个内容区域和一个输入区域&#xff0c;内容区域进行划分 直接使用flex布局会更快一点。 js代码 我们利用一下模块化思想&#xff0c;直接把获得时间这个功能写成一个函数。方便后续的调用 function getTime() {const date new Date…

使用pytorch查看中间层特征矩阵以及卷积核参数

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 1和4是之前讲过的alexnet和resnet模型 2是分析中间层特征矩阵的脚本 3是查看卷积核参数的脚本 1设置预处理方法 和图像训练的时候用的预处理方法保持一致 2实例化模型 3载入之前的模型参数 4载入…

智能优化算法应用:基于驾驶训练算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于驾驶训练算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于驾驶训练算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.驾驶训练算法4.实验参数设定5.算法结果6.参考…

带大家做一个,易上手的家常辣子鸡

先从冰箱拿出鸡肉解冻 拿小半根葱 去掉最外面一层皮 切成小段 最备好 花椒 干辣椒 准备四五个大料 起锅烧油 这道菜需要放其他菜两到三倍的油 油温上来之后 放入干辣椒和花椒进行翻炒 等它们都烧黑之后捞出来 这样 辣味就留在油里面了 然后 倒入鸡肉 葱段 大料 然后 倒…

从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能

ScreenCap---Version&#xff1a;001 说明 从0到1&#xff0c;手把手带你开发windows端的截屏软件ScreenCap 当前版本&#xff1a;ScreenCap---001 支持全屏截图 支持鼠标拖动截图区域 支持拖拽截图 支持保存全屏截图 支持另存截图到其他位置 GitHub 仓库master下的Scr…

如何排查rpc mount export: RPC: Timed out问题

文章目录 问题描述查看nfs服务是否运行正常如果以上都通过,尝试下面步骤 问题描述 我们将讨论您在 NFS 客户端上看到的 NFS 错误之一的故障排除。在尝试与 NFS 相关的命令时可以看到此错误&#xff0c;如下所示&#xff1a; 通常&#xff0c;当您看到此错误时&#xff0c;您也…

整合消息队列RabbitMQ

为什么使用消息队列MQ&#xff1f; 因为使用消息队列有多个好处&#xff1a;可以实现系统服务的解耦、异步和削峰&#xff1a; 异步通信&#xff1a;消息队列提供了一种异步通信的方式&#xff0c;发送方可以将消息发送到队列中&#xff0c;然后继续执行其他任务&#xff0c;…

vue使用甘特图dhtmlxgantt + gantt.addTaskLayer

效果图&#xff1a; 甘特图 官网地址 gantt安装与使用 vue版---部分功能收费 安装gantt 或 引入文件 npm install dhtmlx-gantt -save或import gantt from "/public/static/dhtmlxgantt/dhtmlxgantt.js"; import "/public/static/dhtmlxgantt/locale/local…