﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-qqjianyue代码工</title><link>http://www.blogjava.net/jianyue/</link><description>砌java代码</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 04:02:04 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 04:02:04 GMT</pubDate><ttl>60</ttl><item><title>Ubuntu18.04 setup</title><link>http://www.blogjava.net/jianyue/archive/2018/11/03/433463.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Sat, 03 Nov 2018 00:39:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2018/11/03/433463.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/433463.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2018/11/03/433463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/433463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/433463.html</trackback:ping><description><![CDATA[1. Change to aliyun repository<br /><br />2. Chinese input method<br /><span style="color: #c7254e; font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-variant-ligatures: common-ligatures; background-color: #f9f2f4;">sudo apt-get install ibus-pinyin<br /></span>#remmeber to logout and re-logon to change system 'Region&amp;Language' setting<br /><br />3. Shadowsocks and genpac<br /><span style="font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-size: inherit; font-variant-ligatures: common-ligatures; white-space: pre; background-color: #f6f8fa; box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; color: #4f4f4f; overflow-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word;">sudo</span><span style="color: #000000;"> apt install -y shadowsocks-libev<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#sudo vi </span>/etc/shadowsocks-libev/shadowsock.json<span style="color: #000000; "><br /></span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">server</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">x.x.x.x</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">server_port</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:xx,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">local_port</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">1080</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">password</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">xxxxx</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">timeout</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">60</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">method</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">aes-256-cfb</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />}<br /><br /></span><span style="color: #000000; font-size: 14px; background-color: #f6f8fa;">nohup ss</span><span class="hljs-attribute" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-size: 14px; overflow-wrap: break-word; color: #000000;">-local</span><span style="color: #000000; font-size: 14px; background-color: #f6f8fa;"> </span><span class="hljs-attribute" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-size: 14px; overflow-wrap: break-word; color: #000000;">-c</span><span style="color: #000000; font-size: 14px; background-color: #f6f8fa;"> </span><span style="background-color: #f6f8fa; font-size: inherit;">/etc/shadowsocks-libev/shadowsock.json &gt;/dev/null 2&gt;&amp;1 &amp;</span></div><br />sudo apt install phython-pip<br />sudo -H</span><span style="font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-variant-ligatures: common-ligatures; white-space: pre; background-color: #f6f8fa;"> pip install genpac<br /></span><span style="font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-variant-ligatures: common-ligatures; white-space: pre; background-color: #f6f8fa;"><br /></span><br />如果pip error "TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'"<br /><span style="color: #4f4f4f; font-family: -apple-system, &quot;SF UI Text&quot;, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif, SimHei, SimSun; font-size: 16px; background-color: #ffffff;">sudo python -m pip install --upgrade --force pip<br /><br />mkdir pac<br />cd pac<br />touch user-rules.txt<br /></span><div>genpac --pac-proxy "SOCKS5 127.0.0.1:1080" --gfwlist-proxy="SOCKS5 127.0.0.1:1080" --output="autoproxy.pac" --gfwlist-url="https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt" --user-rule-from="user-rules.txt"<br /><br />配置系统自动代理为：<br /><div>/home/xxx/pac/autoproxy.pac</div></div><br /><span style="font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-variant-ligatures: common-ligatures; white-space: pre; background-color: #f6f8fa;">4. JDK8<br /></span><div>https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html</div><span style="font-family: &quot;Source Code Pro&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Ubuntu Mono&quot;, &quot;Anonymous Pro&quot;, &quot;Droid Sans Mono&quot;, Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, sans-serif; font-variant-ligatures: common-ligatures; white-space: pre; background-color: #f6f8fa;">download and setup environment variable manually<br /><br /><br />5.gcloud<br /></span><div>http://ubuntuhandbook.org/index.php/2014/10/google-cloud-sdk-made-into-canonical-partners-repository/</div><img src ="http://www.blogjava.net/jianyue/aggbug/433463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2018-11-03 08:39 <a href="http://www.blogjava.net/jianyue/archive/2018/11/03/433463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android compile 注意点</title><link>http://www.blogjava.net/jianyue/archive/2013/04/20/398119.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Sat, 20 Apr 2013 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2013/04/20/398119.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/398119.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2013/04/20/398119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/398119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/398119.html</trackback:ping><description><![CDATA[官方说明：<a href="http://source.android.com/source/initializing.html">http://source.android.com/source/initializing.html<br />
</a>环境：<br />
Ubuntu 12.04 64bit<br />
JDK6(installation:&nbsp;<a href="http://www.gaggl.com/2012/04/installing-java6-jdk-on-ubuntu-12-04/">http://www.gaggl.com/2012/04/installing-java6-jdk-on-ubuntu-12-04/</a>)<br />
<br />
<div>$ make -v</div>
<div>GNU Make 3.81</div>
<div>Copyright (C) 2006 &nbsp;Free Software Foundation, Inc.</div>
<div>This is free software; see the source for copying conditions.</div>
<div>There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A</div>
<div>PARTICULAR PURPOSE.</div>
<div></div>
<div>This program built for x86_64-pc-linux-gnu<br />
</div>
<div>$ python -V</div>
<div>Python 2.7.3<br />
</div>
android 当前 mainfest version: 4.2<br />
<br />
<br />
按照官方说明从下载到运行emulator，没有nexus，所以没做实际机器烧录。步骤请根据官方说明做，以下只列出过程遇到的问题:<br />1.repo sync<br />经常出现断线，网上有很多参考办法，我是每次忽略这些错误，直到运行完毕退出，我再重新运行：<br />repo sync -f<br />知道所有代码下载完毕（4.2的有16G）<br />2.每次跑emulator都要cd到代码目录先进行环境初始化<br /><div>source build/envsetup.sh</div><div>lunch full-eng<br />3.emulator出错<br /><div>$ emulator</div><div>emulator: WARNING: system partition size adjusted to match image file (229 MB &gt; 200 MB)</div><div>Segmentation fault (core dumped)<br />改成用emulator-arm -partition-size 1024<br />full long command reference:<br /><a href="http://stackoverflow.com/questions/9022750/running-emulator-after-building-android-from-source">http://stackoverflow.com/questions/9022750/running-emulator-after-building-android-from-source</a></div></div><img src ="http://www.blogjava.net/jianyue/aggbug/398119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2013-04-20 10:57 <a href="http://www.blogjava.net/jianyue/archive/2013/04/20/398119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 事务 属性</title><link>http://www.blogjava.net/jianyue/archive/2011/11/29/365092.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Tue, 29 Nov 2011 02:25:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2011/11/29/365092.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/365092.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2011/11/29/365092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/365092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/365092.html</trackback:ping><description><![CDATA[<div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Spring&nbsp;<span style="font-family: 宋体; ">声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的</span>&nbsp;try<span style="font-family: 宋体; ">&#8230;</span>&nbsp;catch&nbsp;<span style="font-family: 宋体; ">&#8230;</span>&nbsp;finally&nbsp;<span style="font-family: 宋体; ">代码。</span>&nbsp;<span style="font-family: 宋体; ">我们在使用</span>&nbsp;Spring&nbsp;<span style="font-family: 宋体; ">声明式事务时，有一个非常重要的概念就是事务属性。事务属性通常由事务的传播行为，事务的隔离级别，事务的超时值和事务只读标志组成。我们在进行事务划分时，需要进行事务定义，也就是配置事务的属性。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Spring&nbsp;<span style="font-family: 宋体; ">在</span>&nbsp;TransactionDefinition&nbsp;<span style="font-family: 宋体; ">接口中定义这些属性</span>&nbsp;,&nbsp;<span style="font-family: 宋体; ">以供</span>&nbsp;PlatfromTransactionManager&nbsp;<span style="font-family: 宋体; ">使用</span>&nbsp;, PlatfromTransactionManager&nbsp;<span style="font-family: 宋体; ">是</span>&nbsp;spring&nbsp;<span style="font-family: 宋体; ">事务管理的核心接口。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">getTimeout()</span>&nbsp;<span style="font-family: 宋体; ">方法，它返回事务必须在多少秒内完成。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">isReadOnly()</span>&nbsp;,&nbsp;<span style="font-family: 宋体; ">事务是否只读，事务管理器能够根据这个返回值进行优化，确保事务是只读的。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">getIsolationLevel()</span>&nbsp;<span style="font-family: 宋体; ">方法返回事务的隔离级别，事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: 宋体; ">在</span>&nbsp;TransactionDefinition&nbsp;<span style="font-family: 宋体; ">接口中定义了五个不同的事务隔离级别：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">ISOLATION_DEFAULT</span>&nbsp;<span style="font-family: 宋体; ">这是一个</span>&nbsp;PlatfromTransactionManager&nbsp;<span style="font-family: 宋体; ">默认的隔离级别，使用数据库默认的事务隔离级别</span>&nbsp;.&nbsp;<span style="font-family: 宋体; ">另外四个与</span>&nbsp;JDBC&nbsp;<span style="font-family: 宋体; ">的隔离级别相对应</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">ISOLATION_READ_UNCOMMITTED</span>&nbsp;<span style="font-family: 宋体; ">这是事务最低的隔离级别，它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读，不可重复读和幻像读。</span>&nbsp;<span style="font-family: 宋体; ">例如</span>&nbsp;: Mary<span style="font-family: 宋体; ">的原工资为</span>&nbsp;1000,&nbsp;<span style="font-family: 宋体; ">财务人员将</span>&nbsp;Mary&nbsp;<span style="font-family: 宋体; ">的工资改为了</span>&nbsp;8000&nbsp;<span style="font-family: 宋体; ">，但未提交事务</span>&nbsp;<span style="font-family: 宋体; ">与此同时，</span>&nbsp;Mary<span style="font-family: 宋体; ">正在读取自己的工资</span>&nbsp;Mary&nbsp;<span style="font-family: 宋体; ">发现自己的工资变为了</span>&nbsp;8000&nbsp;<span style="font-family: 宋体; ">，欢天喜地！</span>&nbsp;<span style="font-family: 宋体; ">而财务发现操作有误，而回滚了事务</span>&nbsp;,Mary&nbsp;<span style="font-family: 宋体; ">的工资又变为了</span>&nbsp;1000.&nbsp;<span style="font-family: 宋体; ">像这样</span>&nbsp;,Mary&nbsp;<span style="font-family: 宋体; ">记取的工资数</span>&nbsp;8000&nbsp;<span style="font-family: 宋体; ">是一个脏数据。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">ISOLATION_READ_COMMITTED</span>&nbsp;<span style="font-family: 宋体; ">保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现，但是可能会出现不可重复读和幻像读。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">ISOLATION_REPEATABLE_READ</span>&nbsp;<span style="font-family: 宋体; ">这种事务隔离级别可以防止脏读，不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外，还保证了避免下面的情况产生</span>&nbsp;(&nbsp;<span style="font-family: 宋体; ">不可重复读</span>&nbsp;)&nbsp;<span style="font-family: 宋体; ">。</span>&nbsp;<span style="font-family: 宋体; ">在事务</span>&nbsp;1&nbsp;<span style="font-family: 宋体; ">中，</span>&nbsp;Mary&nbsp;<span style="font-family: 宋体; ">读取了自己的工资为</span>&nbsp;1000,&nbsp;<span style="font-family: 宋体; ">操作并没有完成</span>&nbsp;<span style="font-family: 宋体; ">在事务</span>&nbsp;2&nbsp;<span style="font-family: 宋体; ">中，这时财务人员修改了</span>&nbsp;Mary&nbsp;<span style="font-family: 宋体; ">的工资为</span>&nbsp;2000,&nbsp;<span style="font-family: 宋体; ">并提交了事务</span>&nbsp;.&nbsp;<span style="font-family: 宋体; ">在事务</span>&nbsp;1&nbsp;<span style="font-family: 宋体; ">中，</span>Mary&nbsp;<span style="font-family: 宋体; ">再次读取自己的工资时，工资变为了</span>&nbsp;2000&nbsp;<span style="font-family: 宋体; ">在一个事务中前后两次读取的结果并不致，导致了不可重复读。</span>&nbsp;<span style="font-family: 宋体; ">使用</span>&nbsp;ISOLATION_REPEATABLE_READ&nbsp;<span style="font-family: 宋体; ">可以避免这种情况发生。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">ISOLATION_SERIALIZABLE</span>&nbsp;<span style="font-family: 宋体; ">这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读，不可重复读外，还避免了幻像读。</span>&nbsp;<span style="font-family: 宋体; ">目前工资为</span>&nbsp;1000&nbsp;<span style="font-family: 宋体; ">的员工有</span>&nbsp;10<span style="font-family: 宋体; ">人。</span>&nbsp;<span style="font-family: 宋体; ">事务</span>&nbsp;1,&nbsp;<span style="font-family: 宋体; ">读取所有工资为</span>&nbsp;1000&nbsp;<span style="font-family: 宋体; ">的员工。</span>&nbsp;<span style="font-family: 宋体; ">共读取</span>&nbsp;10&nbsp;<span style="font-family: 宋体; ">条记录</span>&nbsp;<span style="font-family: 宋体; ">这时另一个事务向</span>&nbsp;employee<span style="font-family: 宋体; ">表插入了一条员工记录，工资也为</span>&nbsp;1000&nbsp;<span style="font-family: 宋体; ">事务</span>&nbsp;1&nbsp;<span style="font-family: 宋体; ">再次读取所有工资为</span>&nbsp;1000&nbsp;<span style="font-family: 宋体; ">的员工</span>&nbsp;<span style="font-family: 宋体; ">共读取到了</span>&nbsp;11&nbsp;<span style="font-family: 宋体; ">条记录，这就产生了幻像读。</span>&nbsp;ISOLATION_SERIALIZABLE&nbsp;<span style="font-family: 宋体; ">能避免这样的情况发生。但是这样也耗费了最大的资源。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: #ff6600; ">getPropagationBehavior</span>&nbsp;()&nbsp;<span style="font-family: 宋体; ">返回事务的传播行为，由是否有一个活动的事务来决定一个事务调用。</span>&nbsp;<span style="font-family: 宋体; ">在</span>&nbsp;TransactionDefinition&nbsp;<span style="font-family: 宋体; ">接口中定义了七个事务传播行为：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">PROPAGATION_REQUIRED</span>&nbsp;<span style="font-family: 宋体; ">如果存在一个事务，则支持当前事务。如果没有事务则开启一个新的事务。</span>&nbsp;<span style="font-family: 宋体; ">使用</span>&nbsp;spring&nbsp;<span style="font-family: 宋体; ">声明式事务，</span>&nbsp;spring&nbsp;<span style="font-family: 宋体; ">使用</span>&nbsp;AOP&nbsp;<span style="font-family: 宋体; ">来支持声明式事务，会根据事务属性，自动在方法调用之前决定是否开启一个事务，并在方法执行之后决定事务提交或回滚事务。</span>&nbsp;<span style="font-family: 宋体; ">单独调用</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">方法</span>&nbsp;<span style="font-family: 宋体; ">相当于</span>&nbsp;Spring&nbsp;<span style="font-family: 宋体; ">保证在</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">方法中所有的调用都获得到一个相同的连接。在调用</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">时，没有一个存在的事务，所以获得一个新的连接，开启了一个新的事务。</span>&nbsp;<span style="font-family: 宋体; ">单独调用</span>&nbsp;MethodA&nbsp;<span style="font-family: 宋体; ">时，在</span>&nbsp;MethodA&nbsp;<span style="font-family: 宋体; ">内又会调用</span>&nbsp;MethodB.&nbsp;<span style="font-family: 宋体; ">执行效果相当于</span>&nbsp;<span style="font-family: 宋体; ">调用</span>&nbsp;MethodA&nbsp;<span style="font-family: 宋体; ">时，环境中没有事务，所以开启一个新的事务</span>&nbsp;.&nbsp;<span style="font-family: 宋体; ">当在</span>&nbsp;MethodA&nbsp;<span style="font-family: 宋体; ">中调用</span>MethodB&nbsp;<span style="font-family: 宋体; ">时，环境中已经有了一个事务，所以</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">就加入当前事务。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">PROPAGATION_SUPPORTS</span>&nbsp;<span style="font-family: 宋体; ">如果存在一个事务，支持当前事务。如果没有事务，则非事务的执行。但是对于事务同步的事务管理器，</span>&nbsp;PROPAGATION_SUPPORTS&nbsp;<span style="font-family: 宋体; ">与不使用事务有少许不同。</span>&nbsp;<span style="font-family: 宋体; ">单纯的调用</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">时，</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">方法是非事务的执行的。</span>&nbsp;<span style="font-family: 宋体; ">当调用</span>&nbsp;methdA<span style="font-family: 宋体; ">时</span>&nbsp;,methodB&nbsp;<span style="font-family: 宋体; ">则加入了</span>&nbsp;methodA&nbsp;<span style="font-family: 宋体; ">的事务中</span>&nbsp;,&nbsp;<span style="font-family: 宋体; ">事务地执行。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">PROPAGATION_MANDATORY</span>&nbsp;<span style="font-family: 宋体; ">如果已经存在一个事务，支持当前事务。如果没有一个活动的事务，则抛出异常。</span>&nbsp;<span style="font-family: 宋体; ">当单独调用</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">时，因为当前没有一个活动的事务，则会抛出异常</span>&nbsp;throw new IllegalTransactionStateException("Transaction propagation ''mandatory'' but no existing transaction found");&nbsp;<span style="font-family: 宋体; ">当调用</span>&nbsp;methodA&nbsp;<span style="font-family: 宋体; ">时，</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">则加入到</span>&nbsp;methodA&nbsp;<span style="font-family: 宋体; ">的事务中，事务地执行。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">PROPAGATION_REQUIRES_NEW</span>&nbsp;<span style="font-family: 宋体; ">总是开启一个新的事务。如果一个事务已经存在，则将这个存在的事务挂起。</span>&nbsp;<span style="font-family: 宋体; ">当单独调用</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">时，相当于把</span>&nbsp;methodb&nbsp;<span style="font-family: 宋体; ">声明为</span>&nbsp;REQUIRED&nbsp;<span style="font-family: 宋体; ">。开启一个新的事务，事务地执行。</span>&nbsp;<span style="font-family: 宋体; ">当调用</span>&nbsp;methodA&nbsp;<span style="font-family: 宋体; ">时</span>&nbsp;<span style="font-family: 宋体; ">情况有些大不一样</span>&nbsp;.&nbsp;<span style="font-family: 宋体; ">相当于下面的效果。</span>&nbsp;<span style="font-family: 宋体; ">在这里，我把</span>&nbsp;ts1&nbsp;<span style="font-family: 宋体; ">称为外层事务，</span>&nbsp;ts2&nbsp;<span style="font-family: 宋体; ">称为内层事务。从上面的代码可以看出，</span>&nbsp;ts2&nbsp;<span style="font-family: 宋体; ">与</span>ts1&nbsp;<span style="font-family: 宋体; ">是两个独立的事务，互不相干。</span>&nbsp;Ts2&nbsp;<span style="font-family: 宋体; ">是否成功并不依赖于</span>&nbsp;ts1&nbsp;<span style="font-family: 宋体; ">。如果</span>&nbsp;methodA&nbsp;<span style="font-family: 宋体; ">方法在调用</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">方法后的</span>&nbsp;doSomeThingB&nbsp;<span style="font-family: 宋体; ">方法失败了，而</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">方法所做的结果依然被提交。而除了</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">之外的其它代码导致的结果却被回滚了。</span>&nbsp;<span style="font-family: 宋体; ">使用</span>PROPAGATION_REQUIRES_NEW,&nbsp;<span style="font-family: 宋体; ">需要使用</span>&nbsp;JtaTransactionManager&nbsp;<span style="font-family: 宋体; ">作为事务管理器。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">PROPAGATION_NOT_SUPPORTED</span>&nbsp;<span style="font-family: 宋体; ">总是非事务地执行，并挂起任何存在的事务。</span>&nbsp;<span style="font-family: 宋体; ">当单独调用</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">时，不启用任何事务机制，非事务地执行。</span>&nbsp;<span style="font-family: 宋体; ">当调用</span>&nbsp;methodA&nbsp;<span style="font-family: 宋体; ">时，相当于下面的效果</span>&nbsp;<span style="font-family: 宋体; ">使用</span>&nbsp;PROPAGATION_NOT_SUPPORTED,&nbsp;<span style="font-family: 宋体; ">也需要使用</span>&nbsp;JtaTransactionManager&nbsp;<span style="font-family: 宋体; ">作为事务管理器。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">PROPAGATION_NEVER</span>&nbsp;<span style="font-family: 宋体; ">总是非事务地执行，如果存在一个活动事务，则抛出异常</span>&nbsp;<span style="font-family: 宋体; ">单独调用</span>methodB&nbsp;<span style="font-family: 宋体; ">，则非事务的执行。</span>&nbsp;<span style="font-family: 宋体; ">调用</span>&nbsp;methodA&nbsp;<span style="font-family: 宋体; ">则会抛出异常</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 21pt; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: -21pt; "><span style="font-family: Wingdings; ">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #ff6600; ">PROPAGATION_NESTED</span>&nbsp;<span style="font-family: 宋体; ">如果一个活动的事务存在，则运行在一个嵌套的事务中</span>&nbsp;.&nbsp;<span style="font-family: 宋体; ">如果没有活动事务</span>&nbsp;,&nbsp;<span style="font-family: 宋体; ">则按</span>&nbsp;TransactionDefinition.PROPAGATION_REQUIRED&nbsp;<span style="font-family: 宋体; ">属性执行</span>&nbsp;<span style="font-family: 宋体; ">这是一个嵌套事务</span>&nbsp;,&nbsp;<span style="font-family: 宋体; ">使用</span>&nbsp;JDBC 3.0&nbsp;<span style="font-family: 宋体; ">驱动时</span>&nbsp;,&nbsp;<span style="font-family: 宋体; ">仅仅支持</span>&nbsp;DataSourceTransactionManager&nbsp;<span style="font-family: 宋体; ">作为事务管理器。需要</span>&nbsp;JDBC&nbsp;<span style="font-family: 宋体; ">驱动的</span>&nbsp;java.sql.Savepoint&nbsp;<span style="font-family: 宋体; ">类。有一些</span>&nbsp;JTA&nbsp;<span style="font-family: 宋体; ">的事务管理器实现可能也提供了同样的功能。</span>&nbsp;<span style="font-family: 宋体; ">使用</span>&nbsp;PROPAGATION_NESTED&nbsp;<span style="font-family: 宋体; ">，还需要把</span>&nbsp;PlatformTransactionManager&nbsp;<span style="font-family: 宋体; ">的</span>nestedTransactionAllowed&nbsp;<span style="font-family: 宋体; ">属性设为</span>&nbsp;true;&nbsp;<span style="font-family: 宋体; ">而</span>&nbsp;nestedTransactionAllowed&nbsp;<span style="font-family: 宋体; ">属性值默认为</span>false;&nbsp;<span style="font-family: 宋体; ">如果单独调用</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">方法，则按</span>&nbsp;REQUIRED&nbsp;<span style="font-family: 宋体; ">属性执行。</span>&nbsp;<span style="font-family: 宋体; ">如果调用</span>&nbsp;methodA&nbsp;<span style="font-family: 宋体; ">方法，相当于下面的效果</span>&nbsp;<span style="font-family: 宋体; ">当</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">方法调用之前，调用</span>&nbsp;setSavepoint&nbsp;<span style="font-family: 宋体; ">方法，保存当前的状态到</span>&nbsp;savepoint&nbsp;<span style="font-family: 宋体; ">。如果</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">方法调用失败，则恢复到之前保存的状态。但是需要注意的是，这时的事务并没有进行提交，如果后续的代码</span>&nbsp;(doSomeThingB()&nbsp;<span style="font-family: 宋体; ">方法</span>&nbsp;)&nbsp;<span style="font-family: 宋体; ">调用失败，则回滚包括</span>&nbsp;methodB&nbsp;<span style="font-family: 宋体; ">方法的所有操作。</span>&nbsp;<span style="font-family: 宋体; ">嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时，会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="color: red; ">PROPAGATION_NESTED&nbsp;</span><span style="font-family: 宋体; color: red; ">与</span>&nbsp;<span style="color: red; ">PROPAGATION_REQUIRES_NEW</span>&nbsp;<span style="font-family: 宋体; color: red; ">的区别：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-family: 宋体; ">它们非常类似</span>&nbsp;,&nbsp;<span style="font-family: 宋体; ">都像一个嵌套事务，如果不存在一个活动的事务，都会开启一个新的事务。使用</span>PROPAGATION_REQUIRES_NEW&nbsp;<span style="font-family: 宋体; ">时，内层事务与外层事务就像两个独立的事务一样，一旦内层事务进行了提交后，外层事务不能对其进行回滚。两个事务互不影响。两个事务这是一个真正的嵌套事务。同时它需要</span>&nbsp;JTA&nbsp;<span style="font-family: 宋体; ">事务管理器的支持。</span>&nbsp;<span style="font-family: 宋体; ">使用</span>&nbsp;PROPAGATION_NESTED&nbsp;<span style="font-family: 宋体; ">时，外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚，它是一个真正的嵌套事务。</span>&nbsp;DataSourceTransactionManager&nbsp;<span style="font-family: 宋体; ">使用</span>&nbsp;savepoint&nbsp;<span style="font-family: 宋体; ">支持</span>PROPAGATION_NESTED&nbsp;<span style="font-family: 宋体; ">时，需要</span>&nbsp;JDBC 3.0&nbsp;<span style="font-family: 宋体; ">以上驱动及</span>&nbsp;1.4&nbsp;<span style="font-family: 宋体; ">以上的</span>&nbsp;JDK&nbsp;<span style="font-family: 宋体; ">版本支持。其它的</span>JTA TrasactionManager&nbsp;<span style="font-family: 宋体; ">实现可能有不同的支持方式。</span>&nbsp;PROPAGATION_REQUIRED&nbsp;<span style="font-family: 宋体; ">应该是我们首先的事务传播行为。它能够满足我们大多数的事务需求。</span></p></span></div><img src ="http://www.blogjava.net/jianyue/aggbug/365092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2011-11-29 10:25 <a href="http://www.blogjava.net/jianyue/archive/2011/11/29/365092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>maven 概念与实践 phase, goal, plugin</title><link>http://www.blogjava.net/jianyue/archive/2011/09/22/359233.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Thu, 22 Sep 2011 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2011/09/22/359233.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/359233.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2011/09/22/359233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/359233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/359233.html</trackback:ping><description><![CDATA[参考这篇文章：<a href="http://blog.csdn.net/bluishglc/article/details/6632280">http://blog.csdn.net/bluishglc/article/details/6632280</a>&nbsp;<br />一。Maven的执行方式<br /><div><span style="font-family: Arial; line-height: 26px; ">maven对构建(build)的过程进行了抽象和定义，这个过程被称为构建的生命周期(lifecycle)。生命周期(lifecycle)由多个阶段(phase)组成,每个阶段(phase)会挂接一到多个goal。goal是maven里定义任务的最小单元，goal分为两类，一类是绑定phase的，就是执行到某个phase，那么这个goal就会触发，另外一类不绑定，就是单独任务，这就相当于ant里的target。<br /></span></div>1。以phase来构建<br />例如：<br />mvn clean<br />mvn compile<br />mvn test<br />mvn package<br />表明maven会执行到某个生命周期(lifecycle)的某个阶段(phase)<br />这个phase以及它前面所有phase绑定的目标(goal)都会执行， 每个phase都会邦定maven默认的goal或者没有goal， 或者自定义的goal。<br />也可以通过传入参数跳过(skip)某些phase，例如：<br /><div><span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; font-size: 12px; line-height: 18px; "><span style="color: black; ">mvn&nbsp;install&nbsp;-Dmaven.test.skip=</span><span style="color: #7f0055; font-weight: bold; ">true</span></span></div><br />1。以goal来构建<br />这类就是没有绑定phase的goal，但是这类goal却通常会有个执行前提，就是project必须执行到某个phase，<br />那么执行这个goal，其实也会触发maven执行到前提要求的phase。<br />例如jetty:run是个非绑定phase的goal，它的前提是<span class="Apple-style-span" style="font-family: Arial; line-height: 26px; ">test-compile，这个前提是由plugin的代码逻辑制定的</span><br /><br /><div><div>/**</div><div>&nbsp;* @goal run</div><div>&nbsp;* @requiresDependencyResolution runtime</div><div><span style="color: #0000ff; ">&nbsp;* @execute phase="test-compile"</span></div><div>&nbsp;* @description Runs jetty6 directly from a maven project</div><div>&nbsp;*/</div><div>public class Jetty6RunMojo extends AbstractJettyRunMojo</div><div>{</div><div>&nbsp; &nbsp; ...</div><div>}<br /></div></div>二。Maven lifecycle, phase概览<br /><span class="Apple-style-span" style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 20px; ">Maven预设了三个Lifecycle ，各包含了下列Phases.</span><div><span style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 20px; "><ol style="margin-top: 5px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-left: 20px; "><li>Clean Lifecycle<ul style="margin-top: 5px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-left: 20px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">pre-clean</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">clean</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">post-clean</li></ul></li><li>Default Lifecycle<ul style="margin-top: 5px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-left: 20px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">validate</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">initialize</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">generate-sources</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">process-sources</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">generate-resources</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">process-resources</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">compile</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">process-classes</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">generate-test-sources</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">process-test-sources</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">process-test-resources</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">test-compile</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">process-test-classes</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">test</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">prepare-package</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">package</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">pre-integration-test</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">integration-test</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">post-integration-test</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">verify</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">install</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">deploy</li></ul></li><li>Site Lifecycle<ul style="margin-top: 5px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-left: 20px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">pre-site</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">site</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">post-site</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">site-deploy</li></ul></li></ol></span></div><img src ="http://www.blogjava.net/jianyue/aggbug/359233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2011-09-22 10:01 <a href="http://www.blogjava.net/jianyue/archive/2011/09/22/359233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jave 命令行执行</title><link>http://www.blogjava.net/jianyue/archive/2011/09/16/358809.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Fri, 16 Sep 2011 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2011/09/16/358809.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/358809.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2011/09/16/358809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/358809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/358809.html</trackback:ping><description><![CDATA[1.Window<br />
<ul>
     <li>java -classpath .;jar1;jar2 MainClass<br />
     注意: -classpath参数必须放于前面。</li>
     <li>java -jar jar1<br />
     jar包的MANIFEST.MF文件:<br />
     <div>
     <div>Manifest-Version: 1.0</div>
     <div>Main-Class: com.Main1</div>
     <div>Class-Path: jar1.jar;jar2.jar<br />
     <br />
     注意: 使用-jar参数，那么主jar包必须含有MANIFEST.MF信息，并且指定Main-Class &amp; Class-Path。命令行的-classpath参数将被忽略<br />
     </div>
     </div>
     </li>
</ul>
2.Linux<br />区别：<br />目录分隔符由\变成/<br />jar包分隔符由;变成:<br /><br />Window测试环境是Sun java version "1.6.0_14"<br />其他版本没有验证<img src ="http://www.blogjava.net/jianyue/aggbug/358809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2011-09-16 17:10 <a href="http://www.blogjava.net/jianyue/archive/2011/09/16/358809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>maven plugin 与 eclipse 目录结构兼容</title><link>http://www.blogjava.net/jianyue/archive/2011/09/16/357210.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Fri, 16 Sep 2011 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2011/09/16/357210.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/357210.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2011/09/16/357210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/357210.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/357210.html</trackback:ping><description><![CDATA[<div><a href="http://www.devx.com/java/Article/36785/1954">http://www.devx.com/java/Article/36785/1954</a></div><img src ="http://www.blogjava.net/jianyue/aggbug/357210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2011-09-16 16:59 <a href="http://www.blogjava.net/jianyue/archive/2011/09/16/357210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAX-WS client</title><link>http://www.blogjava.net/jianyue/archive/2011/09/16/358573.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Fri, 16 Sep 2011 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2011/09/16/358573.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/358573.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2011/09/16/358573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/358573.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/358573.html</trackback:ping><description><![CDATA[<div>1.绑定本地接口，自动生成代理对象<br />复制下面链接代码<br /><div><a href="http://blessht.iteye.com/blog/1105562">http://blessht.iteye.com/blog/1105562</a></div><div><div>// Endpoint Address</div><div>String endpointAddress = "http://localhost:8111/helloWorld";</div><div>// Add a port to the Service</div><div>service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);</div><div>HelloService hw = service.getPort(HelloService.class);</div><div>System.out.println(hw.sayHi("World"));<br /><br />2.wsimport生成客户端<br />参照:<a href="http://download.oracle.com/javase/6/docs/technotes/tools/share/wsimport.html">http://download.oracle.com/javase/6/docs/technotes/tools/share/wsimport.html<br /></a><div><span style="font-family: Arial, Helvetica, FreeSans, Luxi-sans, 'Nimbus Sans L', sans-serif; font-size: 12px; line-height: normal; "><pre style="font-family: 'Courier New', Monaco, Courier, monospace; "><a href="http://download.oracle.com/javase/6/docs/technotes/tools/share/wsimport.html" style="color: #444444; font-weight: bold; ">wsimport -p stockquote http://stockquote.xyz/quote?wsdl<br /><br /></a><div><span style="font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; white-space: normal; "><span class="Apple-style-span" style="color: #000000; font-weight: normal; ">3.动态代理</span><br /><div><a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Ftwbs_jaxwsdynclient.html"><span class="Apple-style-span" style="color: #000000; font-weight: normal; ">http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Ftwbs_jaxwsdynclient.html</span><br /></a></div></span></div><a href="http://download.oracle.com/javase/6/docs/technotes/tools/share/wsimport.html" style="color: #444444; font-weight: bold; "></a></pre></span></div><a href="http://download.oracle.com/javase/6/docs/technotes/tools/share/wsimport.html"></a></div></div></div><img src ="http://www.blogjava.net/jianyue/aggbug/358573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2011-09-16 16:58 <a href="http://www.blogjava.net/jianyue/archive/2011/09/16/358573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java add http &amp; https proxy(Fiddler)</title><link>http://www.blogjava.net/jianyue/archive/2011/09/16/358541.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Fri, 16 Sep 2011 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2011/09/16/358541.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/358541.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2011/09/16/358541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/358541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/358541.html</trackback:ping><description><![CDATA[<div><span style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; line-height: 18px; ">java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=8888</span></div><img src ="http://www.blogjava.net/jianyue/aggbug/358541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2011-09-16 16:58 <a href="http://www.blogjava.net/jianyue/archive/2011/09/16/358541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载: Keytool command</title><link>http://www.blogjava.net/jianyue/archive/2011/09/16/358620.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Fri, 16 Sep 2011 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2011/09/16/358620.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/358620.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2011/09/16/358620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/358620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/358620.html</trackback:ping><description><![CDATA[<div><h2>Java Keytool Commands for Creating and Importing</h2><p style="color: #666666; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; ">These commands allow you to generate a new Java Keytool keystore file, create a CSR, and import certificates. Any root or intermediate certificates will need to be imported before importing the primary certificate for your domain.</p><ul style="color: #666666; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; "><li><strong>Generate a Java keystore and key pair</strong><p>keytool -genkey -alias&nbsp;<u>mydomain</u>&nbsp;-keyalg RSA -keystore&nbsp;<u>keystore.jks&nbsp;</u>-keysize 2048</p></li><li><strong>Generate a certificate signing request (CSR) for an existing Java keystore</strong><p>keytool -certreq -alias&nbsp;<u>mydomain</u>&nbsp;-keystore&nbsp;<u>keystore.jks</u>&nbsp;-file&nbsp;<u>mydomain.csr</u></p></li><li><strong>Import a root or intermediate CA certificate to an existing Java keystore</strong><p>keytool -import -trustcacerts -alias root -file&nbsp;<u>Thawte.crt</u>&nbsp;-keystore&nbsp;<u>keystore.jks</u></p></li><li><strong>Import a signed primary certificate to an existing Java keystore</strong><p>keytool -import -trustcacerts -alias&nbsp;<u>mydomain</u>&nbsp;-file&nbsp;<u>mydomain.crt</u>&nbsp;-keystore&nbsp;<u>keystore.jks</u></p></li><li><strong>Generate a keystore and self-signed certificate</strong>&nbsp;(see&nbsp;<a href="http://www.sslshopper.com/article-how-to-create-a-self-signed-certificate-using-java-keytool.html" style="color: #3998d4; text-decoration: underline; ">How to Create a Self Signed Certificate using Java Keytool</a>&nbsp;for more info)<p>keytool -genkey -keyalg RSA -alias selfsigned -keystore&nbsp;<u>keystore.jks</u>&nbsp;-storepass&nbsp;<u>password</u>&nbsp;-validity 360 -keysize 2048</p></li></ul><h2>Java Keytool Commands for Checking</h2><p style="color: #666666; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; ">If you need to check the information within a certificate, or Java keystore, use these commands.</p><ul style="color: #666666; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; "><li><strong>Check a stand-alone certificate</strong><p>keytool -printcert -v -file&nbsp;<u>mydomain.crt</u></p></li><li><strong>Check which certificates are in a Java keystore</strong><p>keytool -list -v -keystore&nbsp;<u>keystore.jks</u></p></li><li><strong>Check a particular keystore entry using an alias</strong><p>keytool -list -v -keystore&nbsp;<u>keystore.jks</u>&nbsp;-alias mydomain</p></li></ul><h2>Other Java Keytool Commands</h2><ul style="color: #666666; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; "><li><strong>Delete a certificate from a Java Keytool keystore</strong><p>keytool -delete -alias&nbsp;<u>mydomain</u>&nbsp;-keystore&nbsp;<u>keystore.jks</u></p></li><li><strong>Change a Java keystore password</strong><p>keytool -storepasswd -new new_storepass -keystore&nbsp;<u>keystore.jks</u></p></li><li><strong>Export a certificate from a keystore</strong><p>keytool -export -alias&nbsp;<u>mydomain</u>&nbsp;-file&nbsp;<u>mydomain.crt</u>&nbsp;-keystore&nbsp;<u>keystore.jks</u></p></li><li><strong>List Trusted CA Certs</strong><p>keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts</p></li><li><strong>Import New CA into Trusted Certs</strong><p>keytool -import -trustcacerts -file&nbsp;<u>/path/to/ca/ca.pem</u>&nbsp;-alias&nbsp;<u>CA_ALIAS</u>&nbsp;-keystore $JAVA_HOME/jre/lib/security/cacerts</p></li></ul></div><img src ="http://www.blogjava.net/jianyue/aggbug/358620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2011-09-16 16:24 <a href="http://www.blogjava.net/jianyue/archive/2011/09/16/358620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>htm的tooltip</title><link>http://www.blogjava.net/jianyue/archive/2010/05/28/322159.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Fri, 28 May 2010 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/archive/2010/05/28/322159.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/322159.html</wfw:comment><comments>http://www.blogjava.net/jianyue/archive/2010/05/28/322159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/322159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/322159.html</trackback:ping><description><![CDATA[<div style="margin-top: 5px; margin-left: 15px; overflow: auto; width: 710px; line-height: 17pt">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p><span style="color: blue">第一种方式:适合于全部HTML标签</span> <br />
            &lt;<span style="color: red">acronym </span><span style="color: blue">title</span>="World Wide Web"&gt; <br />
            WWW <br />
            &lt;/<span style="color: red">acronym</span>&gt;</p>
            <p><span style="color: blue">第二种方式:IMG之类的标签</span>例如: <br />
            &lt;img src="#" <span style="color: red">alt</span>="鼠标移动到上方会显示并且未加载图片时也会显示"&gt;</p>
            <p><span style="color: blue">第三种方式:input之类的标签</span>例如: <br />
            &lt;input type="button" value="确定" <span style="color: red">title</span>="鼠标移动到上方会显示并且未加载图片时也会显示"&gt; </p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/jianyue/aggbug/322159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2010-05-28 16:31 <a href="http://www.blogjava.net/jianyue/archive/2010/05/28/322159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>