`
sky_若海
  • 浏览: 12871 次
  • 性别: Icon_minigender_1
  • 来自: 保定
文章分类
社区版块
存档分类
最新评论

使用Ant构建web项目 从编译到测试 生成测试报告 打包 邮件发送 远程下载tomcat 部署运行一条龙服务之ant脚本

ant 
阅读更多
转载自:http://www.blogjava.net/sxyx2008/
 
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project default="run" name="build-project-with-ant">
    
    <!-- 最终编译后的jar包名称 -->
    <property name="jar.prefix-name" value="cms"></property>
    <property name="jar.version" value="1.0"></property>
    <property name="tomcat.version" value="6.0.18" />
    
    <property name="mailhost" value="smtp.qq.com"></property>
    <property name="username" value="**********" />
    <property name="password" value="**********"></property>
    <property name="mailfrom" value="184675420@qq.com" />
    <property name="mailto" value="184675420@qq.com"></property>
    <property name="mailsubject" value="使用Ant自助构建项目测试打包文档"></property>
    
    <!-- 项目构建时所需要的lib -->
    <property name="project.lib.dir" value="${basedir}/WebRoot/WEB-INF/lib"></property>

    <!-- 项目构建时tomcat的home目录 -->
    <property name="tomcat.download.url" value="http://archive.apache.org/dist/tomcat/tomcat-6/v${tomcat.version}/bin/apache-tomcat-${tomcat.version}.zip"></property>
    
    <!-- 项目构建时下载tomcat的存放目录 -->
    <property name="tomcat.dir" value="${basedir}/dist/"></property>
    
    <!-- 定义项目的当前目录 -->
    <property name="basedir" value="."/>
    <!-- 定义项目源码目录 -->
    <property name="src.dir" value="${basedir}/src"></property>
    <!-- 定义项目源码编译后的目录 -->
    <property name="build.dir" value="${basedir}/classes"></property>
    <!-- 定义项目最终编译生成的目录 -->
    <property name="dist.dir" value="${basedir}/dist"></property>
    <!-- 定义项目文档的目录 -->
    <property name="doc.dir" value="${basedir}/doc"></property>
    <!-- 定义项目文档api的目录 -->
    <property name="doc.dir.api" value="${doc.dir}/api"></property>
    <!-- 定义项目单元测试文档的目录 -->
    <property name="junit.doc.dir" value="${basedir}/doc/api/junit"></property>
    <!-- 定义项目单元测试源码的目录 -->    
    <property name="junit.src.dir" value="${basedir}/test"></property>
    <!-- 定义项目单元测试编译的目录 -->    
    <property name="junit.dir" value="${basedir}/junit"></property>
    <property name="junit.build.dir" value="${junit.dir}/classes"></property>
    <!-- 定义项目单元测试测试报告的目录 -->    
    <property name="junit.report.dir" value="${junit.dir}/report"></property>
    
    
    <target name="init" description="init">
        
        <echo>项目初始化设置</echo>
        
        <delete dir="${build.dir}"></delete>
        <delete dir="${dist.dir}"></delete>
        <delete dir="${doc.dir}"></delete>
        <delete dir="${junit.dir}"></delete>
        
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${dist.dir}"/>
        <mkdir dir="${doc.dir}"/>
        <mkdir dir="${junit.build.dir}"/>
        <mkdir dir="${junit.report.dir}"/>
        
    </target>
    
    
    <target name="compile" depends="init" description="compile source">
        <echo>编译源码</echo>
        <javac srcdir="${src.dir}" includeantruntime="false" destdir="${build.dir}" verbose="true">
        <classpath>
            <fileset dir="${project.lib.dir}">
                <include name="*.jar"/>
            </fileset>
        </classpath>
        </javac>
    </target>


    <target name="api-doc" depends="compile" description="build javadoc">
        <echo>生成api-doc帮助文档</echo>
        <javadoc
               destdir="${doc.dir.api}"
               author="true"
               version="true"
               use="true"
               windowtitle="${jar.prefix-name} API"
               sourcepath="${src.dir}">
            <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
            <bottom><![CDATA[<i>Copyright © 2012 Dummy Corp. All Rights Reserved.</i>]]></bottom>
            
            <classpath>
                <fileset dir="${project.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
            </classpath>
        </javadoc>
    </target>
    
    <target name="junit-javac" depends="api-doc" description="junit test case compile">
        <echo>编译junit</echo>
        <javac destdir="${junit.build.dir}" srcdir="${junit.src.dir}" fork="false" includeantruntime="false">
        <classpath>
            <fileset dir="${project.lib.dir}">
                <include name="*.jar"/>
            </fileset>
        </classpath>
        </javac>
    </target>
    
    <target name="junit-run" depends="junit-javac" description="junit test case execute">
        <echo>运行单元测试</echo>
        <junit printsummary="yes" haltonfailure="false">
            <classpath>
                <pathelement location="${junit.build.dir}"/>
                <fileset dir="${project.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
            </classpath>
            <formatter type="xml"/>
            <batchtest todir="${junit.report.dir}">
                <fileset dir="${junit.src.dir}">
                    <include name="**/*Test.java"/>
                </fileset>
            </batchtest>
        </junit>
    </target>
    
    <target name="junit-report" depends="junit-run" description="junit test case report">
        <echo>生成单元测试报告</echo>
        <junitreport todir="${junit.report.dir}">
            <fileset dir="${junit.report.dir}">
                <include name="**/*.xml"/>
            </fileset>
            <report format="frames" todir="${junit.report.dir}/html"/>
        </junitreport>
        
    </target>
    
    <target name="junit-doc" depends="junit-report" description="build javadoc">
        <echo>生成junit-doc帮助文档</echo>
        <javadoc
               destdir="${junit.doc.dir}"
               author="true"
               version="true"
               use="true"
               windowtitle="Junit Test API"
               sourcepath="${junit.src.dir}">
            <classpath>
                <fileset dir="${project.lib.dir}">
                    <include name="*.jar"/>
                </fileset>
            </classpath>
            <doctitle><![CDATA[<h1>Test</h1>]]></doctitle>
            <bottom><![CDATA[<i>Copyright © 2012 Dummy Corp. All Rights Reserved.</i>]]></bottom>
        </javadoc>
    </target>
    
    <target name="package" depends="api-doc" description="package">
        <echo>使用jar打包编译后的class文件</echo>
        <jar destfile="${dist.dir}/${jar.prefix-name}-${jar.version}.jar" includes="**/*.class" basedir="${build.dir}">
        </jar>
        <echo>使用zip打包源码</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-source.zip" basedir="${src.dir}">
            <exclude name="**/*.class"/>
        </zip>
        <echo>使用zip打包javadoc</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-doc.zip" basedir="${doc.dir.api}">
        </zip>
        <echo>使用war打war包</echo>
        <war destfile="${dist.dir}/${jar.prefix-name}.war" webxml="${basedir}/WebRoot/WEB-INF/web.xml">
            <fileset dir="${basedir}/WebRoot">
                <include name="**/*.*"/>
            </fileset>
            <!--
            <lib dir="${basedir}/WebRoot/WEB-INF/lib"></lib>
            <classes dir="${basedir}/WebRoot/WEB-INF/classes"></classes>
            -->
        </war>
    </target>
    
    <target name="junit-package" depends="junit-doc" description="junit-package">
        <echo>打包</echo>
        <echo>使用jar打包编译后的class文件</echo>
        <jar destfile="${dist.dir}/${jar.prefix-name}-${jar.version}.jar" includes="**/*.class" basedir="${build.dir}">
        </jar>
        <echo>使用zip打包源码</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-source.zip" basedir="${src.dir}">
            <exclude name="**/*.class"/>
        </zip>
        <echo>使用zip打包javadoc</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-doc.zip" basedir="${doc.dir.api}">
        </zip>
        <echo>使用war打war包</echo>
        <war destfile="${dist.dir}/${jar.prefix-name}.war" webxml="${basedir}/WebRoot/WEB-INF/web.xml">
            <fileset dir="${basedir}/WebRoot">
                <include name="**/*.*"/>
            </fileset>
            <!--
            <lib dir="${basedir}/WebRoot/WEB-INF/lib"></lib>
            <classes dir="${basedir}/WebRoot/WEB-INF/classes"></classes>
            -->
        </war>
        <echo>使用jar打junit单元测试编译好的class文件</echo>
        <jar destfile="${dist.dir}/${jar.prefix-name}-junit-${jar.version}.jar" includes="**/*.class" basedir="${junit.build.dir}">
        </jar>
        <echo>使用zip打junit单元测试源文件</echo>
        <zip destfile="${dist.dir}/${jar.prefix-name}-junit-source.zip" basedir="${junit.src.dir}">
            <exclude name="**/*.class"/>
        </zip>
        <echo>使用zip打junit单元测试测试报告</echo>
        <zip destfile="${dist.dir}/junit-report.zip" basedir="${junit.report.dir}/html">
        </zip>
    </target>
    
    
    
    <target name="clean">
        <echo>清理项目</echo>
        <delete dir="${build.dir}" includeemptydirs="true"></delete>
        <delete dir="${doc.dir}" includeemptydirs="true"></delete>
        <delete dir="${junit.dir}" includeemptydirs="true"></delete>
    </target>
    
    
    <target name="mail"  description="use java mail send mail message" depends="clean">
        
        <echo>将打包的文件email发送</echo>
        <mail 
            mailhost="${mailhost}" 
            mailport="25" 
            subject="${mailsubject}"  
            charset="utf-8"
            user="${username}"
            password="${password}"
            >
          <from address="${mailfrom}"/>
          <to address="${mailto}"/>
          <message>使用Ant自助构建项目测试打包文档</message>
          <attachments>
            <fileset dir="${dist.dir}">
              <include name="*.*"/>
            </fileset>
          </attachments>
        </mail>
    </target>
    
    
    <target name="wget" depends="mail">
        <echo>下载tomcat</echo>
        <get dest="${tomcat.dir}" verbose="true">
          <url url="${tomcat.download.url}"/> 
        </get>
    </target>
    
    
    <target name="unzip" depends="wget">
        <echo>解压tomcat</echo>
        <unzip src="${tomcat.dir}/apache-tomcat-${tomcat.version}.zip" dest="${tomcat.dir}">
        </unzip>
    </target>
    
    <target name="copy" depends="unzip">
        <echo>拷贝war包到tomcat中部署</echo>
         <copy file="${dist.dir}/${jar.prefix-name}.war" tofile="${tomcat.dir}/apache-tomcat-${tomcat.version}/webapps/${jar.prefix-name}.war"/>
    </target>
    
    <target name="startup" depends="copy">
        <echo>启动tomcat web容器</echo>
        <exec executable="${tomcat.dir}/apache-tomcat-${tomcat.version}/bin/startup.bat">
             <env key="CATALINA_HOME" path="${tomcat.dir}/apache-tomcat-${tomcat.version}/"/>
        </exec>
    </target>
    
    
    <target name="run" depends="package,startup" description="不存在单元测试时执行的任务">
    </target>
    
    <target name="junitrun" depends="junit-package,startup" description="存在单元测试时执行的任务">
    </target>
    
    
    
    
</project>
构建控制台日志
init:
     [echo] 项目初始化设置
   [delete] Deleting directory D:\workspace\Ant1\classes
   [delete] Deleting directory D:\workspace\Ant1\dist
   [delete] Deleting directory D:\workspace\Ant1\doc
   [delete] Deleting directory D:\workspace\Ant1\junit
    [mkdir] Created dir: D:\workspace\Ant1\classes
    [mkdir] Created dir: D:\workspace\Ant1\dist
    [mkdir] Created dir: D:\workspace\Ant1\doc
    [mkdir] Created dir: D:\workspace\Ant1\junit\classes
    [mkdir] Created dir: D:\workspace\Ant1\junit\report
compile:
     [echo] 编译源码
    [javac] Compiling 3 source files to D:\workspace\Ant1\classes
junit-javac:
     [echo] 编译junit
    [javac] Compiling 1 source file to D:\workspace\Ant1\junit\classes
junit-run:
     [echo] 运行单元测试
    [junit] Running com.junit.test.OtherTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.027 sec
junit-report:
     [echo] 生成单元测试报告
[junitreport] Processing D:\workspace\Ant1\junit\report\TESTS-TestSuites.xml to C:\Users\scott\AppData\Local\Temp\null1056173236
[junitreport] Loading stylesheet jar:file:/E:/apache-ant-1.8.4/lib/ant-junit.jar!/org/apache/tools/ant/taskdefs/optional/junit/xsl/junit-frames.xsl
[junitreport] Transform time: 334ms
[junitreport] Deleting: C:\Users\scott\AppData\Local\Temp\null1056173236
doc:
     [echo] 生成帮助文档
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] 正在创建目标目录: "D:\workspace\Ant1\doc\api\"
  [javadoc] 正在装入软件包 com.ant.lesson1 的源文件...
  [javadoc] 正在构造 Javadoc 信息...
  [javadoc] 标准 Doclet 版本 1.6.0_25
  [javadoc] 正在构建所有软件包和类的树...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\Main.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\MyHttpServlet.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\SimpleTask.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\package-frame.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\package-summary.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\package-tree.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\constant-values.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\serialized-form.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\class-use\SimpleTask.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\class-use\MyHttpServlet.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\class-use\Main.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\com/ant/lesson1/\package-use.html...
  [javadoc] 正在构建所有软件包和类的索引...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\overview-tree.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\index-all.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\deprecated-list.html...
  [javadoc] 正在构建所有类的索引...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\allclasses-frame.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\allclasses-noframe.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\index.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\help-doc.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\stylesheet.css...
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] 正在创建目标目录: "D:\workspace\Ant1\doc\api\junit\"
  [javadoc] 正在装入软件包 com.junit.test 的源文件...
  [javadoc] 正在构造 Javadoc 信息...
  [javadoc] 标准 Doclet 版本 1.6.0_25
  [javadoc] 正在构建所有软件包和类的树...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\OtherTest.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\package-frame.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\package-summary.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\package-tree.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\constant-values.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\class-use\OtherTest.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\com/junit/test/\package-use.html...
  [javadoc] 正在构建所有软件包和类的索引...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\overview-tree.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\index-all.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\deprecated-list.html...
  [javadoc] 正在构建所有类的索引...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\allclasses-frame.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\allclasses-noframe.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\index.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\help-doc.html...
  [javadoc] 正在生成 D:\workspace\Ant1\doc\api\junit\stylesheet.css...
package:
     [echo] 打包
      [jar] Building jar: D:\workspace\Ant1\dist\cms-1.0.jar
      [zip] Building zip: D:\workspace\Ant1\dist\cms-source.zip
      [zip] Building zip: D:\workspace\Ant1\dist\cms-doc.zip
      [jar] Building jar: D:\workspace\Ant1\dist\cms-junit-1.0.jar
      [zip] Building zip: D:\workspace\Ant1\dist\cms-junit-source.zip
      [zip] Building zip: D:\workspace\Ant1\dist\junit-report.zip
      [war] Building war: D:\workspace\Ant1\dist\cms.war
clean:
     [echo] 清理项目
   [delete] Deleting directory D:\workspace\Ant1\classes
   [delete] Deleting directory D:\workspace\Ant1\doc
   [delete] Deleting directory D:\workspace\Ant1\junit
mail:
     [echo] 将打包的文件email发送
     [mail] Sending email: Test build
分享到:
评论

相关推荐

    Ant远程部署tomcat脚本

    本文将详细介绍如何使用Ant脚本来实现远程部署到Tomcat服务器。 首先,Ant脚本的基础结构是XML格式,如以下示例所示: ```xml &lt;project name="kit.web" default="war" basedir="."&gt; ... ``` 在`&lt;project&gt;`标签...

    ant远程上传并部署tomcat

    标题中的“ant远程上传并部署tomcat”是指使用Apache Ant工具执行自动化构建任务,将本地的Web应用(如WAR或EAR文件)传输到远程Linux服务器的Tomcat应用服务器上进行部署,并随后重启Tomcat服务以使更改生效。...

    Ant编译Tomcat源码、MyEclipse导入Tomcat源码、执行Tomcat源码启动Tomcat

    本篇将详细介绍如何使用Ant编译Tomcat源码,以及如何在MyEclipse环境中导入并运行Tomcat源码。 首先,Ant是Apache软件基金会开发的Java项目自动化构建工具,它能够执行编译、测试、打包等任务。在Apache Tomcat的...

    ant部署远程服务器

    在IT行业中,Ant是一个常用的构建自动化工具,尤其在Java项目中,它被广泛用来编译、测试、打包和部署应用程序。本教程将详细介绍如何利用Ant在Eclipse集成开发环境中部署远程Tomcat服务器上的Web应用。 首先,理解...

    服务器 使用脚本打包编译java项目

    本文将详细介绍如何在服务器上利用脚本打包并编译Java项目,涵盖了从版本控制到最终发布的全过程。 首先,我们需要理解整个流程涉及的关键工具和技术: 1. **版本控制**:在描述中提到了`svn`,这是一款广泛使用的...

    使用ANT远程发布Web项目

    本文主要介绍如何使用Apache Ant来实现Web项目的自动化打包并远程部署到Tomcat服务器上。 #### 二、准备工作 1. **环境配置** - **Eclipse IDE**:用于编写和构建项目。 - **Apache Ant**:用于自动化构建过程。...

    (总结版) Ant 从SVNCVS下载 编译打包部署到本地远程服务器 (FTP上传).docx

    本文档提供了一种全面的方法,让开发者可以使用Ant自动化处理从版本控制获取代码、编译、打包、部署到远程服务器的整个流程。这对于大型J2EE项目的持续集成和持续部署(CI/CD)尤其有用,提高了开发效率并减少了手动...

    (总结完整版)Ant从SVNCVS下载编译打包部署到本地远程服务器(FTP上传).pdf

    在软件开发过程中,自动化构建工具如Ant在J2EE项目中扮演着重要角色,它能够帮助开发者完成从代码获取、编译、打包到部署的一系列任务。本文档总结了如何利用Ant与版本控制系统(如SVN、CVS)集成,实现代码的自动...

    使用Ant编译打包

    Ant使用XML来描述构建过程,包括编译、测试、打包和部署等任务,使得开发者能够通过简单的脚本进行项目构建,而无需深入理解复杂的命令行语法。 **一、Ant的安装与配置** 1. **下载与解压**:首先,你需要从Apache...

    使用ant部署eclipse开发的web工程到tomcat

    本篇文章将深入探讨如何使用Apache Ant工具部署由Eclipse开发的Web工程到Apache Tomcat服务器上。Ant是一个基于Java的构建工具,它允许通过XML格式的构建文件(如`build.xml`)来定义构建任务,极大地简化了项目管理...

    java ant发布项目到tomcat

    Ant以其XML格式的构建文件(build.xml)为特色,允许开发者定义任务序列,这些任务可以包括编译源代码、创建JAR文件、打包WAR文件以及部署到服务器,如Tomcat。在本场景中,我们将探讨如何使用Ant来发布一个Web项目...

    ant+tomcat

    4. "Eclipse中自动通过ant脚本把web应用部署到tomcat中.doc":这将涉及如何在Eclipse这样的IDE中配置和运行Ant脚本,以便于快速将Web应用部署到本地或远程的Tomcat服务器上。 在实际开发中,Ant可以执行一系列任务...

    用Ant实现Java项目的自动构建和部署

    Ant是一个基于XML的构建工具,它的配置文件(build.xml)定义了构建过程中的各种任务,如编译、打包、测试和部署等。XML结构使得构建过程可读性强,易于维护。 对于J2ME项目,Ant可以完成以下步骤: 1. **编译源...

    Ant部署WebService服务

    而Ant作为构建工具,可以帮助我们编译源码、打包应用、运行测试以及部署服务。 在"Ant部署WebService服务"中,我们需要了解以下核心知识点: 1. **Ant基础**: - Ant是一个基于XML的脚本语言,其配置文件通常命名...

    ant 构建AXIS2

    总结起来,"ant 构建AXIS2"涉及了使用Ant工具来编译、测试和打包Apache AXIS2项目的过程。这一过程的关键在于理解Ant的构建文件和AXIS2的项目结构,确保所有依赖项都已就绪,并正确配置了构建参数。通过这一流程,...

    性能自动化测试(基于jmeter+jenkins+ant+tomcat)

    2. 创建新的Jenkins作业,配置源代码管理(如SVN)、构建触发器、构建步骤(运行Ant脚本)。 3. 设置构建后操作,例如生成报告、邮件通知等。 **性能测试流程**: 1. 使用JMeter设计性能测试脚本,模拟用户行为。 ...

    tomcat-ant-1.7.1官网下载

    Apache Ant 是一个强大的构建工具,它是Java开发领域中不可或缺的一部分,尤其在自动化构建、测试和部署Java项目时。Ant的设计灵感确实来源于经典的Unix构建工具make,但它针对Java环境进行了优化,消除了make的一些...

    ant部署tomcat

    Ant是一个基于Java的构建工具,它提供了一种灵活的方式来编译、打包、测试和部署Java项目。它的核心概念是构建文件(build.xml),这是一个XML文档,定义了构建过程中的各种任务和目标。在“ant部署tomcat”的场景中...

Global site tag (gtag.js) - Google Analytics