上一篇我們瞭解了去部署一個maven項目,但是這在我們開發中是不夠的,框架多樣,遇到非maven項目,你再使用上節的內容就有點不夠用了,我們今天看看怎麼使用ant去部署一個非maven項目;
首先我們瞭解一下ant是做什麼的:
1.Ant是apache軟件基金會jakarta目錄中的一個子項目:
我們都知道項目每次改動都要重新編譯,打包,測試,一直重複這樣的工作,ant本身就是這樣一個流程腳本引擎,用於自動化調用程序完成項目的編譯,打包,測試等工作;每個ant腳本(build.xml)中設置了一系列任務(target)。
具有以下特點:
1).跨平臺性:ant是純java語言編寫的,大家都知道java就是跨平臺性的;
2).操作簡單:ant是由一個內置任務和可選任務組成的,ant運行時需要一個xml文件,就是構建文件,ant通過調用target樹,就可以執行各種task,每個task實現了特定的接口對象,由於ant構建文件時xml格式的文件,容易維護和書寫,結構簡單清晰;
3).ant可以集成到開發環境中,
2.我們使用的工具eclipse,sts等工具都可以生成一個build.xml;我們首先看看怎麼生成這個
1).找到我們要配置build.xml的項目右擊—》export
然後一直下一步,就會在項目根路徑下生成一個build.xml文件;如下:我們大概看一下這兒xml瞭解ant,下面我們來手動編寫我們自己需要的xml,適應於各個環境的;
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- WARNING: Eclipse auto-generated file.
Any modifications will be overwritten.
To include a user specific buildfile here, simply create one in the same
directory with the processing instruction <?eclipse.ant.import?>
as the first entry and export the buildfile again. --><project basedir="." default="build" name="ttp">
<property environment="env"/>
<property name="ECLIPSE_HOME" value="E:/RuanJianBao/Ouye/sts-3.7.1.RELEASE/"/>
<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.6"/>
<property name="source" value="1.6"/>
<path id="Web App Libraries.libraryclasspath">
<pathelement location="WebContent/WEB-INF/lib/activation-1.1.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/activemq-core-5.7.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/aopalliance-1.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/aspectjweaver-1.7.3.jar"/>
<pathelement location="WebContent/WEB-INF/lib/axis-ant.jar"/>
<pathelement location="WebContent/WEB-INF/lib/axis-schema.jar"/>
<pathelement location="WebContent/WEB-INF/lib/axis.jar"/>
<pathelement location="WebContent/WEB-INF/lib/bccs-api-3.0.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/bcprov-jdk14-136.jar"/>
<pathelement location="WebContent/WEB-INF/lib/cas-client-core-3.2.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/cglib-nodep-2.1_3.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-beanutils-1.8.3.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-codec-1.10.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-codec-1.6.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-collections-3.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-dbcp-1.4.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-discovery-0.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-fileupload-1.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-httpclient-3.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-io-1.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-io-1.3.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-lang-2.4.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-lang3-3.3.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-logging-1.0.4.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-logging-1.1.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-net-1.4.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/commons-pool-1.5.4.jar"/>
<pathelement location="WebContent/WEB-INF/lib/dfft.jar"/>
<pathelement location="WebContent/WEB-INF/lib/dom4j-1.6.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/ezmorph-1.0.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/fastjson-1.2.6.jar"/>
<pathelement location="WebContent/WEB-INF/lib/fel.jar"/>
<pathelement location="WebContent/WEB-INF/lib/freemarker-2.3.8.jar"/>
<pathelement location="WebContent/WEB-INF/lib/geronimo-j2ee-management_1.0_spec-1.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/geronimo-jms_1.1_spec-1.1.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/geronimo-jta_1.0.1B_spec-1.0.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/gson-1.5.jar"/>
<pathelement location="WebContent/WEB-INF/lib/httpclient-4.4.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/httpcore-4.4.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/httpmime-4.4.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jackson-annotations-2.4.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jackson-core-2.4.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jackson-core-lgpl-1.9.13.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jackson-databind-2.4.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jackson-mapper-lgpl-1.9.13.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jaxrpc.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jcommon-1.0.12.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jfreechart-1.0.9.jar"/>
<pathelement location="WebContent/WEB-INF/lib/json-lib-2.2.3-jdk13.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jstl-1.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/jta-1.0.1B.jar"/>
<pathelement location="WebContent/WEB-INF/lib/log4j-1.2.12.jar"/>
<pathelement location="WebContent/WEB-INF/lib/log4j-over-slf4j-1.6.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/mail-1.4.7.jar"/>
<pathelement location="WebContent/WEB-INF/lib/mailapi.jar"/>
<pathelement location="WebContent/WEB-INF/lib/mongo-Java-driver-2.13.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/mybatis-3.2.3.jar"/>
<pathelement location="WebContent/WEB-INF/lib/mybatis-spring-1.2.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/mysql-connector-java-5.1.26.jar"/>
<pathelement location="WebContent/WEB-INF/lib/ojdbc-14-10.2.0.4.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/opensaml1-1.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/pinyin4j-2.5.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/plusoft.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-3.10.1-20140818.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-3.6-20091214.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-examples-3.10.1-20140818.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-excelant-3.10.1-20140818.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-ooxml-3.10.1-20140818.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-ooxml-3.6-20091214.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-ooxml-schemas-3.10.1-20140818.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-ooxml-schemas-3.6-20091214.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-scratchpad-3.10.1-20140818.jar"/>
<pathelement location="WebContent/WEB-INF/lib/poi-scratchpad-3.6-20091214.jar"/>
<pathelement location="WebContent/WEB-INF/lib/quartz-1.6.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/saaj.jar"/>
<pathelement location="WebContent/WEB-INF/lib/servlet-api.jar"/>
<pathelement location="WebContent/WEB-INF/lib/slf4j-api-1.6.6.jar"/>
<pathelement location="WebContent/WEB-INF/lib/slf4j-log4j12-1.7.5.jar"/>
<pathelement location="WebContent/WEB-INF/lib/slf4j-simple-1.7.7.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-aop-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-asm-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-aspects-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-beans-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-context-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-context-support-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-core-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-expression-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-jdbc-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-jms-3.2.8.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-security-cas-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-security-core-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-security-web-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-tx-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-web-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/spring-webmvc-3.1.4.RELEASE.jar"/>
<pathelement location="WebContent/WEB-INF/lib/standard.jar"/>
<pathelement location="WebContent/WEB-INF/lib/stax-api-1.0.1.jar"/>
<pathelement location="WebContent/WEB-INF/lib/wsdl4j-1.6.2.jar"/>
<pathelement location="WebContent/WEB-INF/lib/xalan-2.7.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/xbean-spring-4.5.jar"/>
<pathelement location="WebContent/WEB-INF/lib/xmlbeans-2.6.0.jar"/>
<pathelement location="WebContent/WEB-INF/lib/xmlsec-1.4.3.jar"/>
<pathelement location="WebContent/WEB-INF/lib/xwork-2.0.4.jar"/>
</path>
<path id="EAR Libraries.libraryclasspath"/>
<path id="Persisted container [org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=iframework-management&ivyXmlPath=ivy.xml&confs=default&ivySettingsPath=&loadSettingsOnDemand=false&ivyUserDir=&propertyFiles= for project [ttp]].libraryclasspath"/>
<path id="Apache Tomcat v7.0 [Apache Tomcat v7.0].libraryclasspath">
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/annotations-api.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/catalina-ant.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/catalina-ha.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/catalina-tribes.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/catalina.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/ecj-4.2.2.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/el-api.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/jasper-el.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/jasper.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/jsp-api.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/servlet-api.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/tomcat-api.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/tomcat-coyote.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/tomcat-dbcp.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/tomcat-i18n-es.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/tomcat-i18n-fr.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/tomcat-i18n-ja.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/tomcat-jdbc.jar"/>
<pathelement location="E:/tomcat/tomcat-7.0/tomcat-7.0/lib/tomcat-util.jar"/>
</path>
<path id="ttp.classpath">
<pathelement location="build/classes"/>
<path refid="Web App Libraries.libraryclasspath"/>
<path refid="EAR Libraries.libraryclasspath"/>
<path refid="Persisted container [org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/?project=iframework-management&ivyXmlPath=ivy.xml&confs=default&ivySettingsPath=&loadSettingsOnDemand=false&ivyUserDir=&propertyFiles= for project [ttp]].libraryclasspath"/>
<pathelement location="WebContent/WEB-INF/lib/commons-codec-1.10.jar"/>
<pathelement location="WebContent/WEB-INF/lib/fel.jar"/>
<path refid="Apache Tomcat v7.0 [Apache Tomcat v7.0].libraryclasspath"/>
</path>
<target name="init">
<mkdir dir="build/classes"/>
<copy includeemptydirs="false" todir="build/classes">
<fileset dir="src">
<exclude name="**/*.java"/>
</fileset>
</copy>
<copy includeemptydirs="false" todir="build/classes">
<fileset dir="resources">
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="clean">
<delete dir="build/classes"/>
</target>
<target depends="clean" name="cleanall"/>
<target depends="build-subprojects,build-project" name="build"/>
<target name="build-subprojects"/>
<target depends="init" name="build-project">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac debug="true" debuglevel="${debuglevel}" destdir="build/classes" includeantruntime="false" source="${source}" target="${target}">
<src path="src"/>
<src path="resources"/>
<classpath refid="ttp.classpath"/>
</javac>
</target>
<target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/>
<target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
<copy todir="${ant.library.dir}">
<fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
</copy>
<unzip dest="${ant.library.dir}">
<patternset includes="jdtCompilerAdapter.jar"/>
<fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
</unzip>
</target>
<target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
<antcall target="build"/>
</target>
</project>
3.編寫自己的build.xml,我們編寫這個初衷是把重複的事情交給計算機去做,釋放人力;
我們看一下下面這個我們自己寫的,可以看到都是有每個target標籤,我們可以把每個target標籤任務是一步,我們想一下打成自己想要的包會有幾步:
a.創建自己想要的打包後的目錄,
b.javac編譯java文件爲class文件;並且把對應配置文件放到打包後對應的路徑下
c.編譯成後我們就是打包成war包
d.有了war包後就是部署了
所以以下其實就是這麼一個過程,我們來看看部分含義吧
<project basedir="." default="public" name="ttp"></project>
ant所有的內容都必須在這裏面;basedir:工作的根目錄,.表示當前目錄;default表示默認要做的事;name就是你給項目取得名字;
<target name="prepare" depends="init" description="創建打包需要的路徑,拷貝源文件到打包路徑下">
<mkdir dir="${build.src}"/>
</target>
我們把我們想要做的每件事,可以說是每一步定義成一個target,有一個名字name;depends是它所依賴的target,在執行自己時他會首先執行所依賴的target執行以後纔會執行自己;description是這個target的描述,用來做什麼<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="public" name="ttp">
<target name="init" description="設置初始化打 war 包需要的路徑變量">
<property name="name" value="ttp"/>
<property name="src" value="${basedir}/src"/>
<property name="lib" value="${basedir}/WebContent/WEB-INF/lib"/>
<property name="webapp" value="${basedir}/WebContent"/>
<property name="resource" value="${basedir}/resources/"/>
<property name="build.encoding" value="UTF-8" />
<property name="build.src" value="${basedir}/temp/ttp/src"/>
<property name="build.classes" value="${basedir}/temp/ttp/WEB-INF/classes"/>
<property name="buildwar.webapp" value="${basedir}/temp/ttp"/>
<property name="build.javadocs" value="${basedir}/temp/doc"/>
<property name="jar.dest" value="${basedir}/temp/jar"/>
<property name="war.dest" value="${basedir}/temp/war"/>
<!-- <property name="tomcat.home" value="/opt/tomcat"/> -->
<path id="classpath">
<fileset dir="${lib}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="E:/tomcat/tomcat-7.0/tomcat-7.0/lib">
<include name="**/*.jar"/>
</fileset>
<fileset dir="E:/jdk/jdk1.7.0_80/jdk1.7.0_80/jre/lib">
<include name="**/*.jar"/>
</fileset>
</path>
</target>
<target name="prepare" depends="init" description="創建打包需要的路徑,拷貝源文件到打包路徑下">
<echo>mkdir base start</echo>
<mkdir dir="${build.src}"/>
<mkdir dir="${build.classes}"/>
<mkdir dir="${buildwar.dest}"/>
<mkdir dir="${jar.dest}"/>
<mkdir dir="${war.dest}"/>
<echo>mkdir base end AND star copy ${basedir}</echo>
<copy todir="${build.src}">
<fileset dir="${src}"/>
</copy>
<copy todir="${build.classes}">
<fileset dir="${resource}"/>
</copy>
<copy todir="${buildwar.webapp}">
<fileset dir="${webapp}"/>
</copy>
</target>
<target name="build" depends="prepare" description="編譯 java 文件,拷貝 properties 屬性配置文件到編譯後的路徑下">
<echo message="開始編譯" />
<javac srcdir="${build.src}" destdir="${build.classes}"
executable="E:/jdk/jdk1.7.0_80/jdk1.7.0_80/bin/javac"
includeantruntime="false"
encoding="${build.encoding}"
target="1.7"
source="1.7"
>
<classpath refid="classpath"/>
</javac>
</target>
<target name="cpmapper" depends="build" description="將mapper對應的xml文件拷入相應classes的mapper類目錄">
<copy todir="${build.classes}/com/telegnosis/iframework/management/persistence">
<fileset dir="${src}/com/telegnosis/iframework/management/persistence">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.classes}/com/telegnosis/iframework/sqlMapper">
<fileset dir="${src}/com/telegnosis/iframework/sqlMapper">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.classes}/com/telegnosis/iframework/distance/dao">
<fileset dir="${src}/com/telegnosis/iframework/distance/dao">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.classes}/com/telegnosis/iframework/deviceCar/dao">
<fileset dir="${src}/com/telegnosis/iframework/deviceCar/dao">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.classes}/com/telegnosis/iframework/dispatch/dao">
<fileset dir="${src}/com/telegnosis/iframework/dispatch/dao">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.classes}/com/telegnosis/iframework/intoStms/dao">
<fileset dir="${src}/com/telegnosis/iframework/intoStms/dao">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.classes}/com/telegnosis/iframework/operateLog/mapper">
<fileset dir="${src}/com/telegnosis/iframework/operateLog/mapper">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.classes}/com/telegnosis/iframework/credit/dao">
<fileset dir="${src}/com/telegnosis/iframework/credit/dao">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.classes}/com/telegnosis/iframework/userGradeSum/dao">
<fileset dir="${src}/com/telegnosis/iframework/userGradeSum/dao">
<include name="*.xml"/>
</fileset>
</copy>
<copy todir="${build.classes}">
<fileset dir="${src}">
<include name="*.xml"/>
<include name="*.properties"/>
</fileset>
</copy>
</target>
<target name="antwar" depends="cpmapper" description="打 war 包,不將 java 文件打入包內">
<delete dir="${build.src}"/>
<war warfile="${war.dest}/ttp.war" webxml="${buildwar.webapp}/WEB-INF/web.xml">
<lib dir="${buildwar.webapp}/WEB-INF/lib"/>
<classes dir="${build.classes}"/>
<fileset dir="${buildwar.webapp}"/>
</war>
</target>
<target name="public" depends="clean,antwar" description="打包編譯開始,並清除war包">
<!-- <copy todir="${tomcat.home}/webapps">
<fileset dir="${war.dest}">
<include name="**/*.war"/>
</fileset>
</copy> -->
</target>
<target name="clean" depends="init" description="清除打包用臨時文件">
<echo message="清理war包"></echo>
<delete dir="${war.dest}"/>
</target>
</project>
這就是一個基本的build.xml我們最重要的腳本有了,就該部署jenkins了
部署jenkins實現一鍵發佈;
構建過程和上一篇基本一致,選擇自由風格項目構建;只有一步在第四步構建—添加構建步驟選擇:invoke Ant;如果沒有這個選項同樣先去安裝插件;然後選擇在系統配置中ant即可;然後就可以構建;
對於jenkins來說不僅僅可以部署項目,還可以做自動化單元測試;生成自己想要的報告;jenkins功能強大;自己可以做一些研究,歡迎留言溝通