MAVNE - 基本配置(一)

写在前面

工作中一直都在使用MAVEN,现通过对网上的博文和官方的文档的学习、验证以及实际项目的使用,对POM的配置和使用进行了总结归纳。

用户指南

  1. MAVEN官方的指南
  2. MAVEN描述符规范

项目对象模型(pom.xml)说明

<?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/maven-v4_0_0.xsd">
         
    <!--
    POM,(Project Object Model 项目对象模型)是Maven工程的基本工作单元,是一个XML文件,对应一个项目。
    POM 包含了项目的基本信息,用于描述项目如何构建/声明项目依赖等等
    groupId,组织的标识,通常是包路径: com.hadoopx.servicex
    artifactId,工程标识,通常是工程名
    -->

    <!-- 描述项目描述符遵循的版本。声明项目描述符遵循哪一个POM模型版本,相对于Maven2及Maven3来说它只能是4.0.0。-->
    <modelVersion>4.0.0</modelVersion>

    <!-- 父项目坐标配置。无论是否显示的定义父项目,所有POM都会继承自一个父POM。如果项目中没有规定某个元素的值,则会使用父项目中定义的值。包括Group ID、Artifact ID和Version都会被未定义的子项目继承。-->
    <parent>
        <!-- 父项目的构件标识符 -->
        <artifactId>kie-parent</artifactId>

        <!-- 父项目的全球唯一标识符 -->
        <groupId>org.kie</groupId>

        <!-- 父项目的版本 -->
        <version>7.61.0.Final</version>

        <!-- 父项目的pom.xml文件的相对路径,用于查找该项目的父项目的POM文件,默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在relativePath位置,然后在本地仓库,最后在远程仓库寻找父项目的pom。 -->
        <!-- <relativePath/>和<relativePath></relativePath>一样,都表示设置的pom.xml的路径为空,并不是默认值,所以该项目会从仓库中获取pom.xml,不从该项目的父项目的路径下获取-->
        <relativePath/>
    </parent>


    <!-- 构件的标识符。它和group ID一起唯一标识一个构件,换句话说你不能有两个不同的项目拥有同样的artifact ID和groupID。在某个特定的group ID下,artifact ID也必须是唯一的,构件是由项目产生的或供项目使用,MAVEN产生的构件包括:JARS、源码、二进制发布包和WARS等。-->
    <artifactId>drools-core</artifactId>

    <!-- 项目的全球唯一标识符。通常使用全限定的包名来和其他项目进行区分,并且构建时生成的路径也是由groupId生成,如org.drools生成的相对路径为:/org/drools -->
    <groupId>org.drools</groupId>

    <!-- 项目产生的构件类型,默认是jar。构件类型包括jar、war、ear、pom、bundle。 bundle = jar + OSGi metadata-->
    <!-- 在父级项目中的pom.xml文件使用的packaging配置一定为pom。父级的pom文件只用于项目的子模块的整合,在maven install时不会生成jar/war压缩包。 -->
    <!-- jar: 将所有java文件都进行编译形成.class文件,且按照原来的java文件层级结构放置,最终压缩为一个jar文件,供其他服务或者工程引用的时候一般打成jar包,当然可直接通过jar命令直接启动程序,如springboot的服务.
              将src/main/java和src/main/resources下的所有文件经打包,在打包的时候会自动生成MATA-INF文件夹,用于存储maven的pom信息和MANIFEST.MF文件
              传统JAR和SpringBoot的JAR的区别是:SpringBoot的JAR多了BOOT-INFO/lib目录,里面存放了该JAR包的依赖JAR文件
    -->
    <!-- war: 将所有java文件都进行编译形成.class文件,且按照原来的java文件层级结构放置,最终压缩为一个war文件,不同的是它会将项目中依赖的所有jar包都放在WEB-INF/lib这个文件夹下,常见于通过web容器部署的时候,如Tomcat
              一个WAR文件代表了一个Web应用程序,它可以包含 Servlet、HTML页面、Java类、图像文件,以及组成Web应用程序的其他资源,而不仅仅是类的归档文件
    -->
    <packaging>jar</packaging>

    <!-- 项目当前版本,格式为: 主版本.次版本.增量版本-限定版本号 -->
    <version>1.0.0-SNAPSHOT</version>

    <!-- 项目的名称 -->
    <name>mallx</name>

    <!-- 项目主页的URL -->
    <url>http://www.hadoopx.cn/mallx</url>

    <!-- 项目的详细描述 -->
    <description>一个基于SpringBoot的、包含小程序和后端管理的、开源的在线商城.</description>

    <!-- 项目构建环境的前提条件,在pom4.0中,唯一的首要条件是maven元素-->
    <prerequisites>
        <!--构建该项目或使用该插件所需要的Maven的最低版本-->
        <maven/>
    </prerequisites>

    <!-- 项目创建年份。四位数字,当产生版权信息时需要使用这个值。-->
    <inceptionYear/>

    <!-- 项目使用的问题管理系统相关信息(Redmine、Bugzilla、Jira、Scarab,或任何你喜欢的问题管理系统),主要用于和BUG管理系统对接-->
    <issueManagement>
        <!-- 问题管理系统的名字 -->
        <system>MALLX-JIRA</system>

        <!-- 问题管理系统的URL -->
        <url>http://mallx.jira.com</url>
    </issueManagement>

    <!-- 项目持续集成相关信息,用于和持续集成管理系统对接 -->
    <ciManagement>
        <!-- 项目持续集成的名字 -->
        <system/>
        <!-- 项目持续集成的URL -->
        <url/>
        <!-- 构建完成时需要通知的开发者/用户的配置项,包括信息和状态(错误/失败/成功/警告)-->
        <notifiers>
            <!-- 配置通知方式。当构建中断时,以该方式通知用户/开发者-->
            <notifier>
                <!-- 传送通知的途径 -->
                <type/>
                <!-- 发生错误时是否通知-->
                <sendOnError/>
                <!-- 构建失败时是否通知 -->
                <sendOnFailure/>
                <!-- 构建成功时是否通知 -->
                <sendOnSuccess/>
                <!-- 发生警告时是否通知 -->
                <sendOnWarning/>
                <!-- 通知发送到哪里 -->
                <address/>
                <!-- 其他扩展配置项 -->
                <configuration/>
            </notifier>
        </notifiers>
    </ciManagement>

    <!-- 项目相关邮件信息 -->
    <mailingLists>
        <!-- 该元素描述了项目相关的所有邮件列表  -->
        <mailingList>
            <!-- 邮件的名称 -->
            <name>MALLX-LIST</name>
            <!-- 发送邮件的地址或链接 -->
            <post>mallx@163.com</post>
            <!-- 订阅邮件的地址或链接 -->
            <subscribe>mallx-admin@163.com</subscribe>
            <!-- 取消订阅邮件的地址或链接 -->
            <unsubscribe>mallx-user@163.com</unsubscribe>
            <!-- 可以浏览邮件信息的URL -->
            <archive>http://mallx.com/admin/mallx/dev/</archive>
        </mailingList>
    </mailingLists>

    <!-- 项目开发者-committer相关信息 -->
    <developers>
        <!-- 某个项目开发者的信息 -->
        <developer>
            <!-- 项目开发者在SCM中的唯一标识符 -->
            <id>mallx001</id>
            <!-- 项目开发者的全名 -->
            <name>张三</name>
            <!-- 项目开发者的邮箱-->
            <email>zhangsan@163.com</email>
            <!-- 项目开发者主页的URL-->
            <url/>
            <!-- 项目开发者在项目中扮演的角色-->
            <roles>
                <role>Project Manager</role>
                <role>Architect</role>
            </roles>
            <!-- 项目开发者所属组织 -->
            <organization>dev</organization>
            <!-- 项目开发者所属组织的URL -->
            <organizationUrl>http://hi.mallx.com/zhangsan</organizationUrl>
            <!-- 项目开发者属性等 -->
            <properties>
                <dept>Yes</dept>
            </properties>
            <!-- 项目开发者所在时区,-11到12范围内的整数 -->
            <timezone>8</timezone>
        </developer>
    </developers>

    <!--项目贡献者-contributor列表相关信息-->
    <contributors>
        <contributor>
            <name/>
            <email/>
            <url/>
            <organization/>
            <organizationUrl/>
            <roles/>
            <timezone/>
            <properties/>
        </contributor>
    </contributors>

    <!-- 描述项目采用的开源协议是什么 -->
    <licenses>
        <!--描述了项目的License,用于生成项目的WEB站点的License页面 -->
        <license>
            <!-- License用于法律上的名称 -->
            <name>Apache License,Version 2.0</name>
            <!-- 官方的license正文页面的URL -->
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <!-- 项目分发的主要方式(repo-可以从Maven库下载;manual-用户必须手动下载和安装依赖)-->
            <distribution>repo</distribution>
            <!-- 关于license的补充信息 -->
            <comments>A business-friendly OSS license</comments>
        </license>
    </licenses>

    <!-- SCM(Source Control Management)描述项目代码库相关的配置信息 -->
    <scm>
        <!-- SCM的URL,该连接只读 -->
        <connection>scm:git:https://github.com:kiegroup/drools.git</connection>
        <!-- 给开发者使用的,类似connection元素,该连接不仅仅只读 -->
        <developerConnection>scm:git:git@github.com:kiegroup/drools.git</developerConnection>
        <!-- 当前代码的标签,在开发阶段默认为HEAD-->
        <tag></tag>
        <!-- 指向项目的可浏览SCM库的URL -->
        <url>https://github.com/kiegroup/drools</url>
    </scm>

    <!-- 项目所属组织相关信息-->
    <organization>
        <!-- 组织的全名 -->
        <name>KIE-GROUP</name>
        <!-- 组织主页的URL -->
        <url>https://www.drools.org/</url>
    </organization>

    <!-- 该项目包含的所有子模块
         <modules>标签可以整合子模块的编译顺序,将更加底层的模块放在更前面的位置
    -->
    <modules>
        <module>kie-memory-compiler</module>
        <module>drools-core-reflective</module>
        <module>drools-core-dynamic</module>
        <module>kie-test-util</module>
        <module>drools-core</module>
        <module>drools-ecj</module>
        <module>drools-compiler</module>
        <module>drools-mvel</module>
        <module>drools-legacy-test-util</module>
        <module>drools-serialization-protobuf</module>
        <module>drools-beliefs</module>
        <module>drools-traits</module>
        <module>drools-ruleunit</module>
        <module>drools-cdi</module>
        <module>drools-verifier</module>
        <module>drools-persistence</module>
        <module>drools-templates</module>
        <module>drools-decisiontables</module>
        <module>drools-examples</module>
        <module>kie-ci</module>
        <module>kie-ci-osgi</module>
        <module>drools-model</module>
        <module>kie-dmn</module>
        <module>kie-pmml</module>
        <module>kie-pmml-trusty</module>
        <module>drools-scorecards</module>
        <module>drools-examples-api</module>
        <module>drools-examples-cdi</module>
        <module>drools-workbench-models</module>
        <module>drools-test-coverage</module>
        <module>drools-scenario-simulation</module>
        <module>drools-metric</module>
        <module>drools-alphanetwork-compiler</module>
        <module>drools-engine</module>
        <module>drools-engine-classic</module>
        <module>drools-impact-analysis</module>
        <module>drools-retediagram</module>
    </modules>

    <!-- 构建项目需要的信息-->
    <build>
        <!-- 项目源码目录。当构建项目的时候,构建系统会编译目录里的源码,该路径是相对于pom.xml的相对路径。-->
        <sourceDirectory/>
        <!-- 项目脚本源码目录。该目录和源码目录不同,绝大多数情况下,该目录下的内容会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。-->
        <scriptSourceDirectory/>
        <!-- 项目单元测试使用的源码目录 -->
        <testSourceDirectory/>
        <!-- 被编译过的应用程序CLASS文件存放的目录 -->
        <outputDirectory/>
        <!-- 被编译过的测试程序CLASS文件存放的目录 -->
        <testOutputDirectory/>
        <!-- 项目构建扩展-->
        <extensions>
            <!-- 描述使用到的构建扩展 -->
            <extension>
                <!-- 构建扩展的groupId -->
                <groupId/>
                <!-- 构建扩展的artifactId -->
                <artifactId/>
                <!-- 构建扩展的版本 -->
                <version/>
            </extension>
        </extensions>
        <!-- 当项目没有规定目标(Maven2 叫做阶段)时的默认值 -->
        <defaultGoal/>
        <!-- 项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里 -->
        <resources>
            <!-- 这个元素描述了项目相关或测试相关的所有资源路径 -->
            <resource>
                <!-- 描述了资源的目标路径 -->
                <targetPath/>
                <!-- 是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。-->
                <filtering/>
                <!-- 存放资源的目录 -->
                <directory/>

                <!-- 包含文件的模式列表(构件中包含哪些文件),例如**/*.xml -->
                <includes/>

                <!-- 排除文件的模式列表(构件中不包含哪些文件),例如**/*.log -->
                <excludes/>
            </resource>
        </resources>
        <!-- 单元测试相关的所有资源路径 -->
        <testResources>
            <testResource>
                <targetPath/>
                <filtering/>
                <directory/>
                <includes/>
                <excludes/>
            </testResource>
        </testResources>
        <!-- 构建产生的文件存放的目录-->
        <directory/>
        <!-- 生成的构件的文件名,默认值是${artifactId}-${version} -->
        <finalName/>
        <!-- 当filtering开关打开时,使用到的过滤器属性文件列表 -->
        <filters/>
        <!-- 声明项目可以引用的插件信息。该插件配置项直到被引用时才会被解析或绑定到生命周期 -->
        <pluginManagement>
            <!-- 声明的插件列表 -->
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.1.1</version>
                    <!-- 是否从该插件下载Maven扩展(例如打包和类型处理器),由于性能原因,只有在真需要下载时,该元素才被设置成enabled。-->
                    <extensions/>
                    <!-- 在构建生命周期中执行一组目标的配置,每个目标可能有不同的配置。-->
                    <executions>
                        <!-- execution元素包含了插件执行需要的信息 -->
                        <execution>
                            <!-- 执行目标的标识符,用于标识构建过程中的目标,或者匹配继承过程中需要合并的执行目标 -->
                            <id>make-assembly</id>
                            <!-- 绑定了目标的构建生命周期阶段,如果省略,目标会被绑定到源数据里配置的默认阶段 -->
                            <phase>package</phase>
                            <!-- 配置的执行目标 -->
                            <goals>
                                <goal>single</goal>
                            </goals>
                            <!-- 配置是否被传播到子POM -->
                            <inherited/>
                            <!-- 作为DOM对象的配置 -->
                            <configuration/>
                        </execution>
                    </executions>
                    <!--项目引入插件所需要的额外依赖-->
                    <dependencies>
                        <dependency>
                        </dependency>
                    </dependencies>
                    <!-- 任何配置是否被传播到子项目 -->
                    <inherited/>
                    <!-- 作为DOM对象的配置 -->
                    <configuration>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

        <!--使用的插件列表-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId/>
                <artifactId/>
                <version/>
                <extensions/>
                <executions>
                    <execution>
                        <id/>
                        <phase/>
                        <goals/>
                        <inherited/>
                        <configuration/>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                    </dependency>
                </dependencies>
                <goals/>
                <inherited/>
                <configuration/>
            </plugin>
        </plugins>
    </build>

    <!-- 用于描述构建不同构件的配置 -->
    <profiles>
        <!-- 根据环境参数或命令行参数激活某个构建进行处理,可以配置多个profile -->
        <profile>
            <!-- 构建不同环境配置的唯一标识符,用于命令行激活,也用于在继承时合并具有相同标识符的profile。-->
            <id/>
            <!-- 用于指定激活方式,可以根据jdk环境,环境变量,文件的存在或缺失,自动触发profile的条件逻辑。
                 Activation是profile的开启钥匙,但并不是激活profile的唯一方式,在某些特定的环境中自动使用某些特定的值,这些环境通过activation元素指定。 -->
            <activation>
                <!-- 是否激活 -->
                <activeByDefault/>
                <!-- 通过JDK版本。当匹配的jdk被检测到时profile被激活,如,1.4激活JDK1.4、JDK1.4.0_2,而!1.4激活所有版本不是以1.4开头的JDK。-->
                <jdk/>
                <!-- 通过OS信息。当匹配的操作系统属性被检测到时profile被激活。os元素可以定义一些操作系统相关的属性。-->
                <os>
                    <!-- 激活profile的操作系统的名字 -->
                    <name>Windows10</name>
                    <!-- 激活profile的操作系统所属家族(如 'windows')-->
                    <family>Windows</family>
                    <!-- 激活profile的操作系统体系结构 -->
                    <arch>x86</arch>
                    <!-- 激活profile的操作系统版本 -->
                    <version>5.1.2600</version>
                </os>
                <!-- 通过通过系统环境变量。如果Maven检测到某一个属性(其值可以在POM中通过${名称}引用)其拥有对应的名称和值,Profile就会被激活。如果值
                字段是空的,那么存在属性名称字段就会激活profile,否则按区分大小写方式匹配属性值字段-->
                <property>
                    <!-- 激活profile的属性的名称 -->
                    <name>mavenVersion</name>
                    <!-- 激活profile的属性的值 -->
                    <value>2.0.3</value>
                </property>
                <!-- 通过文件的存在或缺失。 提供一个文件名通过检测该文件的存在或不存在来激活profile。-->
                <!-- missing检查文件是否存在,如果不存在则激活profile。-->
                <!-- exists则会检查文件是否存在,如果存在则激活profile。-->
                <file>
                    <!--如果指定的文件存在,则激活profile。-->
                    <exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</exists>
                    <!--如果指定的文件不存在,则激活profile。-->
                    <missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/</missing>
                </file>
            </activation>
            <!--构建项目所需要的信息-->
            <build>
                <defaultGoal/>
                <resources>
                    <resource>
                        <targetPath/>
                        <filtering/>
                        <directory/>
                        <includes/>
                        <excludes/>
                    </resource>
                </resources>
                <testResources>
                    <testResource>
                        <targetPath/>
                        <filtering/>
                        <directory/>
                        <includes/>
                        <excludes/>
                    </testResource>
                </testResources>
                <directory/>
                <finalName/>
                <filters/>
                <pluginManagement>
                    <plugins>
                        <plugin>
                            <groupId/>
                            <artifactId/>
                            <version/>
                            <extensions/>
                            <executions>
                                <execution>
                                    <id/>
                                    <phase/>
                                    <goals/>
                                    <inherited/>
                                    <configuration/>
                                </execution>
                            </executions>
                            <dependencies>
                                <dependency/>
                            </dependencies>
                            <goals/>
                            <inherited/>
                            <configuration/>
                        </plugin>
                    </plugins>
                </pluginManagement>
                <plugins>
                    <plugin>
                        <groupId/>
                        <artifactId/>
                        <version/>
                        <extensions/>
                        <executions>
                            <execution>
                                <id/>
                                <phase/>
                                <goals/>
                                <inherited/>
                                <configuration/>
                            </execution>
                        </executions>
                        <dependencies>
                            <dependency/>
                        </dependencies>
                        <goals/>
                        <inherited/>
                        <configuration/>
                    </plugin>
                </plugins>
            </build>
            <modules/>
            <repositories>
                <repository>
                    <releases>
                        <enabled/>
                        <updatePolicy/>
                        <checksumPolicy/>
                    </releases>
                    <snapshots>
                        <enabled/>
                        <updatePolicy/>
                        <checksumPolicy/>
                    </snapshots>
                    <id/>
                    <name/>
                    <url/>
                    <layout/>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <releases>
                        <enabled/>
                        <updatePolicy/>
                        <checksumPolicy/>
                    </releases>
                    <snapshots>
                        <enabled/>
                        <updatePolicy/>
                        <checksumPolicy/>
                    </snapshots>
                    <id/>
                    <name/>
                    <url/>
                    <layout/>
                </pluginRepository>
            </pluginRepositories>
            <dependencies>
                <dependency/>
            </dependencies>
            <reports/>
            <reporting/>
            <dependencyManagement>
                <dependencies>
                    <dependency/>
                </dependencies>
            </dependencyManagement>
            <distributionManagement>
            </distributionManagement>
            <properties/>
        </profile>
    </profiles>

    <!-- 依赖和扩展的远程仓库列表相关信息 -->
    <repositories>
        <!-- 需要连接到远程仓库的信息 -->
        <repository>
            <!-- 远程仓库唯一标识符。可以用来匹配在settings.xml文件里配置的远程仓库-->
            <id>jboss-public-repository-group</id>
            <!--远程仓库名称-->
            <name>JBoss Public Repository Group</name>
            <!--远程仓库URL,按protocol://hostname/path形式-->
            <url>https://repository.jboss.org/nexus/content/groups/public/</url>
            <!-- 用于定位和排序构件的仓库布局类型-可以是default(默认)或者legacy(遗留)。Maven 2.x为其仓库提供了一个默认的布局;然而,Maven 1.x有一种不同的布局,可以使用该元素指定布局是default(默认)还是legacy(遗留)。-->
            <layout>default</layout>
            <!-- 关于远程仓库里面发布版本下载的信息 -->
            <releases>
                <!-- true或者false表示该仓库是否开启下载某种类型构件(发布版,快照版) -->
                <enabled>true</enabled>
                <!-- 该元素指定更新发生的频率,Maven会比较本地POM和远程POM的时间戳。这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。 -->
                <updatePolicy>never</updatePolicy>
                <!-- 当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。 -->
                <checksumPolicy>ignore</checksumPolicy>
            </releases>
            <!-- 关于远程仓库里面快照版本下载的信息 -->
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>daily</updatePolicy>
                <checksumPolicy>ignore</checksumPolicy>
            </snapshots>
        </repository>
    </repositories>

    <!-- 发现插件的远程仓库列表,这些插件用于构建和报表 -->
    <pluginRepositories>
        <!-- 包含需要连接到远程插件仓库的信息. -->
        <pluginRepository>
        </pluginRepository>
    </pluginRepositories>


    <dependencies>
        <dependency>
            <!--依赖的group ID-->
            <groupId>org.apache.maven</groupId>
            <!--依赖的artifact ID-->
            <artifactId>maven-artifact</artifactId>
            <!--依赖的版本号。 在Maven 2.x里也可以配置成版本号的范围。-->
            <version>3.8.1</version>
            <!-- 依赖类型,默认类型是jar -->
            <type>jar</type>
            <!-- 依赖的分类器。用于在同一个POM,生成不同构建方式的构件。如果要构建两个单独的构件成JAR,一个使用Java 1.7编译器,另一个使用Java 1.8编译器,可以使用分类器生成两个单独的JAR构件。-->
            <classifier></classifier>
            <!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来,依赖范围包含以下几种:
            - compile:  作用在编译时,可以在生命周期的所有阶段使用,会随着项目一起发布;
            - provided: 类似于编译,但支持你期待JDK或者容器提供,类似于classpath,不会随着项目一起发布;使用默认或其他时,会将依赖的项目打成jar包放入本项目的Lib里。
                        比如:我们开发一个web应用,在编译时我们需要依赖servlet-api.jar,但是在运行时我们不需要该 jar包,因为这个jar 包已由web服务器提供,如果在打包时又被加入进去,那么就可能产生冲突。此时我们就可以使用 provided 进行范围修饰。
            - runtime:  作用在运行和测试时,不作用在编译时。在maven依赖中最常见的设置为runtime的依赖是JDBC,主要是由于jdbc中对驱动类的配置是采用反射的机制在配置文件中配置了classname
            - test:     作用在测试时,不作用在运行时,不会随项目发布,如junit;
            - system:   跟provided 相似,但是在系统中要以外部JAR包的形式提供,通过systemPath来取得,maven不会在repository查找它,不会随着项目一起发布;
            - systemPath: 仅用于范围为system,提供相应的路径
            - import:   只使用在<dependencyManagement>中,表示从其它的pom中导入dependency的配置,且仅用于type=pom的dependency
                        https://juejin.cn/post/6870758607659646983

            - optional: 当项目自身被依赖时,标注依赖是否传递,用于连续依赖时使用-->
            <scope>test</scope>

            <!-- 仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径,需要绝对路径而不是相对路径,推荐使用属性匹配绝对路径,例如${java.home}。-->
            <systemPath></systemPath>

            <!-- 当计算传递依赖时,从依赖构件列表里,列出被排除的依赖构件集,告诉maven你只依赖指定的项目,不依赖该项目的依赖.有时我们引入的依赖中可能会包含一些不想要的依赖包,我们想引入自己想要的,这时就要用到排除依赖了。使用 <exclusion> 的时候只需要指定 groupId 和 artifactId 就行了,并不需要 version,因为 groupId 和 artifactId 就可以定位某种类型的依赖。-->
            <exclusions>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
            <!-- 可选依赖。
                 如果你在项目B中把C依赖声明为可选true,那么如果项目A依赖于项目B,则项目A不会依赖项目C了,如果需要C的功能则需要,在项目A中显式的引用对项目C的依赖。
                 可选依赖可以阻断依赖的传递性。
            -->
            <optional>true</optional>
        </dependency>
    </dependencies>

    <!-- 不赞成使用. 现在Maven忽略该元素. -->
    <reports></reports>

    <!-- 用于描述使用报表插件产生报表的规范,是对生成的项目站点内容的再丰富,生成报表的命令和生成项目站点的命令一致(mvn site),所以当用户执行“mvn site”,这些报表就会运行,在页面导航栏能看到所有插件生成的报表的链接 -->
    <reporting>
        <!-- true,则表示网站不包括默认的报表,只包括"项目信息"菜单中的报表. 默认是false, 包含默认的报表-->
        <excludeDefaults/>
        <!-- 报表存放目录。默认值是${project.build.directory}/site。-->
        <outputDirectory/>
        <!-- 使用的报表插件相关的配置 -->
        <plugins>
            <plugin>
                <!--报表插件在仓库里的group ID-->
                <groupId/>
                <!--报表插件在仓库里的artifact ID-->
                <artifactId/>
                <!--被使用的报表插件的版本(或版本范围)-->
                <version/>
                <!--任何配置是否被传播到子项目-->
                <inherited/>
                <!--报表插件的配置-->
                <configuration/>
                <!--一组报表的多重规范,每个规范可能有不同的配置。一个规范(报表集)对应一个执行目标 。例如,有1,2,3,4,5,6,7,8,9个报表。1,2,5构成A报表集,对应一个执行目标。2,5,8构成B报表集,对应另一个执行目标-->
                <reportSets>
                    <!--表示报表的一个集合,以及产生该集合的配置-->
                    <reportSet>
                        <!--报表集合的唯一标识符 -->
                        <id/>
                        <!-- 报表相关的配置-->
                        <configuration/>
                        <!-- 配置是否被继承到子POMs -->
                        <inherited/>
                        <!-- 这个集合里使用到哪些报表 -->
                        <reports/>
                    </reportSet>
                </reportSets>
            </plugin>
        </plugins>
    </reporting>

    <!-- 这部分定义的依赖信息不会被立即解析,而是当子项目声明一个依赖(group ID和artifact ID是必须定义的信息),如果group ID和artifact ID以外的一些信息没有定义,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里定义的依赖信息。-->
    <!--
     <dependencyManagement>一般在父项目中出现,只用于声明依赖,并不会将依赖引入,也就是说子模块不会继承parent中dependencyManagement所有预定义的depandency,
     只有当子模块在需要的时候按需引入即可.
     使用dependencyManagement主要用于声明依赖,并统一管理项目中使用到的依赖的种类、版本,这样每个子项目就不会出现额外的依赖,也避免了多个依赖出现不同版本的冲突了。
     所以,使用时需要在子项目中显式地声明需要用的依赖,如果不在子项目中声明依赖,子项目需要的依赖是不会从父项目中继承的。
     如果在子项目中显示的声明了需要的依赖,但是未指定版本的话,version和scope都会继承父项目在dependencyManagement中定义的依赖版本和范围;
     如果在子项目中指定了版本,则使用子项目指定的版本号。
     但是,在<dependencies/>标签里的依赖是可以直接被子项目继承的,所有声明在<dependencies/>里的依赖都会在所有的子项目中被自动引入,
     所以在parent中一般都严禁直接使用depandencys预定义依赖。
    -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-bom</artifactId>
                <version>${version.org.kie}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.kie.soup</groupId>
                <artifactId>kie-soup-bom</artifactId>
                <version>${version.org.kie}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- 项目生成的构件分发到远程仓库相关信息。当执行mvn deploy时将把网站或项目生成的构件分发到远程Maven仓库中,用distributionManagement来定义Maven分发构件的位置-->
    <distributionManagement>
        <!-- 分发发布版本的构件到远程仓库的中-->
        <repository>
            <uniqueVersion/>
            <id>nexus-releases</id>
            <name>Nexus Release Repository</name>
            <url>http://10.0.16.10:18080/nexus/content/repositories/releases/</url>
            <layout/>
        </repository>
        <!-- 分发快照版本的构件到远程仓库中。如果没有配置该元素,默认部署到repository元素配置的仓库 -->
        <snapshotRepository>
            <uniqueVersion/>
            <id>nexus-snapshots</id>
            <name>Nexus Snapshot Repository</name>
            <url>http://10.0.16.10:18080/nexus/content/repositories/snapshots/</url>
            <layout/>
        </snapshotRepository>

        <!--部署项目的网站需要的信息-->
        <site>
            <!--部署位置的唯一标识符,用来匹配站点和settings.xml文件里的配置-->
            <id>mallx-site</id>
            <!--部署位置的名称-->
            <name>business api website</name>
            <!--部署位置的URL,按protocol://hostname/path形式-->
            <url>scp://svn.mallx.com/mallx:/usr/local/mallx-parent-snapshot/web</url>
        </site>

        <!-- 项目构件下载的URL。主要用于定位那些不在仓库里的构件(由于license限制)。-->
        <downloadUrl/>

        <!-- 如果构件有了新的group ID和artifact ID(构件移到了新的位置),这里列出构件的重定位信息。-->
        <!-- 使用场景是什么? 旧的group ID和artifact ID还可以使用吗? 在项目之初如何知道新的group ID和artifact ID? -->
        <relocation>
            <!--构件新的group ID-->
            <groupId/>
            <!--构件新的artifact ID-->
            <artifactId/>
            <!--构件新的版本号-->
            <version/>
            <!--显示给用户的,关于移动的额外信息,例如原因。-->
            <message/>
        </relocation>
        <!-- 给出该构件在远程仓库的状态。该值是由Maven自动设置,无需人为设置,有效的值有:none(默认),converted(仓库管理员从 Maven 1 POM转换过来),partner(直接从伙伴Maven 2仓库同步过来),deployed(从Maven 2实例部 署),verified(被核实时正确的和最终的)。-->
        <status/>
    </distributionManagement>
    <!-- 属性标签, 用于定义常量、版本号等信息,Properties可以在整个POM中使用 -->
    <properties>
        <version.org.kie>7.61.0.Final</version.org.kie>
        <skipTests>true</skipTests>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <fastjson.version>1.2.75</fastjson.version>
        <commons.io.version>2.5</commons.io.version>
        <geotools.version>20.0</geotools.version>
        <compress.version>1.21</compress.version>
        <surefire.forkCount>1</surefire.forkCount>
        <alphanetworkCompilerEnabled>false</alphanetworkCompilerEnabled>
    </properties>

</project>

MAVEN的属性

1. 内置/POM属性

序号属性类型说明
1${basedir}内置属性表示项目的根目录,也就是包含pom.xml文件的目录
2${version}内置属性表示项目的版本
3${project.basedir}POM属性和${basedir}相同
4${project.version}POM属性和${version}相同
5${project.build.directory}POM属性表示构建目录,缺省为target
6${project.build.sourceEncoding}POM属性表示主源码的编码格式
7${project.build.sourceDirectory}POM属性表示主源码路径
8${project.build.finalName}POM属性表示输出文件名称,缺省为${project.artifactId}-${project.version}.${project.packaging},打包类型缺省为JAR
9${project.build.outputDirectory}POM属性表示构建过程输出目录,缺省为target/classes
10${project.XXX}POM属性表示当前POM文件的任意节点的内容

2. 自定义属性

用户可以在POM文件的元素下自定义MAVEN的属性:

...
<properties>
    <rills.drools.version>7.61.0.Final</rills.drools.version>
</properties>
<dependencies>   
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-core</artifactId>
        <version>${rills.drools.version}</version>
    </dependency>
</dependencies>
...

3. SETTING属性

用户可以引用settings.xml文件中XML元素的值,需要使用settings.开头,如:${settings.localRepository}表示指向用户本地仓库的地址。

4. JAVA系统属性以及环境变量属性

A. 用户可以使用当前JAVA系统的属性,如: ${user.home} 指向了用户目录。
B. 用户可以使用所有的环境变量的属性,需要使用env.开头,如: ${env.JAVA_HOE} 指向JDK的根目录。

5. 如何查看JAVA系统属性以及环境变量属性?

使用MAVEN的指令: mvn help:system
===============================================================================
System Properties
===============================================================================

java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D:\Program Files (x86)\Java\jdk1.8.0_251\jre\bin
java.vm.version=25.251-b08
java.vm.vendor=Oracle Corporation
maven.multiModuleProjectDirectory=D:/04-gitee/rills-atlas-2.1.0-rc3
java.vendor.url=http://java.oracle.com/
path.separator=;
guice.disable.misplaced.annotation.check=true
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D:/04-gitee/rills-atlas-2.1.0-rc3
java.runtime.version=1.8.0_251-b08
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\endorsed
os.arch=amd64
java.io.tmpdir=C:\Users\ROCKY\AppData\Local\Temp\
line.separator=

java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 10
classworlds.conf=D:/Program Files (x86)/apache-maven-3.6.3/bin/m2.conf
sun.jnu.encoding=GBK
java.library.path=D:\Program Files (x86)\Java\jdk1.8.0_251\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Users\ROCKY\bin;D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\local\bin;D:\Program Files (x86)\Git\usr\bin;D:\Program Files (x86)\Git\usr\bin;D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\bin;C:\Users\ROCKY\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;D:\Program Files (x86)\Git\cmd;D:\Program Files (x86)\TortoiseSVN\bin;D:\Program Files (x86)\nodejs;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Users\ROCKY\AppData\Local\Microsoft\WindowsApps;D:\Program Files (x86)\Java\jdk1.8.0_251\bin;D:\Program Files (x86)\apache-maven-3.6.3\bin;C:\Users\ROCKY\AppData\Roaming\npm;D:\Program Files (x86)\Git\usr\bin\vendor_perl;D:\Program Files (x86)\Git\usr\bin\core_perl;.
maven.conf=D:/Program Files (x86)/apache-maven-3.6.3/conf
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=10.0
library.jansi.path=D:/Program Files (x86)/apache-maven-3.6.3/lib/jansi-native
user.home=C:\Users\ROCKY
user.timezone=Asia/Shanghai
java.awt.printerjob=sun.awt.windows.WPrinterJob
java.specification.version=1.8
file.encoding=GBK
user.name=ROCKY
java.class.path=D:/Program Files (x86)/apache-maven-3.6.3/boot/plexus-classworlds-2.6.0.jar
java.vm.specification.version=1.8
sun.arch.data.model=64
java.home=D:\Program Files (x86)\Java\jdk1.8.0_251\jre
sun.java.command=org.codehaus.plexus.classworlds.launcher.Launcher help:system
java.specification.vendor=Oracle Corporation
user.language=zh
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_251
java.ext.dirs=D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.class.path=D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\resources.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\rt.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\sunrsasign.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\jsse.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\jce.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\charsets.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\lib\jfr.jar;D:\Program Files (x86)\Java\jdk1.8.0_251\jre\classes
java.vendor=Oracle Corporation
maven.home=D:\Program Files (x86)\apache-maven-3.6.3
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64

===============================================================================
Environment Variables
===============================================================================

PSMODULEPATH=%ProgramFiles%\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
DISPLAY=needs-to-be-defined
COMMONPROGRAMW6432=C:\Program Files\Common Files
PROGRAMW6432=C:\Program Files
PROCESSOR_ARCHITECTURE=AMD64
PATH=C:\Users\ROCKY\bin;D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\local\bin;D:\Program Files (x86)\Git\usr\bin;D:\Program Files (x86)\Git\usr\bin;D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\bin;C:\Users\ROCKY\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;D:\Program Files (x86)\Git\cmd;D:\Program Files (x86)\TortoiseSVN\bin;D:\Program Files (x86)\nodejs;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Users\ROCKY\AppData\Local\Microsoft\WindowsApps;D:\Program Files (x86)\Java\jdk1.8.0_251\bin;D:\Program Files (x86)\apache-maven-3.6.3\bin;C:\Users\ROCKY\AppData\Roaming\npm;D:\Program Files (x86)\Git\usr\bin\vendor_perl;D:\Program Files (x86)\Git\usr\bin\core_perl
PROGRAMDATA=C:\ProgramData
MINGW_PREFIX=D:/Program Files (x86)/Git/mingw64
SHLVL=1
SYSTEMROOT=C:\WINDOWS
SHELL=D:\Program Files (x86)\Git\usr\bin\bash.exe
MSYSTEM_CHOST=x86_64-w64-mingw32
ORIGINAL_TEMP=C:/Users/ROCKY/AppData/Local/Temp
TMP=C:\Users\ROCKY\AppData\Local\Temp
HOSTNAME=LAPTOP-IFSVISPM
PROGRAMFILES(X86)=C:\Program Files (x86)
COMPUTERNAME=LAPTOP-IFSVISPM
OS=Windows_NT
MAVEN_HOME=D:/Program Files (x86)/apache-maven-3.6.3
WINDIR=C:\WINDOWS
PLINK_PROTOCOL=ssh
SYSTEMDRIVE=C:
=::=::\
ZES_ENABLE_SYSMAN=1
SSH_ASKPASS=D:/Program Files (x86)/Git/mingw64/libexec/git-core/git-gui--askpass
MSYSTEM_CARCH=x86_64
COMSPEC=C:\WINDOWS\system32\cmd.exe
DRIVERDATA=C:\Windows\System32\Drivers\DriverData
HOMEDRIVE=C:
LANG=zh_CN.UTF-8
LOGONSERVER=\\LAPTOP-IFSVISPM
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 Stepping 12, GenuineIntel
ACLOCAL_PATH=D:\Program Files (x86)\Git\mingw64\share\aclocal;D:\Program Files (x86)\Git\usr\share\aclocal
COMMONPROGRAMFILES=C:\Program Files\Common Files
PROGRAMFILES=C:\Program Files
COMMONPROGRAMFILES(X86)=C:\Program Files (x86)\Common Files
OLDPWD=D:/04-gitee/rills-atlas-2.1.0-rc3
MANPATH=D:\Program Files (x86)\Git\mingw64\local\man;D:\Program Files (x86)\Git\mingw64\share\man;D:\Program Files (x86)\Git\usr\local\man;D:\Program Files (x86)\Git\usr\share\man;D:\Program Files (x86)\Git\usr\man;D:\Program Files (x86)\Git\share\man
TEMP=C:\Users\ROCKY\AppData\Local\Temp
NUMBER_OF_PROCESSORS=8
USERDOMAIN=LAPTOP-IFSVISPM
INFOPATH=D:\Program Files (x86)\Git\usr\local\info;D:\Program Files (x86)\Git\usr\share\info;D:\Program Files (x86)\Git\usr\info;D:\Program Files (x86)\Git\share\info
HOME=C:\Users\ROCKY
TMPDIR=C:\Users\ROCKY\AppData\Local\Temp
PROCESSOR_LEVEL=6
PWD=D:/04-gitee/rills-atlas-2.1.0-rc3
USERNAME=ROCKY
MSYSTEM=MINGW64
CONFIG_SITE=D:/Program Files (x86)/Git/mingw64/etc/config.site
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
ORIGINAL_TMP=C:/Users/ROCKY/AppData/Local/Temp
USERDOMAIN_ROAMINGPROFILE=LAPTOP-IFSVISPM
PUBLIC=C:\Users\Public
PROCESSOR_REVISION=8e0c
USERPROFILE=C:\Users\ROCKY
APPDATA=C:\Users\ROCKY\AppData\Roaming
HOMEPATH=\Users\ROCKY
EXEPATH=D:\Program Files (x86)\Git
LOCALAPPDATA=C:\Users\ROCKY\AppData\Local
MINGW_PACKAGE_PREFIX=mingw-w64-x86_64
ORIGINAL_PATH=D:\Program Files (x86)\Git\mingw64\bin;D:\Program Files (x86)\Git\usr\bin;C:\Users\ROCKY\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;D:\Program Files (x86)\Git\cmd;D:\Program Files (x86)\TortoiseSVN\bin;D:\Program Files (x86)\nodejs;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Users\ROCKY\AppData\Local\Microsoft\WindowsApps;D:\Program Files (x86)\Java\jdk1.8.0_251\bin;D:\Program Files (x86)\apache-maven-3.6.3\bin;C:\Users\ROCKY\AppData\Roaming\npm
JAVA_HOME=D:/Program Files (x86)/Java/jdk1.8.0_251
ALLUSERSPROFILE=C:\ProgramData
PKG_CONFIG_PATH=D:\Program Files (x86)\Git\mingw64\lib\pkgconfig;D:\Program Files (x86)\Git\mingw64\share\pkgconfig
TERM=xterm
MAVEN_CMD_LINE_ARGS= help:system
MINGW_CHOST=x86_64-w64-mingw32
MSYSTEM_PREFIX=D:/Program Files (x86)/Git/mingw64
MAVEN_PROJECTBASEDIR=D:/04-gitee/rills-atlas-2.1.0-rc3
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值