maven使用

一. Maven仓库和坐标

1.1Maven的仓库
仓库名称作用
本地仓库相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找。
中央仓库仓库中jar由专业团队(maven团队)统一维护。中央仓库的地址:http://repo1.maven.org/maven2/
远程仓库在公司内部架设一台私服,其它公司架设一台仓库,对外公开。
1.2 Maven的坐标

​ Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能才其它项目中进行依赖引用。坐标的定义元素如下:

  • groupId:项目组织唯一的标识符,实际对应JAVA的包的结构 (一般写公司的组织名称 eg:com.itheima,com.alibaba)
  • artifactId: 项目的名称
  • version:定义项目的当前版本

依赖范围

在这里插入图片描述

  • compile 编译、测试、运行,A在编译时依赖B,并且在测试和运行时也依赖

    例如:strus-core、spring-beans, C3P0,Druid。打到war包或jar包

  • provided 编译、和测试有效,A在编译和测试时需要B

    例如:servlet-api就是编译和测试有用,在运行时不用(tomcat容器已提供)

    不会打到war

  • runtime:测试运行有效,

    例如:jdbc驱动包 ,在开发代码中针对java的jdbc接口开发,编译不用

    在运行和测试时需要通过jdbc驱动包(mysql驱动)连接数据库,需要的

    会打到war

  • test:只是测试有效,只在单元测试类中用

    例如:junit

    不会打到war

  • 按照依赖强度,由强到弱来排序:(理解)

    compile> provided> runtime> test

小结
  • compile 编译、测试、打包运行部署 有效 【默认】
  • provided 编译, 测试 有效. 打包运行部署 无效
  • runtime 测试、打包运行部署 有效 编译无效
  • test 只是测试有效,只在单元测试类中用

Servlet,JSP 这类jar 需要加上provided , 因为部署到Tomcat里面. tomcat里面有, 如果没有加上provided , 可能会导致jar 冲突

单元测试的 建议加上test

二. 配置本地仓库与Maven环境

1.1配置本地仓库

在maven的安装目录中conf/ settings.xml文件,在这里配置本地仓库

在这里插入图片描述

  • 示例代码
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
 <localRepository>E:/source/04_Maven/repository_pinyougou</localRepository>
1.2配置Maven
  • 配置Maven

在这里插入图片描述

  • 配置参数(创建工程不需要联网,解决创建慢的问题) -DarchetypeCatalog=internal

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fD1zP5Pz-1618148193979)(img/tu_8.png)]

Jar包自动下载失败

当下载jar的时候,如果断网,或者连接超时的时候,会自动在文件夹中创建一个名为*.lastupdate的文件,当有了这个文件之后,当你再次联网的时候,那么该文件不会再自动联网,必须手动删除,才能正常下载使用

使用工具:

在这里插入图片描述

如何使用?打开工具

在这里插入图片描述

双击运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZbCA0Vm-1618155025743)(./img/106.png)]

Maven项目,如果正在下载一个jar,但是突然断网,此时,就会产生一个m2e-lastUpdated.,别指望下次上网就会自动下载,必须手动删除该文件,然后再进行下载。

Maven私服的使用

将项目发布到私服

​ 企业中多个团队协作开发通常会将一些公用的组件、开发模块等发布到私服供其它团队或模块开发人员使用
​ 本例子假设多团队分别开发 . 某个团队开发完在common_utils, 将 common_utils发布到私服供 其它团队使用.

1.配置

​ 第一步: 需要在客户端即部署 common_utils工程的电脑上配置 maven环境,并修改 settings.xml文件(Maven配置文件), 配置连接私服的用户和密码 。此用户名和密码用于私服校验,因为私服需要知道上传的账号和密码是否和私服中的账号和密码一致 (配置到标签下)

<server>
    <id>releases</id>
    <username>admin</username>
    <password>admin123</password>
</server>
<server>
    <id>snapshots</id>
    <username>admin</username>
    <password>admin123</password>
</server>

releases: 连接发布版本项目仓库
snapshots: 连接测试版本项目仓库

在这里插入图片描述

​ 第二步: 在需要发布配置项目 pom.xml . 配置私服仓库的地址,本公司的自己的 jar 包会上传到私服的宿主仓库,根据工程的版本号决定上传到哪个宿主仓库,如果版本为 release 则上传到私服的 release 仓库,如果版本为snapshot 则上传到私服的 snapshot 仓库 .

<distributionManagement>
    <repository>
        <id>releases</id>
        <url>http://localhost:8081/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>
  • 注意: pom.xml 这里 和 settings.xml 配置 对应!
2.测试

1、 首先启动 nexus
2、 对 common_utils工程执行 deploy 命令

​ 根据本项目pom.xml中version定义决定发布到哪个仓库,如果version定义为snapshot,执行 deploy后查看 nexus 的 snapshot仓库, 如果 version定义为 release则项目将发布到 nexus的 release 仓库,本项目将发布到 snapshot 仓库:

在这里插入图片描述

从私服下载 jar 包

​没有配置 nexus 之前,如果本地仓库没有,去中央仓库下载,通常在企业中会在局域网内部署一台私服服务器, 有了私服本地项目首先去本地仓库找 jar,如果没有找到则连接私服从私服下载 jar 包,如果私服没有 jar 包私服同时作为代理服务器从中央仓库下载 jar 包,这样做的好处是一方面由私服对公司项目的依赖 jar 包统一管理,一方面提高下载速度, 项目连接私服下载 jar 包的速度要比项目连接中央仓库的速度快的多。

本例子测试从私服下载 common_utils工程 jar 包

  • 1.在 setting.xml 中配置仓库

​在客户端的 maven里面的setting.xml 中配置私服的仓库,由于 setting.xml 中没有 repositories 的配置标签需要使用 profile 定义仓库。(配置在<profiles>标签下)

<profile>
    <!--profile 的 id-->
    <id>dev</id>
    <repositories>
        <repository>
        <!--仓库 id, repositories 可以配置多个仓库,保证 id 不重复-->
        <id>nexus</id>
        <!--仓库地址,即 nexus 仓库组的地址-->
        <url>http://localhost:8081/nexus/content/groups/public/</url>
        <!--是否下载 releases 构件-->
        <releases>
            <enabled>true</enabled>
        </releases>
        <!--是否下载 snapshots 构件-->
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    </repositories>
    <pluginRepositories>
        <!-- 插件仓库, maven 的运行依赖插件,也需要从私服下载插件 -->
        <pluginRepository>
            <!-- 插件仓库的 id 不允许重复,如果重复后边配置会覆盖前边 -->
            <id>public</id>
            <name>Public Repositories</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
        </pluginRepository>
    </pluginRepositories>
</profile>
  • 2.使用 profile 定义仓库需要激活才可生效。
<activeProfiles>
	<activeProfile>dev</activeProfile>
</activeProfiles>
测试从私服下载 jar 包
  • 删掉本地仓库的common_utils

  • 编译依赖common_utils的工程

在这里插入图片描述

  • 出现如下日志

在这里插入图片描述

把第三方 jar 包放入本地仓库和私服
1.导入本地库
  • 随便找一个 jar 包测试, 可以先 CMD进入到 jar 包所在位置,运行
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dfile=fastjson-1.1.37.jar -Dpackaging=jar


mvn install:install-file -DgroupId=commons-beanutils -DartifactId=commons-beanutils -Dversion=1.9.2 -Dfile=commons-beanutils-1.9.2.jar -Dpackaging=jar


mvn deploy:deploy-file -DgroupId=commons-beanutils -DartifactId=commons-beanutils -Dversion=1.9.2 -Dpackaging=jar -Dfile=commons-beanutils-1.9.2.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty

在这里插入图片描述

在这里插入图片描述

2.导入私服

需要在 maven 软件的核心配置文件 settings.xml 中配置第三方仓库的 server 信息

<server>
    <id>thirdparty</id>
    <username>admin</username>
    <password>admin123</password>
</server>

才能执行一下命令

mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=fastjson-1.1.37.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty

在这里插入图片描述

在这里插入图片描述

3.参数说明

DgroupId 和 DartifactId 构成了该 jar 包在 pom.xml 的坐标,项目就是依靠这两个属性定位。自己起名字也行。

Dfile 表示需要上传的 jar 包的绝对路径。

Durl 私服上仓库的位置,打开 nexus——>repositories 菜单,可以看到该路径。

DrepositoryId 服务器的表示 id,在 nexus 的 configuration 可以看到。

Dversion 表示版本信息。

关于 jar 包准确的版本:

​ 包的名字上一般会带版本号,如果没有那可以解压该包,会发现一个叫 MANIFEST.MF 的文件

​ 这个文件就有描述该包的版本信息。

​ 比如 Specification-Version: 2.2 可以知道该包的版本了。

​ 上传成功后,在 nexus 界面点击 3rd party 仓库可以看到这包。

小结

有些jar中央仓库没有(eg:oracle驱动), 从官网/网络上下载下来, 安装到本地仓库. 我们的Maven项目就可以使用了

三.使用IDEA创建Maven工程

3.1.1创建java工程

在这里插入图片描述

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nabmLTMG-1618148429976)(img\11.png)]

3.1.2 java工程目录结构
  • 需要main/java文件夹变成 源码的目录(存放java源码)

在这里插入图片描述

  • 需要test/java文件夹变成 测试源码的目录(存放单元测试)

在这里插入图片描述

  • 创建resources目录, 变成资源的目录

在这里插入图片描述

  • 整体结构

在这里插入图片描述

3.1.3 编写Hello World!

在这里插入图片描述

3.2.1 创建javaweb工程
  • 创建javaweb工程与创建javase工程类似,但在选择Maven骨架时,选择maven-archetype-webapp即可:

在这里插入图片描述

  • 创建好的javaweb工程如下:

在这里插入图片描述

  • 所以,要手动创建一个java目录用于编写java代码:

在这里插入图片描述

  • 还要将java目录添加为Source Root:

在这里插入图片描述

3.2.2 发布javaweb工程

在这里插入图片描述

  • 浏览器访问效果

在这里插入图片描述

  • web工程结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jXVPj9DL-1618148430024)(img/image-20191224105359670.png)]

3.3.1创建java工程不使用骨架创建工程
1.不使用骨架创建javase项目
  • 第一步

在这里插入图片描述

  • 第二步

在这里插入图片描述

  • 第三步

在这里插入图片描述

  • 第四步

在这里插入图片描述

2.不使用骨架创建javaweb项目
  • 第一步

在这里插入图片描述

  • 第二步

在这里插入图片描述

  • 第三步

在这里插入图片描述

  • 第四步, 在pom文件里面添加标签packaging

在这里插入图片描述

  • 第五步

在这里插入图片描述

  • 第六步
    在这里插入图片描述

四. maven常用的命令与插件

在这里插入图片描述

  1. maven clean。对项目进行清理,清理的过程中会删除删除target目录下编译的内容。
  2. maven compile。编译项目源代码。
  3. maven test。对项目的运行测试。
  4. maven package。可以打包后的文件存放到项目的 target 目录下打包好的文件通常都是编译后生成的class文件
    在这里插入图片描述
  • 如果是JavaSe的项目,打包成jar包
  • 如果是JavaWeb的项目,打包成war包
  1. maven install。在本地仓库生成仓库的安装包可以供其他项目引用,同时打包后的文件存放到项目的 target 目录下。
    在这里插入图片描述
    安装完毕后,在本地仓库中可以找到itheima_javase_demo的信息
    在这里插入图片描述

  2. 当然还有一些常见的插件,插件也有自己的命名

  • tomcat 7的插件-》tomcat7:run
  • spring-boot-maven-plugin->mvn spring-boot:run

maven插件可以完成一些特定的功能。例如,集成jdk插件可以方便的修改项目的编译环境;集成tomcat插件后,无需安装tomcat服务器就可以运行tomcat进行项目的发布与测试。在pom.xml中通过plugin标签引入maven的功能插件。

1 .JDK编译版本的插件

    <!--jdk编译插件-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>utf-8</encoding>
        </configuration>
      </plugin>

2. Tomcat7服务端的插件

  • 添加tomcat7插件
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <configuration>
            <!-- 指定端口 -->
            <port>82</port>
            <!-- 请求路径 -->
            <path>/</path>
        </configuration>
    </plugin>

注意: Maven的中央仓库中只有Tomcat7.X版本的插件,而之前我们使用的是8.X的版本,如果想使Tomcat8.X的插件可以去其他第三方仓库进行寻找,或者使用IDEA集成外部Tomcat8极其以上版本,进行项目的发布。

五. maven profile

公司项目会有多个环境,maven profile可以让我们在多个环境之间切换

使用分两步:

定义profile
执行mvn命令的时候指定环境或者通过pom文件里的activation属性

1、定义
image-20200429140443852

2、使用

  • 命令方式

mvn clean package -Ptest

  • pom文件里的activation属性方式

image-20200429140638740

六. 工程拆分

回顾之前项目开发:

在这里插入图片描述

工程拆分后的开发:所有的service和dao的代码都在一起,1:增强程序的通用性,2:降低了代码的耦合性

在这里插入图片描述

1:聚合和继承
2:准备数据库环境
3:ssm_parent(父工程)
4:ssm_model(子工程)
5:ssm_dao(子工程)
6:ssm_service(子工程)
7:ssm_web(子工程)
8:测试(工程发布tomcat)

聚合(多模块)和继承

继承和聚合结构图:

在这里插入图片描述

特点1(继承):

ssm_parent父工程:存放项目的所有jar包

ssm_web和ssm_service和ssm_dao有选择的继承jar包,并在自己的工程中使用。这样可以消除jar包重复,并锁定版本

特点2(聚合):

​ ssm_web依赖于ssm_service,ssm_service依赖于ssm_dao,我们启动ssm_web,便可以访问我们的程序。

执行安装的时候,执行ssm_parent,就可以将所有的子工程全部进行安装。

理解继承和聚合总结:

通常继承和聚合同时使用。

· 何为继承?

​继承是为了消除重复,如果将 dao、 service、 web 分开创建独立的工程则每个工程的 pom.xml 文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本的等,可以将这些重复的 配置提取出来在父工程的 pom.xml 中定义。

· 何为聚合?

​ 项目中运行整个工程需要将每个模块聚合在 一起运行,比如: dao、 service、 web 三个工程最终会打一个独立的 war 运行。

在这里插入图片描述

  • 聚合可以一起构建多个module,pom.xml中的体现主要是<modules和<module
  • 继承的特性是指建立一个父模块,我们项目中的多个模块都做为该模块的子模块,将各个子模块相同的依赖和插件配置提取出来,从而简化配置文件父模块的打包方式必须为pom,否则无法构建项目。pom .xml中的体现就是<parent结点
    在这里插入图片描述
    在这里插入图片描述

创建项目

在这里插入图片描述

发布项目

【路径】

1:测试打包package、安装install(演示maven聚合)

2:发布到外部tomcat

3:使用maven的tomcat插件发布

1. 方式一:tomcat插件发布(配置父工程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9poQMNU0-1618153667694)(img\035.png)]

使用http://localhost:18081/items/list测试:

在这里插入图片描述

2. 方式二:tomcat插件发布(配置web工程

在父工程打包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8qCJIsjy-1618153667698)(./img/030.png)]

所有的子工程都会被打包(package)。这就是“聚合”的作用。

也可以同时安装(install),同时部署(deploy)

在这里插入图片描述

【小结】

使用maven内置的tomcat插件的时候 :

第一种:配置D:\ideaProjects\ssm_parent:parent是有聚合的功能,不需要将ssm_parent,ssm_model,ssm_dao,ssm_service安装到本地仓库。

第二种:配置D:\ideaProjects\ssm_parent\ssm_web:需要将ssm_parent,ssm_model,ssm_dao,ssm_service安装到本地仓库

3. 方式三:发布到外部tomcat

在这里插入图片描述

使用http://localhost:18081/items/list测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AZosbiNJ-1618153667705)(./img/034.png)]

【小结】

当使用外部tomcat进行开发的时候,不需要将ssm_parent,ssm_model,ssm_dao,ssm_service安装到本地仓库

【小结】

1:聚合和继承

2:准备数据库环境

3:ssm_parent(父工程)

4:ssm_model(子工程)

5:ssm_dao(子工程)

6:ssm_service(子工程)

7:ssm_web(子工程)

8:测试(工程发布tomcat)

七.maven排除jar冲突

真实项目中,出现1个项目存在多个同种jar包的时候,需要我们进行解决maven的jar包冲突问题(异常:Class not found、Method not found等)

解决jar冲突比较容易,通过在<dependency下配置<exclusions

方式一:看看日志提示,大概确认哪个jar冲突引起了问题,在找出哪些jar包中依赖了它,可以通过idea的Show Dependencies去搜索,然后进行排除

方式二:可以通过maven-enforcer-plugin插件

1.1、show Dependencies界面,可以直接排除

在这里插入图片描述

在这里插入图片描述

1.2解决依赖冲突:maven-enforcer-plugin插件
<project>
  ...
   <build>
     <plugins>
      ...
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>
         <version>1.4.1</version>
         <executions>
           <execution>
             <id>enforce</id>
             <configuration>
               <rules>
                 <dependencyConvergence/>
               </rules>
             </configuration>
             <goals>
               <goal>enforce</goal>
             </goals>
           </execution>
         </executions>
       </plugin>
      ...
     </plugins>
   </build>
  ...
 </project>

执行命令,控制台会打印冲突信息
在这里插入图片描述

2.1. 第一声明优先原则

哪个jar包在靠上的位置,这个jar包就是先声明的,先声明的jar包下的依赖包,可以优先引入项目中

​ 我们在pom.xml中引入如下坐标,分别是spring中不同的版本。

<?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>

    <groupId>com.itheima</groupId>
    <artifactId>maven_day01_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>jar</packaging>

    <!--导入相关依赖包-->
    <dependencies>
        <!--引入spring-context,它所以来的包都会导入进来-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
    </dependencies>

</project>

我们在控制面板的maven面板,点击查看依赖关系按钮,看到了包和包之间的依赖关系存在冲突,都使用了spring-core包,关系图如下:

在这里插入图片描述

我们再来看看他们依赖包的导入,发现导入的包却没有问题,包使用的都是5.0.2的版本。

在这里插入图片描述

我们把上面2个包的顺序调换后就变成了低版本的依赖导入。

在这里插入图片描述

2.2. 路径近者优先原则

直接依赖比传递依赖路径近,你那么最终进入项目的jar包会是路径近的直接依赖包。

直接依赖:项目中直接导入的jar包就是项目的直接依赖包。

传递依赖(间接依赖):项目中没有直接导入的jar包,可以通过中直接依赖包传递到项目中去。

修改jar包,直接引入依赖spring-core

<!--导入相关依赖包-->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.2.4.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>

    <!--引入直接依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.2.8.RELEASE</version>
    </dependency>
</dependencies>

此时优先引入的是直接依赖的引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ok9gDGNc-1618153013427)(./img/011.png)]

2.3. 直接排除法

问题:整合项目需要用到5的版本,引入4的版本,会不会出现异常(类没有找到,方法没有找到)

解决方案:?

当我们需要排除某个jar包的依赖时,在配置exclusions标签的时候,内部可以不写版本号。pom.xml依赖如下:

<!--导入相关依赖包-->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.2.4.RELEASE</version>
        <!--直接排除-->
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
</dependencies>

快捷操作:

在这里插入图片描述

依赖导入的jar包如下:

没有添加exclusion之前

在这里插入图片描述

添加exclusion之后,因为排除了4.2.4的版本spring-core的jar包

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值