Hudson+Maven+Svn搭建持续集成环境
一、所用开发工具
1. Hudson: Hudson 是一种革命性的开放源码 CI 服务器,它从以前的 CI服务器吸取了许多经验 教训。Hudson 最吸引人的特性之一是它很容易配置:很难找到更容易设置的 CI 服务器,也很难找到开箱即用特性如此丰富的CI 服务器。Hudson 容易使用的第二个原因是它具有强大的插件框架 ,所以很容易添加特性,例如添加tomcat插件后,可以方将build好的war包方便的部署到Tomcat里。下载地址:http://hudson-ci.org/
2. Maven2:Maven 是一个顶级的 Apache Software Foundation 开源项目,创建它最初是为了管理 Jakarta Turbine 项目复杂的构建过程。从那以后,不论是开源开发项目还是私有开发项目都选择 Maven 作为项目构建系统。下载地址:http://maven.apache.org/download.html
3. Subversion(svn):版本控制软件,和它功能相似的工具有cvs,perforce等。下载地址:http://www.subversion.org.cn/
4. Hudson的自动部署插件,下载地址::https://hudson.dev.java.net/files/documents/2402/106347/deploy.hpi
二、工具的安装及设置
1. Maven2的安装:把maven-2.0.4-bin.zip解压到D:\maven-2.0.4(或者你自己想解压的位置,我是如此配置的)下面就是配置环境变量了,这和1.0的版本是一样的。(1)MAVEN_HOME:D:\maven-2.0.4 (2)在Path 中加入%MAVEN_HOME%\bin
这样配置就OK了。测试是否安装成功,可以在命令行下输入mvn -v,出现如下界面,说明安装成功

2. Hudson的安装:Hudson的安装有两种方式(1)可以将Hudson部署到Tomcat下面运行,将下载的hudson.war直接放到Tomcat的webapp下,启动tomcat就ok了
(2)可以使用命令启动hudson。步骤:首先下载hudson.war,然后可以在一个盘符下建立一个文件夹,如D:\hudson(自己可以随意建立),然后将这个路径设置环境变量(别说你不会设置环境变量哦),Hudson_Home=D:\hudson,最后使用命令java -jar hudson.war启动hudson
3. Svn的安装:svn的安装比较简单,下载好安装文件后,一路next即可。
三、Maven2+Hudson+Svn的集成
这里比较重要了,这三样的结合主要就是在这里来进行配置的,而Maven2和Svn的配置都是依赖于Hudson的,所以重点讲讲Hudson的配置
1. Hudson的配置
用上述的Hudson的安装方法安装好Hudson后,就可以通过浏览器http://localhost:8080/hudson来打开Hudson的页面了,如下(如果你已经build过工程的话,会在这里显示出来哪些成功了,哪些失败了)

2. Hudson的全局配置
接下来要对Hudson进行全局设置了,点击左边列表菜单Manage Hudson,然后点击Configure System。可以对hudson进行系统配置,包括全局路径和变量设置等。如下图

(1):System Message 当然了这是表面的东西啦,你可以写点随意的东西,比如HelloHudson啊,然后弄个Logo图片什么的,它也支持HTML语言,可以把这个欢迎界面弄的相当漂亮,不详述。
(2):Quiet period 这个值是表示你可以让你的构建有等待时间,以防止在提交代码的过程中去开始构建。这里是全局的变量,我习惯在每个项目里面去设定,因为我使用hudson搭建的项目有SVN的还有VSS的,这个等待时间的值肯定会不一样。(如果你想在这里设置可以查看右边的“帮助”)
(3):Enable security 这里是hudson权限的相应设置,选择该项后,如下图:
这里可以保留默认设置,如果你想对每个用户进行相应的权限操作,选择Authorization项下的Project-based Matrix Authorization Strategy这个选项就可以进行相应的设置了,如下图所示:

这里可以保留默认设置,如果你想对每个用户进行相应的权限操作,选择Authorization项下的Project-based Matrix Authorization Strategy这个选项就可以进行相应的设置了,如下图所示:

(4)Global properties这块设置默认即可
(5)Maven这里的设置,就是取个名字,然后路径中指定maven2的解压路径。如下图所示

在这里设置时,我一般去掉Install automatically,而是直接指定MAVEN_HOME,我的maven是装在C:\Program Files\apache-maven-2.2.1-bin\apache-maven-2.2.1(依个人设置)这里的,直接填入即可。
(6)JDK设置
Jdk的设置是必须的,如果你在这里没有设置jdk的路径的话,在build工程的时候有可能会报这个错误,如下图所示,

所以正确的设置也是去掉Install automatically选项,直接填写名称和 JAVA_HOME
我的JAVA_HOME是安装在C:\Java\jdk1.6.0_02这里的,所以直接填入即可。填写好的JDK设置如下图:

(7)shell,Ant,Maven,CVS等等,这些可以不用设定。这里就不做介绍啦,如果想了解的更深,右边的“help”(右边的蓝色小问号)会有很大的帮助。
(8):E-mail Notification 这个主要是邮件提醒,可以不用设置,要感兴趣的话,可以这样设置,具体参考右边的蓝色小问号。
SMTP server-->mail服务器地址(127.0.0.1)
Default user e-mail suffix-->邮件的后缀名(@123.com)
System Admin E-mail Address-->管理员用户的邮件帐号123@123.com
Hudson URL-->访问hudson的URL(http://127.0.0.1:8080)
至此,Hudson的全局配置就差不多了…...
3. 开始创建job
点击左侧列表菜单的New Job,出现如下界面
填写Job name,然后选中Build a maven2 project,依个人项目设定,这里讲Maven2的工程,点击OK按钮。进入job的设置页面(这里是重点,在这里我们可以看到Hudson的伟大,如何将Maven2的工程以及Svn集成起来)如下图所示

(1): Project Name 在你建立项目的时候已经取过名字了,TestJob.如果你哪天想改名字,就在这里改就可以了.
(2): Description 这里主要是写对TestJob这个项目的描述,可以写项目的参与者,项目起止日期等等,可以说这个地方是美化界面+项目描述+提示信息等等,我对于界面美化没有太多的要求,这个就留给大家去研究啦.
(3): Discard Old Builds 建议开启这个选项(hudson有一个选项,可以从SVN上check out项目,但这个项目的位置好像只能是%hudson_home%/jobs/projectname/workspace下面,本人认为这是一个不合理的方式,因为很正常的大家都会在自己的目录下建立项目后,然后再用hudson去构建环境。
Advanced Project Options: 这里是表示你可以对你的项目构建进行一定的设置,它下面包括两个小的选项,
(1).Quiet period: 时间可以根据项目的需要来设定。哦,差点忘了,这里的这个时间是说明从构建开始到项目真正开始构建之间的时间差,比如,我将此时间设为300S,说明TestJob在要开始构建之前会有5分钟的时间缓冲,这个是非常人性化的,因为如果有大量的代码需要提交,会需要很长时间,如果没有等待时间的话很容易出现少代码的情况导致整个构建过程的失败。
(2).Use custom workspace:这个地方你可以将可以对外公布的东西放在一个特定的目录下,然后把这里的值设成该目录,如:D:\hudson\jobs\TestJob\builds这样的话,这个目录下的东西是就公共的了。
Source Code Management:呵呵,这里就是要结合版本控制工具的地方了,这里就看你选用的是那种工具了,我用的是svn,所以设置如下
在Repository URL里填入你的仓库地址,svn有两种地址,一种是http://.....这样的,一种是svn://......的,我这里是用的第二种方式,所以填入svn://192.168.0.245:56581/mydemo
(注意,这里是工程的根目录,也就是pom.xml所在的目录,你可不要填写成svn://192.168.0.245:56581/demo/src等的目录了。要注意哦!!!)
Use update: 这里选项勾上后,每次检测到库上有更新,就会使用svn update命令;如果没有勾上的话,那每次使用的是svn checkout命令,理由是update要比checkout命令省相当多的时间。
Build Triggers:可以理解为你想以什么样的方式去触发你的构建,以其它构建成功后为基础,还是周期性的构建,还是根据poll SCM(变更触发)来触发构建。
我习惯选择 Build periodically,并在Schedule中输入 0 12,20 * * *。
注: Schedule的配置规则是有5个空格隔开的字符组成,从左到右分别代表:分 时 天 月 年。*代表所有,具体参考右面的蓝色小问号
0 12,20 * * * 表示在任何年任何月的任何天的12和20点的0分 进行构建
Build和Build Settings没有什么特殊的设置,可以不用设置
Post-build Actions:这里也可以说是做一些发布啊,善后啊之类的,可以看到有mail, artifacts, publish之类的。
☆Hudson的自动部署:
一般我们build成功一个项目后,Hudson会在%Hudson_home%/jobs/projecct_name/ workspace/ projecct_name/ target下发布一个项目的war包。(注释:project_name是你的项目名称,Hudson_home一般在C:\Documents and Settings\username\.hudson下。其中username是你当前的系统用户,有来宾账户或者administrator等。呵呵,注释是不是很无聊啊,为普及用,见谅。)但是我们想build成功后,就要看到我们项目进展的怎么样了,就想通过Tomcat来加载这个war包直接看效果,这时,我们不得不手动的把这个war包拷贝到Tomcat的webapp下,然后启动Tomcat。很麻烦吧,这里介绍的就是这种简单的自动部署方法,可以通过Hudson的一个插件,呵呵,现在前面提到的那个插件就起大作用了。点击左侧列表菜单Manage Hudson,然后选择第三项Manage Plugins,这个选项的功能是管理Hudson插件的,(或者直接输入:http://localhost:8080/hudson/pluginManager/)在这里说明了Hudson的扩展性有多么的强大,在插件管理中心点击Advanced,在upload plugin 中上传刚才下载的插件,上传完毕后需要重启hudson才能完成安装(即重启tomcat),重启后点击New Job后,然后建立一个新的Job时(已有的项目,直接点击进入项目,然后点左侧的功能菜单configure),在配置页面的Post-build Actions项下面会多出一项功能:Deploy war/ear to a container,在这里WAR/EAR file:就是填写hudson所打好的war包路径,之前说过,hudson打好的war包是放在这里的,所以这里就写%Hudson_home%/jobs/projecct_name/ workspace/ projecct_name/ target/你的war文件的名称.war。Container选择你的Tomcat的版本。Manager user name:填写Tomcat的用户名,默认是admin, Manager password:填写Tomcat的密码,默认是空。Tomcat URL:填写http://localhost:8080/就ok了,至此保存就可以了,这样,当你再build此工程的时候,war文件会自动部署到你的tomcat的webapp目录下。设置如下图所示

Ok,最基本的快速的配置到这里就完了,大家觉得有用或者有问题的话,记得留言哦!!!!
顶
踩
评论
- no change for http://repo.glarygroup.com/brand/trunk/core since the previous build
- ERROR: A Maven installation needs to be available for this project to be built.
- Either your server has no Maven installations defined, or the requested Maven version does not exist.
- [DEBUG] Skipping watched dependency update for build: core-compile #10 due to result: FAILURE
- Finished: FAILURE
请楼主帮忙看看。。。
QQ:398260301
no change for http://repo.glarygroup.com/brand/trunk/core since the previous build
ERROR: A Maven installation needs to be available for this project to be built.
Either your server has no Maven installations defined, or the requested Maven version does not exist.
[DEBUG] Skipping watched dependency update for build: core-compile #10 due to result: FAILURE
Finished: FAILURE
QQ:398260301
Parsing POMs
ERROR: No such file D:\Program\Hudson\HudsonHome\jobs\MyMaven2testjob\workspace\pom.xml
Perhaps you need to specify the correct POM file path in the project configuration?
Finished: FAILURE
弄了好久(查了很久没弄明白).....
以前没用过自动构建工具也没用过CI,不知道这个pom.xml
文件干嘛用的,怎么生成的(自动还是手工配置),你给3楼回的那个我仔细看了,我的svn路径是项目目录下,是没有错的,我项目根目录下(src下)也没有那个pom.xml文件。好像就没见过这个东西
还望楼主给指教指教,非常感谢!
没有 pom.xml? 问题应该是这样的 。
采用 Maven 方式,自动构建。需要你的项目本身就是 添加了 maven支持的。
这样才会有 pom.xml。(eclipse 新建项目,下面不是有 添加 maven的选项么。)
在C:\Documents and Settings\Administrator\.hudson\jobs\目录下的workspace文件里有你的发布的工程把工程里的pom.xml文件向上级目录拷贝,再修改pom.xml文件中maven-war-plugin <directory></directory>路径加上上一级目录
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19 seconds
[INFO] Finished at: Thu Jun 24 20:28:03 CST 2010
[INFO] Final Memory: 28M/127M
[INFO] ------------------------------------------------------------------------
channel stopped
Finished: SUCCES
然后后面就没有,不知道是怎么回事,
Deply的网上有人说1.5的plugin不成功,换成1.4就成功了,可能换成1.4也是一样,没有开始Deply,不知道是怎么回事
比如:projectA,projectB,projectC,projectD
projectB要引用projectA
projectC要引用projectA
projectD要引用projectB,projectC
这种时候我该怎么去集成呢?
Parsing POMs
ERROR: No such file D:\Program\Hudson\HudsonHome\jobs\MyMaven2testjob\workspace\pom.xml
Perhaps you need to specify the correct POM file path in the project configuration?
Finished: FAILURE
弄了好久(查了很久没弄明白).....
以前没用过自动构建工具也没用过CI,不知道这个pom.xml
文件干嘛用的,怎么生成的(自动还是手工配置),你给3楼回的那个我仔细看了,我的svn路径是项目目录下,是没有错的,我项目根目录下(src下)也没有那个pom.xml文件。好像就没见过这个东西
还望楼主给指教指教,非常感谢!
没有 pom.xml? 问题应该是这样的 。
采用 Maven 方式,自动构建。需要你的项目本身就是 添加了 maven支持的。
这样才会有 pom.xml。(eclipse 新建项目,下面不是有 添加 maven的选项么。)
Parsing POMs
ERROR: No such file D:\Program\Hudson\HudsonHome\jobs\MyMaven2testjob\workspace\pom.xml
Perhaps you need to specify the correct POM file path in the project configuration?
Finished: FAILURE
弄了好久(查了很久没弄明白).....
以前没用过自动构建工具也没用过CI,不知道这个pom.xml
文件干嘛用的,怎么生成的(自动还是手工配置),你给3楼回的那个我仔细看了,我的svn路径是项目目录下,是没有错的,我项目根目录下(src下)也没有那个pom.xml文件。好像就没见过这个东西
还望楼主给指教指教,非常感谢!
没有 pom.xml? 问题应该是这样的 。
采用 Maven 方式,自动构建。需要你的项目本身就是 添加了 maven支持的。
这样才会有 pom.xml。(eclipse 新建项目,下面不是有 添加 maven的选项么。)
是这样,要加入maven支持的,在eclipse创建项目的时候,下面有添加maven支持的选项,这样创建出来的项目就有pom.xml了,这个pom.xml里记录了项目的配置情况,以及引入jar文件的情况等
Parsing POMs
ERROR: No such file D:\Program\Hudson\HudsonHome\jobs\MyMaven2testjob\workspace\pom.xml
Perhaps you need to specify the correct POM file path in the project configuration?
Finished: FAILURE
弄了好久(查了很久没弄明白).....
以前没用过自动构建工具也没用过CI,不知道这个pom.xml
文件干嘛用的,怎么生成的(自动还是手工配置),你给3楼回的那个我仔细看了,我的svn路径是项目目录下,是没有错的,我项目根目录下(src下)也没有那个pom.xml文件。好像就没见过这个东西
还望楼主给指教指教,非常感谢!
没有 pom.xml? 问题应该是这样的 。
采用 Maven 方式,自动构建。需要你的项目本身就是 添加了 maven支持的。
这样才会有 pom.xml。(eclipse 新建项目,下面不是有 添加 maven的选项么。)
Parsing POMs
ERROR: No such file D:\Program\Hudson\HudsonHome\jobs\MyMaven2testjob\workspace\pom.xml
Perhaps you need to specify the correct POM file path in the project configuration?
Finished: FAILURE
弄了好久(查了很久没弄明白).....
以前没用过自动构建工具也没用过CI,不知道这个pom.xml
文件干嘛用的,怎么生成的(自动还是手工配置),你给3楼回的那个我仔细看了,我的svn路径是项目目录下,是没有错的,我项目根目录下(src下)也没有那个pom.xml文件。好像就没见过这个东西
还望楼主给指教指教,非常感谢!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19 seconds
[INFO] Finished at: Thu Jun 24 20:28:03 CST 2010
[INFO] Final Memory: 28M/127M
[INFO] ------------------------------------------------------------------------
channel stopped
Finished: SUCCES
然后后面就没有,不知道是怎么回事,
Deply的网上有人说1.5的plugin不成功,换成1.4就成功了,可能换成1.4也是一样,没有开始Deply,不知道是怎么回事
Hudson 的构建日志如下:
Started by timer
Updating svn://192.168.1.15/abc
At revision 8
no change for svn://192.168.1.15/abc since the previous build
Parsing POMs
ERROR: No such file C:\Documents and Settings\Administrator\.hudson\jobs\abc\workspace\abc\pom.xml
Perhaps you need to specify the correct POM file path in the project configuration?[8mha:AAAAWB+LCAAAAAAAAABb85aBtbiIQSmjNKU4P08vOT+vOD8nVc8DzHWtSE4tKMnMz/PLL0ldFVf2c+b/lb5MDAwVRQxSaBqcITRIIQMEMIIUFgAAckCEiWAAAAA=[0mFinished: FAILURE
好像是没有pom.xml文件,
但是 Maven 已经按着咱们上面所说的步骤 安装好了啊?
还望楼主给指点指点。。
请确定你的svn的访问地址的当前目录下存在pom.xml,也就是说svn的访问地址不是你的工程的上级目录或者下级目录,就是工程的根目录。
例如:你的工程叫AAA,那么保证你的svn访问地址就是AAA,而不是/AAA/BBB
Hudson 的构建日志如下:
Started by timer
Updating svn://192.168.1.15/abc
At revision 8
no change for svn://192.168.1.15/abc since the previous build
Parsing POMs
ERROR: No such file C:\Documents and Settings\Administrator\.hudson\jobs\abc\workspace\abc\pom.xml
Perhaps you need to specify the correct POM file path in the project configuration?[8mha:AAAAWB+LCAAAAAAAAABb85aBtbiIQSmjNKU4P08vOT+vOD8nVc8DzHWtSE4tKMnMz/PLL0ldFVf2c+b/lb5MDAwVRQxSaBqcITRIIQMEMIIUFgAAckCEiWAAAAA=[0mFinished: FAILURE
好像是没有pom.xml文件,
但是 Maven 已经按着咱们上面所说的步骤 安装好了啊?
还望楼主给指点指点。。
hudson是不是默认使用启动tomcat应用的用户作为连接SVN的用户?
(1)SVN的用户名密码是在建立你的仓库后,在仓库下的conf目录
修改svnserve.conf:
# [general]
# password-db = passwd
改为:
[general]
password-db = passwd
然后修改同目录的passwd文件,去掉下面三行的注释:
# [users]
# harry = harryssecret
# sally = sallyssecret
最后变成:
[users]
harry = harryssecret
sally = sallyssecret
在passwd文件中,“=”前的字符就是用户名,后面的就是密码。还要注意“[users]”前面的注释“#”一定要删除掉。具体参考:
http://www.subversion.org.cn/?action-viewnews-itemid-1
(2)svn有自己设定用户和密码的地方,所以不是使用tomcat的用户。
hudson是不是默认使用启动tomcat应用的用户作为连接SVN的用户?
Hudson+Maven+Svn搭建持续集成环境的更多相关文章
- Docker+Jenkins+Maven+SVN搭建持续集成环境
Docker+Jenkins+Maven+SVN搭建持续集成环境 环境拓扑图(实验项目使用PHP环境) 发布流程图 环境说明 系统:Centos 7.4 x64 Docker版本:18.09.0 Ma ...
- Jenkins+Maven+Svn搭建持续集成环境持续集成和自动部署
Jenkins和Hudson有很深的渊源,Jenkins目前更新频繁,目前选用Jenkins为持续集成工具和自动部署 Jenkins的使用有很多的介绍,主要记录如下要点: 192.168.1.240: ...
- Docker+Teamcity+Maven+SVN搭建持续集成环境
这是使用Jenkins作为CI/CD工具,Teamcity的作用是相同的.
- selenium+jenkins+maven+testNG搭建持续集成环境
为了简明起见,分几大部分,很基础的细节就不详述了 一·安装jenkins 二·创建一个maven项目的job 2.1 填上SVN的Repository URL 2.2 由于是在本地执行maven ...
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
前言 上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...
- Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以 ...
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境
前言 但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A和B都习 ...
- Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境
使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一) 2015-01-14 20:28 by 飘扬的红领巾, 4322 阅读, 5 评论, 收藏, 编辑 ...
- 用MSBuild和Jenkins搭建持续集成环境(2)
http://www.infoq.com/cn/articles/MSBuild-2 作者 Mustafa Saeed Haji Ali ,译者 李剑 发布于 2012年10月23日 | 注意: ...
随机推荐
- 爬虫(heritrix框架)
Heritrix 下载 目前 Heritrix 的最新版本是 1.14.4(2010-5-10 发布),您可以从 SourceForge(http://sourceforge.net/projects ...
- 拆分字段优化SQL
拆分字段优化SQL 今天看到一条用函数处理连接的SQL,是群里某位网友的,SQL语句如下: SELECT SO_Order.fdate , SO_Order.fsn FROM so_order INN ...
- 五通信算法:五种编码增益比较matlab模拟
1. 卷积编码增益性能.BER 信道环境:AWGN 信噪比SNR :0:0.1:6 MATALB仿真架构:源比特 +卷积码 +BPSK +AWGN +Viterbi +BER 说明:卷积编码,不同的R ...
- PHP第三个教训 PHP基本数据类型
学习平台: 1.php七种变量类型 2.isset和empty到这两个功能区分 3.型式试验 4.自己主动类型转换 5.类型转换 注意: 1.通过 变量->方法名 来调用. $user1 = ...
- easyUI的combobox实现级联
先简介下combobox: easyUI重写了select,取而代之的是combobox,有例如以下几种方式能够创建一个combobox 1.使用select标签,并加上class="eas ...
- ruby简单的基本 6
模 像类似的模块,那里 class method 和 instance method.module 没有new不能生成对象的例子其中 class method 所谓的模块在模块化的方法,它能够直接调用 ...
- CocoaPods停在Analyzing dependencies解决方案
现在很多开源项目应用cocoapod.这使集成第三方库都非常方便,在没有花project里设置哪些参数.仗着. 只要运行pod update要么pod install时间,经常会卡在Analyzing ...
- MySql创建一个存储过程
MySQL 存储过程是从 MySQL 5.0 新功能.存储过程的长处有一箩筐.只是最基本的还是运行效率和SQL 代码封装. 特别是 SQL 代码封装功能,假设没有存储过程,在外部程序訪问数据库时(比如 ...
- BIZTALK项目中WEB引用WEBSERVICES服务时候报错
近期工作中须要完毕通过BIZTALK完毕调用WEBLOGIC公布的WebServices服务,环境搭建好后,打开VS开发工具新建一个BIZTALK项目,加入WEB引用将对方公布的地址拷贝上去,能够正常 ...
- ASP.NET MVC 文件上传和路径处理
ASP.NET MVC 文件上传和路径处理总结 目录 文件的上传和路径处理必须解决下面列出的实际问题: 1.重复文件处理 2.单独文件上传 3.编辑器中文件上传 4.处理文章中的图片路径 5.处理上传 ...