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

Maven-jetty-plugin 中多 webapp 资源目录的配置问题

开发中经常用到 maven jetty:run,特别是它支持 多个 webapp 资源目录 的特性,在开发环境中相当有用。比如,src/main/webapp 是 prod 的资源,而有些开发或者测试时用到的资源可以安心的放在 src/test/webapp。可以 参考这里 详细了解怎么使用。

但是,迁移了环境之后,发现它总是报错:

[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to configure plugin parameters for: org.mortbay.jetty:maven-jetty-plugin:6.1.22

    (found static expression: 'src/main/webapp,src/test/webapp' which may act as a default value).

Cause: Cannot assign configuration entry 'resources' to 'class [Lorg.mortbay.resource.Resource;' from 'src/main/webapp,src/test/webapp', which is of type class java.lang.String

但是奇怪就在于,在 eclipse 的 maven 插件里面报错,但在命令行执行却没有问题。基于懒人原则,只要有路可走,不深究这个问题。可是当我再一次迁移至 linux 环境下时,命令行报错了。无路可逃的我只好 向 google 求救

经过一番扫描,发现有先行者了,评论将矛头指向 JAVA 的版本以及操作系统,还有提供了一个可以尝试的修改:

<baseResource implementation="org.mortbay.resource.ResourceCollection">
    <resourcesAsCSV>src/main/webapp,src/test/webapp</resourcesAsCSV>
</baseResource>

试之,可行。这是传说中的 maven overloading bug。文中还提到了和 contextPath 的设置有关,敬请留意。
很多小蚜虫

让Jetty更加开胃

Mavenjetty-plugin 很好用,我是蛮喜欢,一直在用,现在做开发做测试基本离不开了,一条命令 mvn jetty:run 下去,感觉一个新世界被打开了一样。

不过在 window 上的 eclipse 里,它并不是很乖,主要是停不下来,传说这个是 window 平台上的一个硬伤,幸好解决方法还是有的,采取调试,Remote Java Application 的调试里有个选项 Allow termination of remote VM,可以在一定程度上解决这个问题,有点曲线,不过也方便,随时可以调试。我主要还是在 linux 环境下使用,因此这个问题基本对我不影响。

除了平台的问题,还遇到了一个 Form too large xxxxxx>200000 的问题,一开始没看清楚报错,使劲在 struts2 的范围里面找解决方法,以为是某个设置影响它约束了接受的 form 的大小。还好在无敌的 google 引导下,终于清楚了这是 jetty 在报错,它的默认参数里面有个限制。问题清楚了,解决方法却有点扑朔迷离,最初找到一个 maven.jetty.maxformcontentsize,看起来很接近,实际上只是用于特定软件内,扩大范围至 maxFormContentSize 再找,终于找到了一样的情况了,恼火的是一点进去立马撞墙,这时真的是为了接近真相,不得不继续深入虎穴(需翻墙)
下面配置的片段,想设多大就多大。

<plugin>
	<groupId>org.mortbay.jetty</groupId>
	<artifactId>maven-jetty-plugin</artifactId>
	<version>6.1.12</version>
	<configuration>
		<systemProperties>
			<systemProperty>
				<name>org.mortbay.jetty.Request.maxFormContentSize</name>
				<value>100000000</value>
			</systemProperty>
		</systemProperties>
		<scanIntervalSeconds>10</scanIntervalSeconds>
	</configuration>
</plugin>

不过,问题是为什么 jetty 会有这样一个默认参数存在呢?
设置成非常大之后的确可以解决问题,但是会不会对性能之类的造成影响呢?

当maven internal archetype catalog不听使的时候

我的目的就是要用archetype来创建一个struts2的blank项目,struts2官网上写的有2.1.6版本

可是我的archetype列表里面只有一个不存在的2.0.9-SNAPSHOT版本,http://people.apache.org/repo/m2-snapshot-repository/目前有2.0.11-SNAPSHOT和2.0.14-SNAPSHOT,这怎么办呢?
最原始的想法就是把包含2.1.6的repo地址(http://www.lenart.org.pl/maven/)加入到settings.xml里面,结果没反应。
手动安装,同样没反应。
这个时候可以想象到maven有一个列表一样的东西来维护这些archetype,很快网上的资料证实了我的想法,于是我尝试手动的更新catalog

mvn archetype:crawl

maven哄哄的扫描完一遍之后,没想到它依然缠绕在2.0.9-SNAPSHOT上面。

心都凉了,突然之间maven在我内心的评价直接跳水,maven的这个插件好傻。
其实这个时候应该换个archetype就好,appfuse有的,不过就是不喜欢它创建出来的东西太杂乱。不换archetype,应该可以换个archetype catalog吧,于是目光聚集在http://maven.apache.org/plugins/maven-archetype-plugin/examples/generate-alternative-catalog.html

mvn archetype:generate \
	-DarchetypeCatalog=http://www.lenart.org.pl/maven/

It works.
Pala pala的输入相关信息就创建好了。
不过这种做法的前提是repo有一个叫 archetype-catalog.xml 的文件。

不喜欢选择的话,可以用下面这个拉风得很的命令:

mvn archetype:generate \
	-DarchetypeCatalog=http://www.lenart.org.pl/maven/ \
	-B \
	-DarchetypeGroupId=org.apache.struts \
	-DarchetypeArtifactId=struts2-archetype-blank \
	-DarchetypeVersion=2.1.6 \
	-DgroupId=net.leegorous \
	-DartifactId=smui3 \
	-Dpackage=war \
	-Dversion=1.0-SNAPSHOT

注:-B : 表示批量执行,不提问,个人觉得一问一答也蛮有趣 😛
命令换行为了显示方便,使用时请注意在一行完成。