velocity 未列入文档的秘密
Velocity小技巧
今天,在Velocity模板对i18n字符串进行处理,需要转换小写和将空格替换为下划线。一般情况下,从java代码中通过Context传递是最简单的,但是有的情况,不现实。在CC的模板中,就有这样的情况
下面是一个在模板中实现字符串转换的具体例子:
#set( $tab_title = "#springMessage('Build.Log')" )
<div id="$tab_title.toLowerCase().replace(' ', '_')" class="widget"
$log_extra_attrs>
<h2>$tab_title</h2>
<span class="logfile"><a
href="$req.getContextPath()/tab/build/download/log/$projectName/$logfile">#springMessage('Download.log')
</a></span>
</div>
Velocity
Velocity是基于Java的模板引擎。它允许Web页面开发者引用Java代码中定义的方法。Web设计者可以和Java程序开发者并行开发遵循MVC模式的Web站点。这意味着,Web设计者可以将精力放在好的Web站点设计上,而Java程序开发者可以将精力放在编写代码上。Velocity将Java代码从Web页面中分离,使Web站点更具长期可维护性,并提供了一种替代JSP或PHP的方案
如果有感兴趣的可以看看 Velocity英文文档 .
| 这篇文章由 崔 锐 于 2010年1月13日 - 21:06发表,分类于 技术文章, 持续集成。您可以通过 RSS 2.0 来订阅对该条目的回复。 也可以发表评论或引用到你的网站。 |
还没有评论。
还没有引用。
Nutch 深度的测试
大约5月前 - 没有评论
今天下午我做了一个Nutch深度的测试。先在apache2下建立一个小网站,这个网站用Git作版本控制工具,它只有5个网页,分别是a.html,b.html,c.html,d.html,index.html。它们的链接关系index.html中有a.html,a.html有b.html,依次类推。
这五个网页分别有各自的特殊字符
页面
特殊字符
index.html
首页
a.html
三国演义
b.html
西游记
c.html
群英汇
d.html
红楼梦
这期间发生一个小插曲,我开始用nutch爬起这个小网站,结果什么都搜不到。我反复折腾,最后总算对比其他网页才知道错在哪。原因就是开始我图简单就少写了meta标签,所以总是搜不到。看来下一次要好好研究研究nutch的字符编码问题:
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
下面正式开始测试,先写个Rakefile,这样就可以简化操作:
depth=1
task:default => [:search]
task:crawl do
sh “bin/nutch crawl myurl -dir crawl/ -depth #{depth} -threads 10″
end
task:search => [:crawl] do
sh ‘rm -rf ../crawl’
sh ‘mv crawl ../’
sh ’sudo /etc/init.d/tomcat6 restart’
end
修改depth的值,依次从1-5,分别执行rake,搜诉网页上的特殊字符结果如下:
depth
首页
三国演义
西游记
群英汇
红楼梦
1
可以
2
可以
可以
3
可以
可以
可以
4
可以
可以
可以
可以
5
可以
可以
可以
可以
可以
nutch的深度是依据链接的,这样设计的爬虫容易控制。
剥离CruiseControl dashboard控制台到Debian安装的tomcat6上
大约7月前 - 2条评论
在前篇日志 如何剥离CruiseControl内置的Web控制台 中,我已经介绍过怎么剥离CruiseControl内置的控制台dashboard到tomcat6容器中。但那篇日志中介绍的是用下载压缩包方式安装的tomcat6,在这我向大家介绍一下如何用Debian包安装的tomcat6部署dashbaord控制台。
为什么这两种安装tomcat6的方法会给web部署带来异同呢?
原因是,用Debian包安装的tomcat6默认启动了tomcat6 的SecurityManager,这时对于部署在它上面的应用代码进行权限管理,当你的web应用在/WEB-INF/lib或者/WEB-INF/classes目录下加入了第三方或个人的jar包/类库,但没有在/etc/tomcat6/policy.d目录下的安全策略文件中加入访问权限控制,那么你的web应用就不能正常启动,会出现一些意想不到的错误。可参见我的另一篇日志 Dashboard不能运行在Debian包安装的Tomcat6上?
而用解压包安装的tomcat6默认情况下是不启用SecurityManager,比如你运行
CATALIAN_ROOT/bin$ ./startup.sh
就不会启用SecurityManager。如果你想启用SecurityManager,可运行
$CATALINA_HOME/bin/catalina.sh start -security(Unix)
CATALINA_HOME%\bin\catalina start -security (Windows)
下面就说下用Debian包安装的tomcat6部署dashbaord控制台的步骤:
1、部署dashbaord web应用
将dashbaord项目拷到 /var/lib/tomcat6/webapps目录下
2、编辑 /etc/tomcat6/policy.d/50local.policy 安全策略文件,加入以下几行
// The permissions granted to the context WEB-INF/classes directory
grant codeBase “file:${catalina.base}/webapps/dashboard/WEB-INF/classes/-” {
permission java.security.AllPermission;
};
// The permissions granted to the context WEB-INF/lib directory
grant codeBase “file:${catalina.base}/webapps/dashboard/WEB-INF/lib/-” {
permission java.security.AllPermission;
};
3、修改 dashboard-config.xml配置文件,下面是修改后的文件(粗体部分是修改的内容)
<dashboard>
<buildloop
logsdir=”/PATH/TO/CC/logs”
阅读全部内容 »
Dashboard不能运行在Debian包安装的Tomcat6上?
大约7月前 - 没有评论
前面的一篇日志中我已经介绍了如何把CruiseControl的dashboard Web控制台剥离到tomcat6上。但那时介绍剥离时用的是下载tomcat6压缩包然后解压的tomcat6,并没有Debian 自己提供的tomcat6安装包。或许你会问怎么不直接用Debian提供软件包安装呢?其实不是我不想,只是我实验过用
sudo aptitude install tomcat6
直接安装tomcat6,但是无论如何就是不能成功部署dashboard。
最终只能委曲求全,“另辟蹊径”了。
但今天同事也遇到这样的问题了,看来是时候解决这个问题了。
刚开始我以为是缺少了什么jar包之类的类库,于是分别比较了这两种tomcat所有到的所有类库,发现没有缺少。这时才意识到自己的判断是错误的,然后就转向跟踪tomcat6的日志文件,发现了下面信息:
严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.ExceptionInInitializerError
at org.springframework.web.context.ContextLoader.<init>(ContextLoader.java:142)
at org.springframework.web.context.ContextLoaderListener.createContextLoader(ContextLoaderListener.java:57)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:48)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1249)
at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:612)
at org.apache.catalina.manager.HTMLManagerServlet.doGet(HTMLManagerServlet.java:136)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:269)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:301)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:283)
at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:56)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:189)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:185)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at 阅读全部内容 »
CruiseControl HgVersionParser: no match of
大约7月前 - 没有评论
使用开源CruiseControl的时候,SCM工具是Mercurial(hg)。CC在收集hg库的修改集合信息的时候,解析hg的version总是出错。这个问题困扰我很长时间,昨天终于解决了。
Error executing mercurial version command hg version
项目构建的时候总是出现这个错误:
Error executing mercurial version command hg version
具体错误信息如下:
net.sourceforge.cruisecontrol.CruiseControlException: java.text.ParseException: HgVersionParser: no match of 分布式软件配置管理工具 – 水银 (版本 1.4.1)
apper.run(ProjectWrapper.java:69)
at java.lang.Thread.run(Thread.java:619)
错误原因
通过研究CruiseControl源代码Mercurial.java文件,终于找到了错误原因。其中Mercurial.java有这么一段代码去得到hg的version:
Pattern p = Pattern.compile(“Mercurial Distributed SCM \\((.*)\\)”);
Matcher m = p.matcher(versionLine);
if (!m.matches()) {
throw new ParseException(“HgVersionParser: no match of ” + versionLine, 0);
}
在系统终端依次输入:
$ hg version
$ LANGUAGE=C hg version
hg version得到的返回结果是:
分布式软件配置管理工具 – 水银 阅读全部内容 »
用Debian/Ubuntu提供的软件包整合apache2和tomcat6
大约7月前 - 16条评论
上篇日志写了用下载源码包的方式整合apache2和tomcat6,或许你会问:怎么不用Debian自己提供的软件包整合呢?
其实在我用下载源码包的方式成功整合apache2和tomcat6后,我就开始实验用Debian自己提供的软件包整合,可是摸索了好长时间,还是整合不成功 。今天在同事蒋鑫的帮助下,终于有了眉目 。下面是具体步骤:
1、安装 tomcat6
sudo aptitude install tomcat6 tomcat6-docs tomcat6-admin tomcat6-examples
2、安装 apache2
sudo aptitude install apache2
3、安装apache-tomcat 连接器模组 libapache2-mod-jk
sudo aptitude install libapache2-mod-jk
4、配置jk
cd /etc/apache2/mods-available
/etc/apache2/mods-available$ sudo vi jk.conf
jk.conf的内内容如下
# 指出jk模块工作所需要的工作文件workers.properties的位置
JkWorkersFile /etc/libapache2-mod-jk/workers.properties
# Where to put jk logs
JkLogFile /var/log/apache2/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat “[%a %b %d %H:%M:%S %Y]”
# JkOptions indicate to send SSL 阅读全部内容 »
Linux下Apache与Tomcat的整合
大约7月前 - 没有评论
背景介绍:
Apache的HTTPD是目前比较受欢迎的网站服务器软件,它不但功能强大,而且完全免费,并且支持市场上流行的各种操作系统(Windows,Linux,Mac os)。同时对于Java Servlet/JSP的支持,通常也会使用同样Apache出品的Tomcat。Tomcat除了支持Java Servlet/JSP之外,也可以当做网站服务器使用,但是在对于静态的html文件、图片文件等的解析效率上不如Apache HTTPD的执行效率高。应用tomcat的服务器如果网站的访问量较大,系统资源占用会明显升高。所以就引出Tomcat与apache的整合服务。Apache负责静态资源处理,tomcat负责jsp和java servlet等动态资源的处理。
需要的组件:
1、apache
下载地址:http://httpd.apache.org/download.cgi
2、Tomcat
下载地址:http://tomcat.apache.org/download-60.cgi
3、Apache Tomcat Connector (mod_jk)
下载地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/
根据你的操作系统选择适当的 jk 连接器,同时要注意你用的Apache版本,根据你的Apache版本下载合适的jk版本。
下面是apache与jk的兼容性映射
mod_jk-1.2.28-httpd-2.2.X.so is for Apache 2.2.x. It has been build against version 2.2.6, but should work with Apache 2.2.0 and later. Rename to mod_jk.so before putting it in your modules directory or adjust your LoadModule statement.
mod_jk-1.2.28-httpd-2.0.X.so is for Apache 2.0.x. It has been build 阅读全部内容 »
如何剥离CruiseControl内置的Web控制台
大约7月前 - 没有评论
背景介绍
出于各自不同的考虑:
启用 Apache Tomcat 内置的 Java EE 安全性管理机制,以加强这些 Web 控制台的管理
采用比 Jettery (cc内置的Web容器) 更强大的 Web 容器,使得 CruiseControl 构建循环不会受到 Web 控制台用户的影响。因为默认情况下,CruiseControl构建循环与宿主 Web 控制台的 Jetty 处于同一进程中。
CI集成人员需要将CruiseControl内置的两个Web控制台( http://localhost:8080/cruisecontrol/ 和 http://localhost:8080/dashboard/ ) 剥离出来,并运行在其他 Java EE 容器中,比如 Tomcat等。
移植Web 控制台到 Apache Tomcat 6.0.20 的步骤
如果你想用Debian 安装的tomcat6部署dashboard,请参照 剥离CruiseControl dashboard控制台到Debian安装的tomcat6上
1、下载 CruiseControl 和 tomcat-6.0.20 安装包,并分别解压(这是我放置解压目录的位置 /work/cruisecontrol 和 /work/tomcat )。
2、复制 /work/cruisecontrol/webapps/dashboard 到 /work/tomcat/webapps下
/work/tomcat/webapps> cp -a /work/cruisecontrol/webapps/dashboard .
3、修改 /work/cruisecontrol/dashboard-config.xml 阅读全部内容 »
CruiseControl—confilg.xml
大约7月前 - 没有评论
config.xml
config.xml是CruiseControl的核心配置,主要指明需要测试的项目名,项目的执行脚本,监听变更集,执行任务,以及任务完成后的后续操作。
下面是CruiseControl中实例config.xml
<cruisecontrol>
<project name=”connectfour”>
<listeners>
<currentbuildstatuslistener file=”logs/${project.name}/status.txt”/>
</listeners>
<bootstrappers>
<antbootstrapper 阅读全部内容 »
CruiseControl—下载及安装
大约7月前 - 没有评论
最新稳定版本cruisecontrol-bin-2.8.2.zip , http://cruisecontrol.sourceforge.net/download.html
解压刚下载的压缩包: $ unzip cruisecontrol-bin-2.8.2.zip
输入 $ echo $JAVA_HOME 查看是否设置好环境变量
启动CruiseControl,进入解压目录下,运行: $ . /cruisecontrol.sh
在浏览器输入: localhost:8080/dashboard
CruiseControl 目录结构
cruisecontrol.sh 启动文件;
config.xml 配置文件 (默认的配置文件名称);
apache-ant-1.7.0 是CruiseControl自带的ant环境,CruiseControl要借助ant完成一些指定的任务;
docs 包括CruiseControl的使用文档和一个helloworld的使用范例;
lib 是运行需要的jar包;
logs 日志目录,构建时产生的log存储于此;
projects 需要构建的项目所在目录,所有的构建项目在project均以项目名为目录(示例项目 connectfour)。
webapps web应用目录。CruiseControl内置了jetty作为web容器,可以通过http://localhost:8080/dashboard
artifacts 输出目录,集成后生成的jar就保存在这里
CruiseControl —初体验
大约7月前 - 没有评论
CruiseControl:简称CC,持续集成工具,主要提供了基于版本管理工具(如Git)感知变化或每天定时的持续集成,并提供持续集成报告、Email等等方式通知相关负责人,其要求是需要进行日构建的项目已编写好全自动的项目编译脚本(可基于Rake或Ant)
CruiseControl 有三个模块构成 :
构建循环(Build Loop) :CC 的核心,负责触发构建周期,并通知构建结果
老版本Web控制台(/cruiscontrol)
新一代Web控制台(/dashboard) :用于取代老版本的cruisecontrol控制台
