奇怪的乱码

项目中用到 FreeMarker,在 eclipse 里用 maven 插件 跑 jetty:run,看上去挺美好的。但是一旦修改 FreeMarker 的模版文件(包含中文,UTF-8 编码,无 BOM ),页面一刷新,乱码就出来了。关掉重开可以解决问题。但是总想不明白到底哪里出的问题。

我一开始猜测是 FreeMarker 的读取模版时候的编码问题,经过网上一轮 Google 之后,尝试了各式各样的设置 encoding 方法都不能解决问题。这个问题太困扰了,网上又找不到类似于这种第一轮启动没问题,一修改就出问题的情况,而这个情况在其他人哪里是可以重现的。难道就没有人遇到过?原本只是想简单用用,现在看来得调试进去看看到底出什么问题了。至少需要确认一个问题,究竟是哪个环节出现问题。

又经过一番逐行 debug,得到一个让人惊讶的线索。源代码显示,无论是第几次加载模版,调的都是同一个方法,这部分代码出错的几率不高。而逐行到加载得到模版内容(未经 parse 之前),修改前后加载得到的内容是不一样的,修改后重新加载得到的内容本身就有乱码。

至少,可以还 FreeMarker 一个清白了。凶手又会是谁呢? Continue reading

Maven build 中启动 JMX Agent

为了监控 JVM,研究了下 VisualVM,但是不知道怎么导出里面的数据,可导出就比较方便做数据比对,而且也不知道怎么控制显示的历史信息跨度。而这两点在 JConsole 中都可以。于是要折腾 JConsole,一开始还不怎么顺利,虽然看上去只是几项配置。
因为在开发过程当中都是使用 mvn jetty:run 启动的。原来以为是这样:

mvn jetty:run -Dcom.sun.management.jmxremote.port=9410 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false

然后使用 jconsole 127.0.0.1:9410 ,提示是 Connection refused

后来了解到,如果 JMX Agent 启动成功的话,会产生一个端口监听。
再执行 netstat -a | grep 9410 ,毫无反应。

网上乱 google jconsole, jmx agent, jmx remote, jmx connection refused 等关键字都没什么头绪。
找到一篇 关于 jconsole 的错误排查 的不错的文章,但是情况不吻合,这里唯一区别的是不是直接 java 启动,而是通过 mvn ,曾经使用过调试,需要 Continue reading

修改eclipse ${user}变量的值

最近老切换机器,但像Eclipse这样的工具还是必须用到,但是每次新建一个java文件,文件头自动生成带有 @author 的注释。
不过问题是那个 @author 是按照系统用户来的。虽然SVN提交代码的时候有准确的用户名,但是文件里面那个不是每次都记得要修改。
以前是通过修改新建的文件模板来达到效果的。
模板里面是 @author ${user},里面 ${user} 是一个系统变量,可以通过下面的语句拿到。

System.getProperty("user.name")

修改这个值可以通过

/path/to/eclipse -vmargs -Duser.name="My Name"

或者
修改eclipse.ini

......
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Duser.name=leegorous
......

重新启动 Eclipse 就起效了。