Maven项目代码质量检测工具sonar使用手记

sonar

Sonar是一个开源代码质量控制工具。把它加到现在的持续集成工具中就能够让你的java开发项目集中处于质量控制之下。下面是安装和使用记录 :

修改.m2/settings.xml 增加下边的内容到profiles段落中:

<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- EXAMPLE FOR MYSQL -->
<sonar.jdbc.url>
jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</sonar.jdbc.driverClassName>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>

<!-- SERVER ON A REMOTE HOST -->
<sonar.host.url>http://localhost:8888</sonar.host.url>
</properties>
</profile> 增加mysql权限 GRANT all ON sonar.* TO sonar@localhost IDENTIFIED BY 'sonar';
FLUSH PRIVILEGES ;

vim .bashrc export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m -Duser.timezone=Asia/Shanghai"

source .bashrc

下载sonar,配置mysql:

conf/sonar.properties
sonar.jdbc.url: jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.driverClassName: com.mysql.jdbc.Driver
sonar.jdbc.validationQuery: select 1
用户密码不用,默认都是sonar

配置启动的http端口

sonar.web.host : localhost
sonar.web.port: 8888
sonar.web.context: /
启动服务:
bin/[YOUR PLATEFORM]/sonar.sh start
开始使用:
进到项目里运行 mvn sonar:sonar

打开http://localhost:8888 即可看到对应项目里的代码质量和修改建议。 解决系统时区的问题: vim sonar-xx/conf/wrapper.conf
wrapper.java.additional.3=-Duser.timezone=Asia/Shanghai

关于maven,做错的十件事

java maven

maven管理的java项目越来越多,令人遗憾的是在使用maven的时候,多多少少都会遇到这样那样的问题,于是会有各种各样的解决办法,下面是一个列表,列出了使用maven的误区和解决办法。 1.频繁在所有项目使用mvn install并且随时在更新 这是我见过的最常见的问题,解决了这个问题有许多的好处。在maven的文档中找不到一句对这种情况的描述,不过我坚信一句话:每个artifact在maven仓库中都有一个家。
在你的公司里,应该有一个仓库管理工具。每一个你开发的模块都应该发布到这个仓库上去。你可能会问,应该什么时候发布?答案是,每次在你的构建服务器构建之后,都需要发到仓库。我们通常都使用Hudson来做这件事情,另外还有ContinuumTeamCity也还不错。

现在,当你所有的项目都在仓库里有的时候,你的项目就不再需要不断地mvn install了。如果你修改一个模块,你只需要重建这个模块,其余依赖的模块会由maven自动从仓库中下载。

2.你和你的团队成员依靠复制.m2文件夹来解决项目里的依赖找不到的问题 这看起来很疯狂,不过这件事情经常发生。解决的办法,设置一名仓库管理员。一旦管理好了仓库,就不会再出现大家找u盘复制.m2文件夹的事情了。因为可以加速,你不应该把本地的仓库整个地删除掉,毕竟在本地读取仓库是最快的。

3. 你为了解决依赖找不到一个老版本构件的问题,把最新的pom文件修改了版本弄到了老文件里后安装 考虑到这种情况,有人把一个模块的版本从1.3-SNAPSHOT修改成了1.4-SNAPSHOT。你马上要去度假,所以呢你就不想再更新和安装1.3的版本了,而你的模块正好要依赖1.3版本的那个模块,你如何去弄到老的版本呢?嗯,你可以到处找找,在代码库里找到了这个模块的最新代码,而且版本还是1.3的,你更新了这个版本号并且进行了安装。或者你还可以把你的代码从1.4弄到1.3去,安装并祈祷能够正常工作。

我想上面的解决办法都不是很好,同样,你的公司需要一个代码仓库管理员,如果有一次1.3-SNAPSHOT成功的构建,那就应该在仓库里存在一份,问题解决。

4. 你有许多shell脚本或者是批处理文件,它们通过你的模块的target文件来产生一个zip文件 maven有方法专门做这件事情,叫做“assemblies”。他们不是最容易安装的,但是一旦你安装好了,将与maven完全无缝结合,这要比许多山寨自制的脚本要平滑得多。这些山寨的脚本有许多的问题,比如说版本开始改变,模块被移动等等。

5.你有许多的xml在pom里,目的只是复制文件到发布时的文件夹去,而且它不成很好的工作,也不轻便 这和4正好是对立的,maven看上去不是为了复制文件而构建。如果你想复制你的包(诸如war,ear,zip文件),写一个ant shell bat文件都会很简单完成。

6.你在build的时候总是呆在“checking for updates from xxx-repo”而你不知道什么原因 这是一个很让有些人很气愤的事情,往往花费太多时间去找问题所在。也许这个事情正好可以让你去喝杯咖啡。尽管如此,这个问题的一些通常原因,就是你有一个快照版本的依赖,并且在你的pom文件中有一堆的仓库列表。maven不关心哪个包去哪个仓库里取,所以看上去是从所有的仓库里更新所有的包。
如果你配置了你的maven安装时到指定的仓库里去寻找所有的包(在settings.xml里设置mirror),maven会只到这个仓库里寻找。当这个服务器在本地,将得到加速。用上仓库管理很重要,

7.如果你在release分支上写代码,你的trunk的构建将会失败(或者说是1.0-SNAPSHOT应该对所有人来说都是好用的) 有许多事情你应该记住,当给你的项目创建一个分枝的时候。其中之一是告诉你的构建服务器,并且其他模块需要修改版本为你的pom的声明。如果你忽略随后才做这事,当你想修改了分支里的代码又想在主干里开发时,你会遇到问题。
这里有一个goal在发布插件里,叫做“branch”,靠运行“mvn release:branch”,maven可以为你自动重命名pom文件里的版本号。(免责声明,我还没试过这个命令。。。目前我经常只在创建了一个release的时候才打分支,在“mvn release:perform”后使用“mvn release:prepare”)

8.整个公司内容的依赖都是以-SNAPSHOT结束 快照对开发者来说很舒服,它几乎要完成了,但是迟早,你应该要停下你的脚步,发送你的包给世人,或者是你的同事。一直呆在快照版本有许多的问题。首先它减慢了你的构建速度。因为maven不得不去检查最后的快照是不是在更新了。其次,如果你的项目依赖于一个快照版本,你很难判断是依赖哪个版本的快照。构建可能会失败,只是因为你拿到了一个更新的快照。
如果你依赖一个公司内部的模块,并且这个模块目前是好用的,那么修改所有的依赖为非快照版本后才发布,是一个不错的主意。这样我们才能知道,即使有家伙还在那个模块上疯狂写代码的时候,你的模块依旧可以构建通过,因为它依赖的是一个稳定的发布。

9.跑一下“mvn dependency:analyze”,没有使用和没有使用的依赖列表很长 这个很BT,但不知道准确依赖很危险。最大的问题是maven的传递依赖。

10.当有人发布了你使用的新版本的插件,你的构建就挂了 maven的插件不必写上版本,maven会找到最好的版本。当有新版本的插件的时候,你不必知道就会下载使用最新的。有时候,最好的判断不总是正确。根据经验,越新的越有bug。因此,明码标价写上你使用的插件的版本是有意义的

Amoeba系统性能报告

amoeba 关于amoeba,请见http://www.54chen.com/java-ee/amoeba-rose-open-source-big-website-arch.html,他是一个不错的mysql proxy替代工具。 读作

100个并发,mysql:
load:7-8

Rate: 225 req/s
Rate: 240 req/s
Rate: 216 req/s
Rate: 193 req/s
Rate: 212 req/s
Rate: 210 req/s
Rate: 208 req/s
Rate: 229 req/s
Rate: 215 req/s
Rate: 231 req/s
Rate: 241 req/s
Rate: 210 req/s
Rate: 273 req/s
Rate: 247 req/s
Rate: 212 req/s
amoeba:
load:13-15
Rate: 214 req/s
Rate: 185 req/s
Rate: 174 req/s
Rate: 181 req/s
Rate: 210 req/s
Rate: 194 req/s
Rate: 187 req/s
Rate: 190 req/s
Rate: 189 req/s
Rate: 167 req/s
Rate: 182 req/s
Rate: 182 req/s
Rate: 185 req/s
Rate: 178 req/s
Rate: 184 req/s
Rate: 187 req/s
Rate: 183 req/s
Rate: 196 req/s
Rate: 177 req/s

50个并发:
mysql:
load:5-6

Rate: 233 req/s
Rate: 207 req/s
Rate: 247 req/s
Rate: 231 req/s
Rate: 262 req/s
Rate: 195 req/s
Rate: 202 req/s
Rate: 224 req/s
Rate: 258 req/s
Rate: 256 req/s
Rate: 217 req/s
Rate: 183 req/s
Rate: 208 req/s
Rate: 265 req/s
Rate: 213 req/s
Rate: 244 req/s
Rate: 225 req/s
Rate: 238 req/s
omaeba:
load:10-13
Rate: 231 req/s
Rate: 200 req/s
Rate: 223 req/s
Rate: 171 req/s
Rate: 205 req/s
Rate: 201 req/s
Rate: 179 req/s
Rate: 192 req/s
Rate: 221 req/s
Rate: 225 req/s
Rate: 188 req/s
Rate: 159 req/s
Rate: 184 req/s
Rate: 212 req/s
Rate: 169 req/s
Rate: 172 req/s
Rate: 189 req/s
Rate: 222 req/s

20个并发:
mysql:
load:5-6

Rate: 208 req/s
Rate: 261 req/s
Rate: 257 req/s
Rate: 166 req/s
Rate: 218 req/s
Rate: 165 req/s
Rate: 240 req/s
Rate: 215 req/s
Rate: 218 req/s
Rate: 251 req/s
Rate: 197 req/s
Rate: 215 req/s
Rate: 242 req/s
Rate: 187 req/s
Rate: 196 req/s
omeba:
load:6-7
Rate: 209 req/s
Rate: 160 req/s
Rate: 180 req/s
Rate: 152 req/s
Rate: 204 req/s
Rate: 192 req/s
Rate: 170 req/s
Rate: 214 req/s
Rate: 187 req/s
Rate: 217 req/s
Rate: 180 req/s
Rate: 225 req/s
Rate: 208 req/s
Rate: 198 req/s
Rate: 200 req/s
Rate: 211 req/s

1个并发:
mysql:
load:2

Rate: 84 req/s
Rate: 78 req/s
Rate: 81 req/s
Rate: 85 req/s
Rate: 83 req/s
Rate: 76 req/s
Rate: 84 req/s
Rate: 80 req/s
Rate: 84 req/s
Rate: 80 req/s
Rate: 89 req/s
Rate: 83 req/s
Rate: 78 req/s
Rate: 75 req/s

omaeba:
load:3

Rate: 80 req/s
Rate: 77 req/s
Rate: 79 req/s
Rate: 89 req/s
Rate: 73 req/s
Rate: 72 req/s
Rate: 73 req/s
Rate: 72 req/s
Rate: 82 req/s
Rate: 79 req/s
Rate: 67 req/s
Rate: 81 req/s

写作

1并发,mysql:

Rate: 83 req/s
Rate: 86 req/s
Rate: 84 req/s
Rate: 84 req/s
Rate: 91 req/s
Rate: 82 req/s
Rate: 88 req/s
Rate: 82 req/s
Rate: 76 req/s
Rate: 87 req/s
Rate: 90 req/s
Rate: 86 req/s
Rate: 87 req/s
Rate: 93 req/s
Rate: 95 req/s
1并发,amoeba:
Rate: 77 req/s
Rate: 56 req/s
Rate: 72 req/s
Rate: 75 req/s
Rate: 75 req/s
Rate: 79 req/s
Rate: 75 req/s
Rate: 80 req/s
Rate: 71 req/s
Rate: 80 req/s
Rate: 78 req/s
Rate: 71 req/s

10并发,mysql:

Rate: 209 req/s
Rate: 190 req/s
Rate: 201 req/s
Rate: 194 req/s
Rate: 188 req/s
Rate: 234 req/s
Rate: 168 req/s
Rate: 266 req/s
Rate: 242 req/s
Rate: 243 req/s
Rate: 260 req/s
Rate: 261 req/s
Rate: 180 req/s
Rate: 240 req/s
Rate: 260 req/s

10并发,amoeba:

Rate: 132 req/s
Rate: 142 req/s
Rate: 154 req/s
Rate: 188 req/s
Rate: 164 req/s
Rate: 165 req/s
Rate: 188 req/s
Rate: 172 req/s
Rate: 173 req/s
Rate: 184 req/s
Rate: 147 req/s
Rate: 164 req/s
Rate: 172 req/s
Rate: 159 req/s
Rate: 133 req/s
Rate: 159 req/s
Rate: 191 req/s
100并发,mysql:
Rate: 175 req/s
Rate: 201 req/s
Rate: 226 req/s
Rate: 256 req/s
Rate: 258 req/s
Rate: 229 req/s
Rate: 220 req/s
Rate: 234 req/s
Rate: 203 req/s
Rate: 227 req/s
Rate: 211 req/s
Rate: 223 req/s
Rate: 266 req/s
Rate: 253 req/s
Rate: 226 req/s
Rate: 242 req/s
Rate: 269 req/s
Rate: 199 req/s
Rate: 123 req/s

100并发,amoeba:

Rate: 198 req/s
Rate: 185 req/s
Rate: 182 req/s
Rate: 171 req/s
Rate: 181 req/s
Rate: 160 req/s
Rate: 124 req/s
Rate: 213 req/s
Rate: 200 req/s
Rate: 216 req/s
Rate: 179 req/s
Rate: 257 req/s
Rate: 165 req/s
Rate: 150 req/s
Rate: 241 req/s

结论 性能还可以,网络损失和解释过程损失了一些性能,不过总体还是不错的。

Amoeba+rose:开源项目搭建大型网站可扩展构架实记

amoeba rose java是一把双刃剑,可以很重地伤人,亦可很重地自伤。曾在一处见到,淘宝在长期使用java构建web项目后,得出一个结论:积重难返。
实际工作经验得到的结论,积重难返的原因,往往不是java本身的缘故,而是团队成员基础积累参差不齐,许多次的“一不小心”积累成了最终的结果。到了悔之晚矣的时候自然就积重难返了。如何避免java使用自伤,最关键在于,统一团队成员的code入口,框下可能发生的事情,避开不能发生的事情,言归正传,下面开始介绍两个非常不错的java开源项目,搭配两个项目,可以搞定所有的mysql+java项目的任何方向的扩展和的开发而不担心积重难返。 项目简介 1) rose框架:
来自人人网王志亮大侠的大作,其优异的性能撑下了SNS网站复杂多变的业务(人人网大量使用),同时开发非常方便,有大量的文档可供参考。
项目地址: http://code..com/p/paoding-rose/

2) Amoeba:
Amoeba(变形虫)项目,专注分布式数据库 proxy 开发。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。使用这个项目可以将DB层透明,简单做到分库分表,甚至无限partition。作者陈思儒大侠。
下面有一篇两年前Fenng对作者的采访: http://www.infoq.com/cn/articles/interview-chensiru-amoeba 项目地址: http://amoeba.meidusa.com/

构架图 amoeba+rose构架图

相关配置 1) 配置rose中的数据源为amoeba http://code..com/p/paoding-rose/wiki/Jade_DataSource

2) 配置amoeba为mysql(使用amoeba-mysql) http://amoeba.meidusa.com/amoeba.pdf

分布式日志系统scribe使用手记

java,scribe scribe 是 开源的分布式日志系统 。其使用了thrift传输log,由于使用thrift,所以不论是什么语言的项目都可以实现日志收集,可达到远程或者是本地同步远程的分布式日志收集效果,在其示例配置中,并发量可达到max_msg_per_second=2000000,对普通的应用来说,每秒上百万的访问量可能性很小,因此基本上即使最简单的配置,远程收集所有项目的log也是可靠的,如果压力大的话,可以采取主从的配置,将日志打到本地后由scribe的主从配置来自动同步。下面讲述如何安装和使用scribe。

下载boost、thrift、scribe

boost_1_45_0.tar.gz
thrift-0.5.0.tar.gz
-scribe-2ee14d3.zip

通过yum安装需要的依赖

yum install libevent libevent-devel python-devel
yum install gcc-c++
yum install automake
yum install byacc flex

安装boost

tar -zxvf boost_1_45_0.tar.gz
cd boost_1_45_0
./bootstrap.sh
./bjam install --prefix=/opt/soft/bootstrap

安装thrift-0.5.0

tar zxvf thrift-0.5.0.tar.gz
./configure --with-php-config=/opt/soft/php/bin/php-config --with-boost=/opt/soft/boost/ --with-java --prefix=/opt/soft/thrift
make
make install

安装fb303

cd contrib/fb303
./bootstrap.sh --prefix=/opt/soft/thrift/fb303 --with-boost=/opt/soft/boost/ --with-thriftpath=/opt/soft/thrift/
make
make install

安装scribe

unzip -scribe-2ee14d3.zip
cd -scribe-2ee14d3

export BOOST_ROOT=/opt/soft/boost/
export LD_LIBRARY_PATH=/opt/soft/thrift/lib:/usr/lib:/usr/local/lib:/opt/soft/boost/lib/
./bootstrap.sh --prefix=/opt/soft/scribe --with-boost=/opt/soft/boost/ --with-thriftpath=/opt/soft/thrift/
make
make install

启动scribe服务

cd -scribe-2ee14d3
cp example/exmaple1.conf /opt/soft/scribe/bin
cd /opt/soft/scribe/bin/
export BOOST_ROOT=/opt/soft/boost/
export LD_LIBRARY_PATH=/opt/soft/thrift/lib:/usr/lib:/usr/local/lib:/opt/soft/boost/lib/
./scibed example1.conf

生成客户端使用scribe

先产生java的thrift代码:
cd -scribe-2ee14d3/if/
thrift -r -I ../../thrift-0.5.0/contrib/(这里需要指到你的thrift的源码目录) -gen java scribe.thrift

使用

gen-java目录下有thrift的客户端,即取即用。javaeye里有一篇写配置log4j使用scribe的不错:http://www.javaeye.com/topic/800208