Ant 整合Jenkins自动构建
来源:互联网 发布:php权限管理系统demo 编辑:程序博客网 时间:2024/04/29 03:51
Jenkins安装
下载jenkins.war包,运行java -jar jenkins.war,即可访问http://localhost:8080/访问jenkins。
或者将jenkins.war包放在Tomcat的Webapp下,启动Tomcat,访问http://localhost:8080/jenkins/。
本例产用后者。
1. 在首页选择系统管理,再右侧页面中选择管理插件。
在可选插件中选择要安装的插件,下表为本次测试中已安装的插件,有些为默认已安装的插件。
插件
名称版本 启用 Pinnedmailer1.4truefalseexternal-monitor-job1.1truefalseldap1.1truefalsepam-auth1.0truefalsejavadoc1.0truefalsemaven-plugin1.499truefalseant1.1truefalseanalysis-core1.48truefalsecheckstyle3.32truefalsecvs1.6truefalsedeploy1.9truefalsejquery1.7.2-1truefalsejunit-attachments1.3truefalsessh-slaves0.22truefalsesubversion1.39truefalsetranslation1.8truefalseemail-ext2.25truefalse
2.进入jenkins首页,选择新建JOB,填写一个JOB名称,选择“构建一个自由风格的软件项目”。
然后进入配置页面,也可以首页选择项目,然后选择配置进入此页面。
本例的配置如下:
1) 源码管理选择Subversion
Repository Url:https://localhost/svn/Diary/trunk/Diary
2) 构建触发器
选择Poll SCM
日程表:* * * * * (表示每分钟都比较,有更改就构建)
3) 构建
增加构建步骤:Invoke Ant
Targets:(什么也没写,默认执行根目录下的build.xml)
4) 构建后操作
a. Publish Checkstyle analysis results
Checkstyle results:output/diary/checkstyle/checkstyle_report.xml
b. Publish JUnit test result report
Test report XMLs:output/diary/test/data/*.xml
保留长的标准输出/错误 勾选
c. Publish Javadoc
Javadoc directory:output/diary/docs
d.Deploy war/ear to a container
WAR/EAR files:output/diary/diary-1.0.0.war
Container:Tomcat 6.x
Manager user name:admin
Manager password:*****
Tomcat URL:http://localhost:8080
(此处要配置Tomcat的角色和用户:
在Tomcat的安装目录下,找到conf/tomcat-users.xml,修改内容如下:
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="admin" password="admin" roles="admin,manager"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
)
e. Editable Email Notification
Project Recipient List:要发送的邮件,可多个用逗号隔开
(此处要配置邮件服务,选择系统管理->系统设置:
Jenkins Location
Jenkins URL:http://localhost:8080/jenkins/
配置邮件通知
也可以Extended E-mail Notification中选择Override Global Settings覆盖的邮件通知。
在测试过程中,邮件通知中没有“发送者的邮箱地址”这一项,导致邮件一直不能发送,选择了Extended E-mail Notification中的Override Global Settings,在这里填写信息才将邮件发送成功。
)
附:
build.xml,增加War包:
001
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
002
<project name=
"diary"
default=
"total"
>
003
004
<tstamp>
005
<<a href=
"http://www.07net01.com/program/"
target=
"_blank"
><u>
for
</u></a>mat property=
"build.latest.dir"
pattern=
"yyyyMMddHHmmss"
/>
006
<<a href=
"http://www.07net01.com/program/"
target=
"_blank"
><u>
for
</u></a>mat property=
"build.latest.date"
pattern=
"yyyy-MM-dd"
/>
007
<
format
property=
"build.latest.time"
pattern=
"HH:mm:ss"
/>
008
</tstamp>
009
010
<property name=
"src.dir"
location=
"src"
/>
011
012
<property name=
"web.dir"
location=
"WebContent"
/>
013
014
<property name=
"we<a href="
http://www.07net01.com/linux/
" target="
_blank
"><u>bin</u></a>f.dir"
location=
"${web.dir}/WEB-INF"
/>
015
016
<property name=
"lib.dir"
location=
"${we<a href="
http://www.07net01.com/linux/
" target="
_blank
"><u>bin</u></a>f.dir}/lib"
/>
017
018
<property name=
"build.dir"
location=
"build/classes"
/>
019
020
<!-- Output -->
021
<property name=
"build.output"
location=
"output"
/>
022
023
<property name=
"build.output.dir"
location=
"${build.output}/diary"
/>
024
025
<!-- JavaDoc -->
026
<property name=
"build.output.doc.dir"
location=
"${build.output.dir}/docs"
/>
027
028
<!-- Test -->
029
<property name=
"test.dir"
location=
"test"
/>
030
031
<property name=
"build.output.test.dir"
location=
"${build.output.dir}/test"
/>
032
033
<property name=
"build.output.test.data.dir"
location=
"${build.output.test.dir}/data"
/>
034
035
<!-- CheckStyle -->
036
<property name=
"build.output.checkstyle.dir"
location=
"${build.output.dir}/checkstyle"
/>
037
038
<property name=
"checkstyle.xml"
location=
"${build.output.checkstyle.dir}/checkstyle_checks.xml"
/>
039
040
<property name=
"checkstyle.xsl"
location=
"${build.output.checkstyle.dir}/checkstyle-frames.xsl"
/>
041
042
<!-- Log -->
043
<property name=
"build.output.log"
location=
"${build.output}/output.log"
/>
044
045
<property name=
"build.output.log.verbose"
location=
"${build.output}/output_verbose.log"
/>
046
047
<property name=
"build.output.log.datetime"
value=
"http://xuxujing.iteye.com/blog/[${build.latest.date} ${build.latest.time}]"
/>
048
049
<!-- Jar -->
050
<property
file
=
"${src.dir}/base.properties"
/>
051
052
<property name=
"build.output.requires.dir"
location=
"${build.output.dir}/requires"
/>
053
054
<fileset
id
=
"compile.jar"
dir
=
"${lib.dir}"
>
055
<include name=
"commons-lang-2.4.jar"
/>
056
</fileset>
057
058
<!-- 类路径 -->
059
<path
id
=
"compile.classpath"
>
060
<fileset refid=
"compile.jar"
/>
061
</path>
062
063
<path
id
=
"test.classpath"
>
064
<path refid=
"compile.classpath"
/>
065
<pathelement location=
"${lib.dir}/junit-4.10.jar"
/>
066
<pathelement location=
"${build.dir}"
/>
067
</path>
068
069
<path
id
=
"checkstyle.classpath"
>
070
<pathelement location=
"${lib.dir}/checkstyle-5.6-all.jar"
/>
071
</path>
072
073
074
<!-- 记录日志,日志保存到文件中 -->
075
<record name=
"${build.output.log}"
append=
"no"
/>
076
077
<record name=
"${build.output.log.verbose}"
append=
"no"
loglevel=
"verbose"
/>
078
079
<target name=
"total"
depends=
"zip,war"
description=
"构建完成"
>
080
<
echo
>${build.output.log.datetime}构建完成!</
echo
>
081
</target>
082
083
<target name=
"war"
depends=
"createjar,javadoc"
description=
"生成War"
>
084
<war destfile=
"${build.output.dir}/${project.name}-${project.version}.war"
webxml=
"${webinf.dir}/web.xml"
duplicate=
"fail"
>
085
<fileset
file
=
"${web.dir}/*.jsp"
/>
086
<lib
dir
=
"${lib.dir}"
>
087
<include name=
"commons-lang-2.4.jar"
/>
088
</lib>
089
<classes
dir
=
"${build.dir}"
>
090
<include name=
"diary/**/*"
/>
091
<include name=
"${build.dir}/test.property"
/>
092
</classes>
093
</war>
094
<
echo
>${build.output.log.datetime}生成War完成!</
echo
>
095
</target>
096
097
<target name=
"zip"
depends=
"createjar,javadoc"
description=
"生成Zip"
>
098
<zip destfile=
"${build.output.dir}/${project.name}-core-${project.version}.zip"
duplicate=
"preserve"
>
099
<zipfileset
dir
=
"${build.output.dir}/docs"
prefix=
"docs"
/>
100
<zipfileset
dir
=
"${build.output.dir}/requires"
prefix=
"requires"
/>
101
<zipfileset
file
=
"${build.output.dir}/*.jar"
/>
102
</zip>
103
<
echo
>${build.output.log.datetime}生成Zip完成!</
echo
>
104
</target>
105
106
<target name=
"createjar"
depends=
"test"
description=
"生成Jar"
>
107
<manifest
file
=
"${build.output.dir}/MANIFEST.MF"
encoding=
"utf-8"
>
108
<attribute name=
"Built-By"
value=
"http://xuxujing.iteye.com/blog/${user.name}"
/>
109
<section name=
"${project.name}"
>
110
<attribute name=
"Implementation-Title"
value=
"http://xuxujing.iteye.com/blog/${project.name}"
/>
111
<attribute name=
"Implementation-Version"
value=
"http://xuxujing.iteye.com/blog/${project.version}"
/>
112
</section>
113
</manifest>
114
<jar destfile=
"${build.output.dir}/${project.name}-core-${project.version}.jar"
duplicate=
"preserve"
compress=
"false"
manifestencoding=
"utf-8"
manifest=
"${build.output.dir}/MANIFEST.MF"
>
115
<fileset
dir
=
"${build.dir}"
>
116
<exclude name=
"test/**/*"
/>
117
<exclude name=
"test"
/>
118
<exclude name=
"checkstyle_checks.xml"
/>
119
<exclude name=
"checkstyle-frames.xsl"
/>
120
<exclude name=
"checkstyletask.properties"
/>
121
<exclude name=
"sun_checks.xml"
/>
122
<exclude name=
"checkstyle_checks.xml"
/>
123
<exclude name=
"base.properties"
/>
124
</fileset>
125
</jar>
126
<copy todir=
"${build.output.requires.dir}"
>
127
<fileset refid=
"compile.jar"
/>
128
</copy>
129
<
echo
>${build.output.log.datetime}生成Jar完成!</
echo
>
130
</target>
131
132
<target name=
"javadoc"
depends=
"test"
description=
"生成JavaDoc"
>
133
<javadoc
134
sourcepath=
"${src.dir}"
135
destdir=
"${build.output.doc.dir}"
136
packagenames=
"diary.*"
137
use=
"true"
138
version=
"true"
139
windowtitle=
"${project.name}"
140
failonerror=
"true"
>
141
<classpath refid=
"compile.classpath"
/>
142
</javadoc>
143
<
echo
>${build.output.log.datetime}生成JavaDoc完成,详情可查看${build.output.doc.
dir
}/index.html!</
echo
>
144
</target>
145
146
<target name=
"test"
depends=
"compilesrc,compiletest"
description=
"批量测试,并生成html"
>
147
<junit printsummary=
"false"
haltonfailure=
"false"
errorProperty=
"test.failed"
failureProperty=
"test.failed"
>
148
<classpath refid=
"test.classpath"
/>
149
<formatter
type
=
"brief"
usefile=
"false"
/>
150
<formatter
type
=
"xml"
/>
151
<!-- 在testcase定义的情况下,单独测试testcase -->
152
<
test
name=
"${testcase}"
todir=
"${build.output.test.data.dir}"
if
=
"testcase"
/>
153
<!-- 批量测试 -->
154
<batchtest todir=
"${build.output.test.data.dir}"
unless=
"testcase"
>
155
<fileset
dir
=
"${build.dir}"
>
156
<include name=
"**/*Test.class"
/>
157
</fileset>
158
</batchtest>
159
</junit>
160
<junitreport todir=
"${build.output.test.data.dir}"
>
161
<fileset
dir
=
"${build.output.test.data.dir}"
>
162
<include name=
"TEST-*.xml"
/>
163
</fileset>
164
<report
format
=
"frames"
todir=
"${build.output.test.dir}"
/>
165
</junitreport>
166
<fail
if
=
"test.failed"
>
167
${build.output.log.datetime}批量测试,并生成html失败,详细可查看${build.output.
test
.
dir
}/index.html
168
</fail>
169
<
echo
>${build.output.log.datetime}批量测试,并生成html完成,详细可查看${build.output.
test
.
dir
}/index.html!</
echo
>
170
</target>
171
172
<target name=
"compiletest"
depends=
"copytest,compilesrc"
description=
"<a href="
http://www.07net01.com/linux/
" target="
_blank
"><u>编译</u></a>测试<a href="
http://www.07net01.com/program/
" target="
_blank
"><u>代码</u></a>文件"
>
173
<javac srcdir=
"${test.dir}"
destdir=
"${build.dir}"
includeAntRuntime=
"false"
encoding=
"UTF-8"
>
174
<include name=
"**/*.java"
/>
175
<classpath refid=
"test.classpath"
/>
176
</javac>
177
<
echo
>${build.output.log.datetime}<a href=
"http://www.07net01.com/linux/"
target=
"_blank"
><u>编译</u></a>测试<a href=
"http://www.07net01.com/program/"
target=
"_blank"
><u>代码</u></a>文件完成!</
echo
>
178
</target>
179
180
<target name=
"copytest"
depends=
"init"
description=
"复制测试代码资源文件到编译目录"
>
181
<fileset
dir
=
"${test.dir}"
>
182
<exclude name=
"**/*.java"
/>
183
</fileset>
184
<
echo
>${build.output.log.datetime}复制测试代码资源文件到编译目录完成!</
echo
>
185
</target>
186
187
<target name=
"compilesrc"
depends=
"checkstyle,copysrc"
description=
"编译源代码文件"
>
188
<javac srcdir=
"${src.dir}"
destdir=
"${build.dir}"
includeAntRuntime=
"false"
encoding=
"UTF-8"
>
189
<include name=
"**/*.java"
/>
190
<classpath refid=
"compile.classpath"
/>
191
</javac>
192
<
echo
>${build.output.log.datetime}编译源代码文件完成!</
echo
>
193
</target>
194
195
<target name=
"copysrc"
depends=
"init"
description=
"复制源代码资源文件到编译目录"
>
196
<copy todir=
"${build.dir}"
includeemptydirs=
"false"
>
197
<fileset
dir
=
"${src.dir}"
>
198
<exclude name=
"**/*.java"
/>
199
</fileset>
200
</copy>
201
<
echo
>${build.output.log.datetime}复制源代码资源文件到编译目录完成!</
echo
>
202
</target>
203
204
<target name=
"checkstyle"
depends=
"init"
description=
"用Checkstyle校验源代码"
>
205
<taskdef name=
"checkstyle"
classname=
"com.puppycrawl.tools.checkstyle.CheckStyleTask"
classpathref=
"http://xuxujing.iteye.com/blog/checkstyle.classpath"
/>
206
<checkstyle
207
failOnViolation=
"false"
208
failureProperty=
"checkstyle.failed"
209
config=
"${src.dir}/sun_checks.xml"
>
210
<fileset
dir
=
"${src.dir}"
includes=
"**/*.java"
/>
211
<formatter
type
=
"plain"
/>
212
<formatter
type
=
"xml"
toFile=
"${build.output.checkstyle.dir}/checkstyle_report.xml"
/>
213
</checkstyle>
214
<xslt style=
"${checkstyle.xsl}"
215
in
=
"${build.output.checkstyle.dir}/checkstyle_report.xml"
216
out=
"${build.output.checkstyle.dir}/checkstyle_report.html"
>
217
</xslt>
218
<
echo
>${build.output.log.datetime}用Checkstyle校验源代码完成,详细信息查看${build.output.checkstyle.
dir
}/checkstyle_report.html!</
echo
>
219
</target>
220
221
<target name=
"init"
depends=
"clean,cleanoutput"
description=
"创建输出目录"
>
222
<
mkdir
dir
=
"${build.dir}"
/>
223
<
mkdir
dir
=
"${build.output.dir}"
/>
224
<
mkdir
dir
=
"${build.output.doc.dir}"
/>
225
<
mkdir
dir
=
"${build.output.test.dir}"
/>
226
<
mkdir
dir
=
"${build.output.test.data.dir}"
/>
227
<
mkdir
dir
=
"${build.output.checkstyle.dir}"
/>
228
<copy todir=
"${build.output.checkstyle.dir}"
overwrite=
"true"
>
229
<fileset
dir
=
"${src.dir}"
>
230
<include name=
"checkstyle-frames.xsl"
/>
231
<include name=
"checkstyle_checks.xml"
/>
232
</fileset>
233
<filterset>
234
<filter token=
"output.dir"
value=
"http://xuxujing.iteye.com/blog/${build.output.checkstyle.dir}"
/>
235
</filterset>
236
</copy>
237
<
echo
>${build.output.log.datetime}输出目录创建完成!</
echo
>
238
</target>
239
240
<target name=
"clean"
description=
"清理编译目录"
>
241
<delete includeemptydirs=
"true"
>
242
<fileset
dir
=
"${build.dir}"
>
243
<include name=
"**/*"
/>
244
</fileset>
245
</delete>
246
<
echo
>${build.output.log.datetime}编译目录清理完成!</
echo
>
247
</target>
248
249
<target name=
"cleanoutput"
description=
"清理输出目录"
>
250
<delete includeemptydirs=
"true"
>
251
<fileset
dir
=
"${build.output}"
>
252
<exclude name=
"output*.log"
/>
253
</fileset>
254
</delete>
255
<
echo
>${build.output.log.datetime}输出目录清理完成!</
echo
>
256
</target>
257
258
</project>
输出:
构建出错后的输出,会发送邮件到指定邮箱:
01
控制台输出
02
03
Started by user anonymous
04
Building
in
workspace C:\Users\xujing\.jenkins\jobs\Diary\workspace
05
Updating https://localhost/svn/Diary/trunk/Diary
06
At revision 20
07
no change
for
https://localhost/svn/Diary/trunk/Diary since the previous build
08
No emails were triggered.
09
[workspace] $ cmd.exe /C
'"ant.bat && exit %%ERRORLEVEL%%"'
10
Buildfile: C:\Users\xujing\.jenkins\jobs\Diary\workspace\build.xml
11
12
clean:
13
[
echo
] [2013-01-21 15:50:49] 编译目录清理完成!
14
15
cleanoutput:
16
[
echo
] [2013-01-21 15:50:49] 输出目录清理完成!
17
18
init:
19
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary
20
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\docs
21
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\
test
22
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\
test
\data
23
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\checkstyle
24
[copy] Copying 2 files to C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\checkstyle
25
[
echo
] [2013-01-21 15:50:49] 输出目录创建完成!
26
27
checkstyle:
28
[checkstyle] Running Checkstyle 5.6 name=
"code"
>控制台输出
29
30
Started by user anonymous
31
Building
in
workspace C:\Users\xujing\.jenkins\jobs\Diary\workspace
32
Updating https://localhost/svn/Diary/trunk/Diary
33
At revision 21
34
no change
for
https://localhost/svn/Diary/trunk/Diary since the previous build
35
No emails were triggered.
36
[workspace] $ cmd.exe /C
'"ant.bat && exit %%ERRORLEVEL%%"'
37
Buildfile: C:\Users\xujing\.jenkins\jobs\Diary\workspace\build.xml
38
39
clean:
40
[
echo
] [2013-01-21 16:21:25] 编译目录清理完成!
41
42
cleanoutput:
43
[
echo
] [2013-01-21 16:21:25] 输出目录清理完成!
44
45
init:
46
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary
47
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\docs
48
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\
test
49
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\
test
\data
50
[
mkdir
] Created
dir
: C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\checkstyle
51
[copy] Copying 2 files to C:\Users\xujing\.jenkins\jobs\Diary\workspace\output\diary\checkstyle
52
[
echo
] [2013-01-21 16:21:25] 输出目录创建完成!
53
54
checkstyle:
55
[checkstyle] Running Checkstyle 5.6>
56
57
58
<ul>
59
<li>Diary.zip (3.1 MB)</li>
60
61
<li>下载次数: 0</li>
62
</ul>
63
64
65
66
67
68
69
70
71
72
73
<center><div style=
"margin:10px 0 25px 0"
>
74
<script
type
=
"text/javascript"
>
75
/*500*200,创建于2013-4-2 07net01 文章内部下*/
76
var cpro_id =
"u1251111"
;
77
</script>
78
<script src=
"http://cpro.baidustatic.com/cpro/ui/c.js"
type
=
"text/javascript"
></script><script
type
=
"text/javascript"
charset=
"utf-8"
src=
"http://pos.baidu.com/ecom?di=u1251111&dcb=BAIDU_CPRO_SETJSONADSLOT&dtm=BAIDU_CPRO_SETJSONADSLOT&dai=3&jn=3<u=http%3A%2F%2Fwww.07net01.com%2Flinux%2FAnt_zhengheJenkinszidonggoujian_57351_1358757090.html&liu=http%3A%2F%2Fwww.07net01.com%2Flinux%2FAnt_zhengheJenkinszidonggoujian_57351_1358757090.html<r=&ps=13016x477&psr=1280x1024&par=1280x964&pcs=1263x879&pss=1263x13045&pis=1263x879&cfv=11&ccd=32&col=zh-CN&cec=GBK&tpr=1375323854180&kl=&dis=16"
></script><div style=
"display:none"
>-</div> <iframe
id
=
"cproIframe3"
src=
"http://cpro.baidu.com/cpro/ui/uijs.php?rs=0&tu=u1251111&tn=text_default_500_200&n=bbc12000_cpr&adn=4&rsi1=200&rsi0=500&rad=&rss0=%23FFFFFF&rss1=%23FFFFFF&conOP=0&rss2=%230000ff&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rsi5=1&ts=1&at=97&ch=0&cad=1&aurl=&rss7=&cpa=1&fv=11&cn=0&if=16&word=http%3A%2F%2Fwww.07net01.com%2Flinux%2FAnt_zhengheJenkinszidonggoujian_57351_1358757090.html&refer=&ready=1&jk=9aa0b9cc58595182&jn=3&lmt=1369030066&csp=1280,1024&csn=1280,964&ccd=32&chi=19&cja=true&cpl=36&cmi=52&cce=true&csl=zh-CN&did=3&rt=8&dt=1375323855&pn=32:4|baiduTlinkInlay:text_default_960_90|103:103&ev=67108864&c01=0&prt=1375323854180&i3=f&anatp=0&stid=0&lunum=6&scale=&skin="
width=
"500"
height=
"200"
align=
"center,center"
marginwidth=
"0"
marginheight=
"0"
scrolling=
"no"
frameborder=
"0"
allowtransparency=
"true"
></iframe>
79
</div></center>
80
<p>编译:<a href=
"http://www.07net01.com/linux/Ant_zhengheJenkinszidonggoujian_57351_1358757090.html"
>Ant 整合Jenkins自动构建</a></p> <p>地址:<a style=
"font-size:12px;font-family:'宋体'"
href=
"http://www.07net01.com/linux/Ant_zhengheJenkinszidonggoujian_57351_1358757090.html"
>http://www.07net01.com/linux/Ant_zhengheJenkinszidonggoujian_57351_1358757090.html</a></p><p></p>
- Ant 整合Jenkins自动构建
- Windows下简易Jenkins构建Android自动打包 - Ant
- 整合ANT构建文件
- Jenkins自动构建
- C# Jenkins 自动构建
- jenkins 自动构建项目
- jenkins 自动构建
- jenkins自动构建
- Jenkins-android自动构建
- Jenkins-iOS自动构建
- Jenkins-iOS自动构建
- SpringBoot Jenkins自动构建
- Jenkins实现自动构建
- Jenkins SVN自动构建
- Ant自动构建脚本!
- ant自动构建
- Flex Ant自动构建
- Flex Ant自动构建
- And Then There Was One - POJ 3517 递推
- 拓扑排序-字典序
- HttpClient 下载一张图片
- 第一轮 J
- Charm Bracelet(poj3624)(01背包)
- Ant 整合Jenkins自动构建
- Linux及Arm-Linux程序开发笔记(零基础入门篇)
- 通过Http协议获取JSON
- Cocos2D IOS 环境搭建
- 数学之美系列二十二:由电视剧《暗算》所想到的 — 谈谈密码学的数学原理
- SlidingPanelLayout与ViewPager滑动冲突的解决方法
- 第一轮 D
- 安装oracle时出现不满足256色的错误解决方法
- 教你怎么使用apilication—纪念火影-->影子模仿术