﻿<?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-Read Sean-随笔分类-On Java</title><link>http://www.blogjava.net/sean/category/35.html</link><description>Read me, read Sean.</description><language>zh-cn</language><lastBuildDate>Wed, 28 May 2008 15:02:02 GMT</lastBuildDate><pubDate>Wed, 28 May 2008 15:02:02 GMT</pubDate><ttl>60</ttl><item><title>[新闻] JRuby 1.1.2 发布</title><link>http://www.blogjava.net/sean/archive/2008/05/28/203452.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 28 May 2008 04:08:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/05/28/203452.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/203452.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/05/28/203452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/203452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/203452.html</trackback:ping><description><![CDATA[
		<br />JVM下的Ruby语言实现JRuby发布1.1版的第二个升级版1.1.2，这个版本最主要关注的仍然是性能，值得一提的包括：<br />
1- 启动时间大大缩短。<br />
2- YAML标记解析速度提高100x以上。<br />
3- 方法调用在性能、线程和栈深度等方面的增强。<br />4- 其他bug。<br /><br />主页: <a target="_blank" title="http://jruby.codehaus.org/" href="http://jruby.codehaus.org/">http://jruby.codehaus.org/</a><br />下载: <a target="_blank" title="http://dist.codehaus.org/jruby/" href="http://dist.codehaus.org/jruby/">http://dist.codehaus.org/jruby/</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/203452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-05-28 12:08 <a href="http://www.blogjava.net/sean/archive/2008/05/28/203452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] JRuby 1.1发布</title><link>http://www.blogjava.net/sean/archive/2008/04/05/190985.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 05 Apr 2008 15:01:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/04/05/190985.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/190985.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/04/05/190985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/190985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/190985.html</trackback:ping><description><![CDATA[
		<br />JVM下的Ruby语言实现JRuby正式发布1.1版，这个版本最主要关注的是性能，除此之外，值得一提的包括：<br />1- 支持将Ruby代码编译成Java Bytecode。<br />2- 将Oniguruma这个Ruby 1.9标配的正则库移植到Java。<br />3- 重构过的IO实现。<br />4- 更低的内存消耗。<br />5- 修复大量其他兼容性问题。<br /><br />主页: <a target="_blank" title="http://jruby.codehaus.org/" href="http://jruby.codehaus.org/">http://jruby.codehaus.org/</a><br />下载: <a target="_blank" title="http://dist.codehaus.org/jruby/" href="http://dist.codehaus.org/jruby/">http://dist.codehaus.org/jruby/</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/190985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-04-05 23:01 <a href="http://www.blogjava.net/sean/archive/2008/04/05/190985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] 移植Oracle数据库到PostgreSQL的要点</title><link>http://www.blogjava.net/sean/archive/2008/03/11/185510.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 11 Mar 2008 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/03/11/185510.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/185510.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/03/11/185510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/185510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/185510.html</trackback:ping><description><![CDATA[
		<br />最近尝试把一个Oracle数据库，连同构建在这个数据库上的Java应用移植到PostgreSQL环境。在移植过程中，总结了一些要点，一方面作为笔记备忘，一方面也给有类似任务需要处理而又无从下手的朋友作为参考。<br /><br />1- 首先是准备PostgreSQL环境。有条件的话，最好是找一台空闲的PC机作为测试服务器，安装Linux或BSD，然后从源码编译最新的PostgreSQL 8.3.0。编译时，通过configure指定--with-perl和--with-python以支持PL/Perl和PL/Python。因为绝大多数Linux发行版都已自带Perl和Python，不必额外安装。<br /><br />2- 如果是Windows环境，又需要Perl和Python，则必须额外安装，Python的话，可以方便的找到2.5 for Windows的安装包，Perl的话，推荐ActivePerl，相对麻烦一点，为了后面用到的一些便利的功能顺利加载，Perl版本尽量选5.8.8。<br /><br />3- 创建数据库和用户。通过initdb初始化数据目录，配置postgresql.conf指定主机IP、端口等等信息，配置pg_hba.conf指定访问权限，通过pg_ctl -D &lt;数据目录&gt; -l &lt;日志文件&gt; start启动postmaster，然后createdb、createuser创建数据库和用户。数据库建好之后，就可以createlang -d &lt;数据库名&gt; [plperl|plperlu|plpython|plpythonu]开启PL/Perl和PL/Python。具体命令行参数可通过各命令加--help查看。<br /><br />4- 安装PostgreSQL客户端pgAdminIII，最新版是1.8.2，有条件的话，也可以下载源码自己编译。<br /><br />5- 安装Oracle客户端，需要在PostgreSQL同一台机器，以便Perl用于连接数据库的DBI和Oracle驱动DBD::Oracle模块顺利安装。如果是Windows上的ActivePerl，则可以通过ppm install DBD-Oracle，如果是Linux/BSD，则可以通过CPAN来安装，如perl -MCPAN -e shell进入CPAN Shell，通过install &lt;模块名&gt;或force install &lt;模块名&gt;安装DBI和DBD::Oracle。<br /><br />6- 数据库的移植，可以选择ora2pg来帮忙，目前的版本是4.7。ora2pg是一个用于读取Oracle数据库schema、数据，并生成PostgreSQL脚本或直接导入PostgreSQL数据库的Perl工具。用法很简单，就是通过.conf文件指定数据库连接信息包括NLS_LANG、需要导出导入的schema、table、view、data等等，然后执行一个pl脚本。这是目前相对比较成熟的一个方案，但是遇到schema复杂、约束较强的数据库，需要手工处理的地方还是不少。建议不要直接写入PostgreSQL，而是生成SQL脚本，验证无误后再执行。ora2pg默认会把Oracle中名称的大写转换成小写，因为PostgreSQL在解析SQL时，除非""括起来，默认都是转成小写。schema、table、view、sequence、data等等，基本用ora2pg，加上一些手工调整即可搞定。至于function、stored procedure等，还是手工移吧，偷不得懒。除了ora2pg，其实也可以配置DBI-Link，将Oracle数据库挂到PostgreSQL数据库作为一组独立的"schema"，然后用create table xxx as select ... from ...这样的语法来倒表和数据。PostgreSQL的contrib包也附带有一个dblink，不过是连接其他PostgreSQL数据库的，如果需要连接非PostgreSQL，
还是考虑DBI-Link，任何可以通过Perl的DBI接口访问的数据库，都能link进PostgreSQL。<br /><br />7- 接下来就是Java应用本身了，我这次移的这个应用是Spring+iBatis架构的，很多SQL语句都是明文，好在DAO层的基础部分(CRUD)的SQLMap是工具自动生成，且都是符合ANSI SQL92标准的，不需要修改即可使用。其余的高级查询SQL，需要调整的地方不少，一些常见的修改列举如下：<br /><br />i. SELECT出来的column（包括子查询），如果有别名，必须加AS，比如 select null as some_column from some_table;<br />ii. PostgreSQL没有dual表，类似select 0 from dual的语句，写成select 0即可;<br />iii. DECODE函数需要重构成(case when some_column = 'some_value' then 'some_other_value' when ... then ... else 'some_default_value' end ) as some_column;<br />iv. NVL()函数，PostgreSQL中相对应的是coalesce()，其实几乎所有主流DBMS都支持coalesce，包括Oracle，这才是标准写法;<br />v. 比较日期，在PostgreSQL中，建议使用date_trunc('day', SOME_DATE) = date_trunc('day', #enteredDate#)这样的写法，其中'day'位置可选字段包括有year、month、week、hour、minute、second等等;<br />vi. SYSDATE，对应到PostgreSQL是current_timestamp，可以根据需要使用current_date;<br />vii. ROWNUM，通常我们用ROWNUM都是为了限制查询出来的记录数，PostgreSQL没有这个关键字，需要改成在SELECT语句最后添加 LIMIT语句，如LIMIT 100;<br />viii. (+)这样的外连接写法需要调整为SQL标准的 table1 [LEFT|RIGHT|FULL] OUTER JOIN table2 ON (...);<br />ix. CONNECT BY ... START WITH ... 递归查询可以参考 http: //www.postgresql.org/docs/8.3/static/tablefunc.html 的connectby()函数.<br /><br />最后再多提一点，PostgreSQL自带的过程语言是PL/pgSQL，在PostgreSQL上写function，除了用plpqsql，还支持sql、plperl(u)、plpython(u)等等。如果你对SQL天生过敏，看类似PL/pgSQL的代码都很吃力，别说是写了，你完全可以用你喜欢的语言来表达函数和存储过程的逻辑。有了PL/Python，你还怕什么呢？你几乎能做任何事。<br /><br />[更新 20080313] 把JDBC驱动的部分漏掉了，移植Java应用时，除了改SQL，还需要拿PostgreSQL的JDBC驱动放到classpath下面，如WEB-INF/lib，然后修改数据库连接URL，改成jdbc:postgresql://&lt;ip&gt;:&lt;port&gt;/&lt;dbname&gt;即可。<br /><br />[更新 20080323] 移植schema和数据时，比ora2pg更方便的一种方式是利用EnterpriseDB的Migration Tool，将Oracle的JDBC驱动ojdbc14.jar拷贝到EnterpriseDB安装路径下的jre/lib/ext下后，启动Developer Studio即可建立Oracle连接，选中schema后，可以通过右键Online Migration将schema、数据、函数包等等一次性通通导入EnterpriseDB。如果要继续往"纯"PostgreSQL移，从EDB做backup，然后到PostgreSQL下做restore，这样会丢掉函数包，因为毕竟EDB在PostgreSQL基础上做了相当改造以和Oracle兼容，不过函数包之类还是手工移比较稳妥。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/185510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-03-11 23:04 <a href="http://www.blogjava.net/sean/archive/2008/03/11/185510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Sun Hires Python Experts</title><link>http://www.blogjava.net/sean/archive/2008/03/05/183819.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 04 Mar 2008 16:07:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/03/05/183819.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/183819.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/03/05/183819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/183819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/183819.html</trackback:ping><description><![CDATA[
		<br />在JRuby得到Sun的认可并成功发布1.0，已经向1.1迈进之时，比Ruby应用更广、更早出现JVM运行版本的Python也终于得到了Sun的重视：<br /><br /><a target="_blank" title="http://www.eweek.com/c/a/Application-Development/Sun-Hires-Python-Experts/" href="http://www.eweek.com/c/a/Application-Development/Sun-Hires-Python-Experts/">http://www.eweek.com/c/a/Application-Development/Sun-Hires-Python-Experts/</a><br /><br />尽管Sun官方的说法是他们会更多的应用和扶持native版的Python，相信一直饱受冷落的Jython，也多少会从中受益吧。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/183819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-03-05 00:07 <a href="http://www.blogjava.net/sean/archive/2008/03/05/183819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Apache Harmony 5.0 reaches M5</title><link>http://www.blogjava.net/sean/archive/2008/02/29/183052.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 29 Feb 2008 15:28:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/02/29/183052.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/183052.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/02/29/183052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/183052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/183052.html</trackback:ping><description><![CDATA[
		<br />就在2月的最后一天，Apache Harmony发布了5.0的第5个milestone: <a target="_blank" title="http://harmony.apache.org/" href="http://harmony.apache.org/">http://harmony.apache.org/</a><br /><br />为默默耕耘的人鼓掌。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/183052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-02-29 23:28 <a href="http://www.blogjava.net/sean/archive/2008/02/29/183052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Grails正式发布1.0版</title><link>http://www.blogjava.net/sean/archive/2008/02/07/179425.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 07 Feb 2008 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/02/07/179425.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/179425.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/02/07/179425.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/179425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/179425.html</trackback:ping><description><![CDATA[
		<br />春节期间真是好事不断啊，继<a target="_blank" title="http://www.blogjava.net/sean/archive/2008/02/07/179424.html" href="/sean/archive/2008/02/07/179424.html">PostgreSQL 8.3正式release</a>后，Grails也如约发布1.0版。作为受到Ruby on Rails启发开动的"Groovy版Rails"项目，它在设计哲学上和Rails，包括JRuby版的Rails，有着很大的不同，Rails是从头开始用Ruby完整实现从表现层到ORM所有功能，而Grails则是利用Java社区现有的成熟开源框架，如Spring、Hibernate等，在此基础上整合出一套完整的Web应用框架，有点类似Pylons和Django的区别。<br /><br />我<a target="_blank" title="http://www.blogjava.net/sean/archive/2008/01/27/178036.html" href="/sean/archive/2008/01/27/178036.html">之前一篇随笔</a>也提到过，和其它在JVM中运行的动态语言如Jython、JRuby不同的是，Groovy对于有Java基础的人们来说，学习曲线几乎是平的，上手很快，如果你同时也熟悉Spring和Hibernate等，那么Grails更是不二之选。<br /><br />官网: <a target="_blank" title="http://grails.codehaus.org/" href="http://grails.codehaus.org/">http://grails.codehaus.org/</a><br />Release Notes: <a target="_blank" title="http://grails.org/1.0+Release+Notes" href="http://grails.org/1.0+Release+Notes">http://grails.org/1.0+Release+Notes</a><br />下载: <a target="_blank" title="http://grails.codehaus.org/Download" href="http://grails.codehaus.org/Download">http://grails.codehaus.org/Download</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/179425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-02-07 10:47 <a href="http://www.blogjava.net/sean/archive/2008/02/07/179425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接] 会Java？学Groovy？这里有篇很好的介绍/演示 </title><link>http://www.blogjava.net/sean/archive/2008/01/27/178036.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 27 Jan 2008 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/01/27/178036.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/178036.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/01/27/178036.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/178036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/178036.html</trackback:ping><description><![CDATA[
		<br />如果你有一定的Java基础，想快速的尝尝动态语言的味道，Groovy是个自然的过渡选择。今天无意中看到一篇介绍Groovy的文章，很短，也很有趣，从一个典型的Java程序开始，一步一步"Groovy化"，最终改造成一个完整的Groovy程序：<br /><a target="_blank" href="http://java.dzone.com/news/java-groovy-few-easy-steps"><br />http://java.dzone.com/news/java-groovy-few-easy-steps</a><br /><br />如果你对当下动态语言的现状有所了解，那你多半已经知道能在JVM中运行的动态语言，远不止Groovy一种，那么什么理由会让你选择Groovy而非Jython、JRuby或者其他类似的语言呢？笔者认为主要还是编码习惯和风格，Groovy是这些语言中最接近Java的。Jython和JRuby都是从其他成功的动态语言"移植"过来，带有明显的Python、Ruby语法特征和习惯。选择Jython或者JRuby的朋友，我想大都是原本就有Python或者Ruby的基础，舍不得Python和Ruby的一些很方便的语法和编码风格/习惯/哲学，或者干脆就是为了将Python和Ruby世界的一些框架引入到Java中，或者说是让Python/Ruby应用能够更好的利用Java平台已有的资源。如果你在动态语言上没有这方面的需求，只是为了让你的Java应用更动态，选择Jython或者JRuby只能是凭空增加学习难度。要知道，Python和Ruby都是很有特点、很有个性的语言（其实Java又何尝不是），要从Java的思维和哲学，转向Python/Ruby的思维和哲学，并不是那么容易做到和做好的。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/178036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-01-27 17:14 <a href="http://www.blogjava.net/sean/archive/2008/01/27/178036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> [Tips] When ANT is not enough, JRuby to the rescue!</title><link>http://www.blogjava.net/sean/archive/2007/06/18/124859.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 17 Jun 2007 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/06/18/124859.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/124859.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/06/18/124859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/124859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/124859.html</trackback:ping><description><![CDATA[
		<br />
随着项目越来越大，你的ANT脚本变得越来越臃肿，越来越依赖antcontrib来实现构建逻辑？不想放弃对构建过程和产出做精细的控制？恨不得自己写ANT Task？<br /><br />
等一等，在你考虑转向Maven或者真正卷起袖子开始研究ANT Task的API之前，先听我向你推荐Ruby/JRuby。相信我，也许这才是你真正需要的。<br /><br />
在我看来构建脚本最主要的要求是表达能力和控制能力，表达能力是我们应该能够很方便的告诉它我们要它做什么，而控制能力是我们告诉它如何去做，除了必要的
构建命令的参数、依赖关系之外，它应该能够理解我们其他一些特殊要求。在项目相对简单时，ANT的XML格式的"脚本语言"能够比较好的表达构建者的要
求，至少比纯Java的方式更加简单清晰，于是几乎从它诞生之日就成为Java领域当仁不让的头号构建工具。但是ANT也有它不够用的时候，尤其在控制能
力上，为了实现实际使用中越来越复杂越来越精细的对构建过程和产出的要求，ANT的使用者们开始对ANT进行扩展，最具影响力的"非官方"扩展可能就是
antcontrib了，很多实际Java项目的构建文件中我们都能够找到它的影子。但是一堆taskdef和<variable><substring><stringutil><length><math>之类的夹杂在ANT脚本里，怎么看怎么觉得别扭，也严重影响构建脚本的可读性。<br /><br />
我发现我需要的是一个具有完整功能脚本语言来写我的构建逻辑：一方面它要足够简单，我需要清晰的表达我的意图，另一方面当我需要的时候它要足够强大来帮我实现精细的控制。我自然而然想到Ruby。<br /><br />
由于Ruby是一个功能完整的工具，完全自己写Ruby脚本来调用Java自己的构建工具如javac、jar等等并非不可能，但是既然已经有人做了轮
子，我们拿来用就是了，大不了自己再改装一下，也少走些弯路。时下比较流行的解决方案有Buildr、Raven、Rant和Antwrap，它们各有特
点，大家可以根据需要进行选择。<br /><br />
我最终选了其中最"轻量"的Antwrap，原因嘛，我不想学新的API，我已经熟悉ANT常用的Task，而且我希望尽可能多的自己控制构建的过程和产
出。Antwrap最能够满足我的需要。而前不久JRuby刚刚发布了1.0版，这样一来Ruby和Java的跨界引用变得更加容易，Ruby的实现自然
就选择了JRuby。<br /><br />
安装JRuby和Antwrap相当容易，只要把下载的jruby-bin-1.0.tar.gz/.zip解压到本地，确保JAVA_HOME和
CLASSPATH的配置，然后gem install Antwrap (选择Java版)
即可。为了顺利加载Antwrap，需要在CLASSPATH中包含ANT的ant.jar和ant-launcher.jar。(当然，如果想更加方便
的share你的成果，可以把ant的文件拷贝到jruby目录下，在jruby的启动脚本加入必要的export/set命令，然后打包，这样别人只要
从你提供的zip包解压出来即可使用。)<br /><br />
为了给大家一个直观的感觉，举个简单的例子(貌似BlogJava没有提供对Ruby代码的默认支持，大家将就看吧)：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 0);">require </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">rubygems</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">gem </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">Antwrap</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);">require </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">antwrap</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);">@ant</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">AntProject.</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">(:name</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">SampleAntwrapBuild</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, :basedir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">@cvsroot</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:pserver:cvsuser:password@10.10.10.1/cvsrepo/SampleProduct</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">def cvscheckout<br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);">    @ant.cvs(<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">        :cvsroot</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{@cvsroot}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">        :command</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">checkout -A</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);">        :</span><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);">        :dest</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 0, 0);">        :compressionlevel</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">9</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">end<br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">def cvsupdate<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);">    @ant.cvs(<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">        :cvsroot</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{@cvsroot}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">        :command</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">update -A -d</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">        :</span><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);">        :dest</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 0, 0);">        :compressionlevel</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">9</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 0, 0);">end<br /></span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 0, 0);">def compile(project_name)<br /></span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 0, 0);">    @ant.javac(<br /></span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 0, 0);">        :srcdir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}/src</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);">        :destdir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 0, 0);">        :target</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">1.5</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">        :encoding</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">GBK</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);">    @ant.copy(    :todir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">33</span> <span style="color: rgb(0, 0, 0);">        fileset(:dir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}/src</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">34</span> <span style="color: rgb(0, 0, 0);">            exclude(:name</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">**/*.java</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">35</span> <span style="color: rgb(0, 0, 0);">        end<br /></span><span style="color: rgb(0, 128, 128);">36</span> <span style="color: rgb(0, 0, 0);">    end<br /></span><span style="color: rgb(0, 128, 128);">37</span> <span style="color: rgb(0, 0, 0);">    @ant.jar(<br /></span><span style="color: rgb(0, 128, 128);">38</span> <span style="color: rgb(0, 0, 0);">        :destfile</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">build/#{project_name}.jar</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">39</span> <span style="color: rgb(0, 0, 0);">        :basedir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">40</span> <span style="color: rgb(0, 0, 0);">        :manifest</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">MANIFEST.MF</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">41</span> <span style="color: rgb(0, 0, 0);">        exclude(:name</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">src/**</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">42</span> <span style="color: rgb(0, 0, 0);">    end<br /></span><span style="color: rgb(0, 128, 128);">43</span> <span style="color: rgb(0, 0, 0);">end<br /></span><span style="color: rgb(0, 128, 128);">44</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">45</span> <span style="color: rgb(0, 0, 0);"># to actually call your target<br /></span><span style="color: rgb(0, 128, 128);">46</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ARGV.empty</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">47</span> <span style="color: rgb(0, 0, 0);">    puts </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Usage: jruby #{$0} [target]</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">48</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">49</span> <span style="color: rgb(0, 0, 0);">    eval ARGV[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]<br /></span><span style="color: rgb(0, 128, 128);">50</span> <span style="color: rgb(0, 0, 0);">end<br /></span><span style="color: rgb(0, 128, 128);">51</span> <span style="color: rgb(0, 0, 0);"></span></div><br /></math></length></stringutil></substring></variable>可以看到几乎都是我们熟悉的ANT Task，只是更加紧凑更加灵活，一旦掌握了最最基本的Ruby语法，用它写出功能强大的构建脚本可以说是分分钟搞定。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/124859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-06-18 00:39 <a href="http://www.blogjava.net/sean/archive/2007/06/18/124859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[八卦] Java "forks": first .NET, then SWT/Eclipse, now Harmony?</title><link>http://www.blogjava.net/sean/archive/2007/04/14/110644.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 14 Apr 2007 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/04/14/110644.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/110644.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/04/14/110644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/110644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/110644.html</trackback:ping><description><![CDATA[
		<br />
读到一篇廷有意思的文章，来自Weiqi Gao：<br /><a href="http://www.weiqigao.com/blog/2007/04/12/java_the_third_fork_from_sun.html" target="_blank">http://www.weiqigao.com/blog/2007/04/12/java_the_third_fork_from_sun.html</a><br /><br />
近几年Sun的日子似乎并不好过：和微软先是不欢散后来虽然和解但貌合神离，微软不买Sun的账，干脆自己搞个.NET；对IBM更是气不打一处来，但是不管怎么说SWT/Eclipse这朵花确实开得太艳，甚至盖过了Sun的光芒；现在Sun又<a href="http://www.apache.org/jcp/sunopenletter.html" target="_blank">和Apache铆上了</a>。<br /><br />
这三次不和，背后的原因几乎都是Sun不愿意大胆革新Java，或者放弃对Java的控制权（Sun的JDK开源并不能改变Sun对Java的实际控制）。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/110644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-04-14 15:20 <a href="http://www.blogjava.net/sean/archive/2007/04/14/110644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Java SE 1.6.0发布第一个update release</title><link>http://www.blogjava.net/sean/archive/2007/04/01/107840.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 01 Apr 2007 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/04/01/107840.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/107840.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/04/01/107840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/107840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/107840.html</trackback:ping><description><![CDATA[
		<br />
版本号1.6.0_01。<br /><br />
详见:<br /><a href="http://java.sun.com/javase/6/webnotes/ReleaseNotes.html" target="_blank">http://java.sun.com/javase/6/webnotes/ReleaseNotes.html</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/107840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-04-01 22:49 <a href="http://www.blogjava.net/sean/archive/2007/04/01/107840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[阅读] JRuby, Groovy, and Swing</title><link>http://www.blogjava.net/sean/archive/2007/02/21/100322.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 21 Feb 2007 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/21/100322.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/100322.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/21/100322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/100322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/100322.html</trackback:ping><description><![CDATA[<br />
以下是一组相互关联、按时间先后排列的3篇blog文章，主要探讨是Swing存在的问题以及动态语言如JRuby/Groovy能否帮我们解决Swing的问题：<br />
<br />
<a href="http://rawblock.blogspot.com/2007/02/jruby-can-save-swing.html" target="_blank">JRuby can save Swing</a><br />
<a href="http://pinderkent.blogsavy.com/archives/53" target="_blank">JRuby cannot save Swing</a><br />
<a href="http://shemnon.com/speling/2007/02/groovy-can-save-swing.html" target="_blank">Groovy can save Swing</a><br />
<br />
挺有趣的，推荐大家有空读一读。<br />
<br /><br />
<img src ="http://www.blogjava.net/sean/aggbug/100322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-02-21 20:03 <a href="http://www.blogjava.net/sean/archive/2007/02/21/100322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Apache ActiveMQ graduates from incubator</title><link>http://www.blogjava.net/sean/archive/2007/02/07/98456.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 06 Feb 2007 16:28:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/07/98456.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/98456.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/07/98456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/98456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/98456.html</trackback:ping><description><![CDATA[<br/>
Apache旗下的ActiveMQ日前正式"毕业"成为Apache的顶级项目之一。官方主页也从<a href="http://incubator.apache.org/activemq/">http://incubator.apache.org/activemq/</a>改为<a href="http://activemq.apache.org/" target="_blank">http://activemq.apache.org/</a>。<br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/98456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-02-07 00:28 <a href="http://www.blogjava.net/sean/archive/2007/02/07/98456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[阅读] 谁射杀了桌面版Java</title><link>http://www.blogjava.net/sean/archive/2007/01/25/96047.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 25 Jan 2007 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/25/96047.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/96047.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/25/96047.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/96047.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/96047.html</trackback:ping><description><![CDATA[<br/>
<a href="http://mikeomatic.net/?p=138" target="_blank">http://mikeomatic.net/?p=138</a><br/>
<br/>
挺有趣的一篇文章。Java在桌面应用这个领域始终得不到广泛的认同，虽然Java 6和SWT/RCP都为改善桌面版Java应用做出了自己的努力，但Java在这个领域的坏名声已经难以挽回。造成这一现状的始作俑者是谁，是什么原因导致人们对桌面版Java心存偏见，使用Java开发桌面应用的朋友也会经常会觉得力不从心呢？该文作者提出了三点：<br/>
<br/>
<ol>
<li>Sun没有意识到这样一个事实：任何一款桌面框架的实现，假如不能无缝的运行在Windows上，都注定成为“也能运行”的一种GUI技术，始终无法和native的版本抗衡。</li>
<li>他们认定解决（实现）高级桌面控件的方法是通过Swing这种方式，为了“跨平台”，所有东西本质上都是通过JFrame自己在canvas上画，而不是利用现成已经实现的东西，带来额外的开销和重复劳动。</li>
<li>他们早应该把官方的开发工具做得更加完善，现在NetBeans发展很好，但是不是有点太晚意识到这个问题了，而不论OS X还是Windows，都在这方面积累了一大批忠实用户。</li>
</ol>
<br/>
我认为，不管桌面版Java过去的名声如何，能够跨平台运行，越来越好的虚拟机环境和性能，越来越好的API和工具支持，庞大的开发群体和开源框架/工具，Java仍然是开发企业级桌面应用的一个相当不错的选择。<br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/96047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-01-25 21:30 <a href="http://www.blogjava.net/sean/archive/2007/01/25/96047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Learn to be defensive</title><link>http://www.blogjava.net/sean/archive/2007/01/25/95819.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 24 Jan 2007 16:03:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/25/95819.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/95819.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/25/95819.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/95819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/95819.html</trackback:ping><description><![CDATA[<br/>
作为开发者，我们必须要学会defensive programming，尤其是对要求高可靠性和无人职守的企业级应用中，需要特别留意我们的设计和编码，必须尽可能做到足够defensive。<br/>
<br/>
什么是defensive programming？举个大家都看过的例子：<br/>
<br/>
<code>
String str = ...<br/>
if ("".equals(str)) {} <br/>
</code>
<br/>
在这里我们不写str.equals("")而是反过来，就是为了防止出现不必要的NPE – NullPointerException。<br/>
<br/>
运行期异常是最最需要特别关照的一种非正常状况，除了像上面这类要求我们采用相对较好的编码习惯之外，为了减少运行期异常的发生，通常也需要使用try-catch代码块来把我们相对脆弱，或者需要格外保护的逻辑包起来，对于外部传进来的参数，一定要assert它们的合法性，即assert它们是否能够安全的被后面的逻辑所使用。<br/>
<br/>
通常意义上，defensive programming主要cover的是避免不必要的运行期异常发生。我们可以更进一步，更广义的运用defensive programming的核心思想：在企业应用中，除了运行期异常，对于有些看似严重的极端的错误，如网络超时，连接丢失，数据库提交失败等情况，需要我们具体问题具体分析，并非所有checked exception都一定需要我们去一一catch然后处理。更多的时候，尤其当开发无人职守的后台程序，我们可以采取重试、报告、修改外部数据等方式处理，能够自行解决的，就不要动不动就报错，或等待用户确认，不能自行解决的，则要及时报告并停止运行，避免更大的错误发生。<br/>
<br/>
举个相对具体的例子，两个异构的系统，通过一个中间层的消息平台相互发送消息，通信协议采用最基本的socket方式，这三个系统随时都可能出现宕机或链接中断的情况。为了保证数据的完整性，我们拿其中一个需要发送和接收消息的系统来细说：<br/>
<br/>
一个可能的实现方式是：该系统所有要发送的消息保存到数据库，给它一个初始状态；另一个独立进程从数据库按照时间先后拿出消息，更新拿出的这条消息的状态为处理中，并尝试发送消息；成功后根据需要，更新消息状态为成功发送或者直接删除，如果遇到失败或异常，消息恢复为初始状态，线程sleep一段时间，然后再次尝试，多次尝试或者尝试跨度超过一定时间范围，则停止处理，向管理员汇报（通过邮件、短信等途径）。对于接收到的消息，同样是先存入数据库，然后再由后续的进程用类似的方式取出并处理。如果程序崩溃，可以自动重新启动（应用或整个服务器）。这样不管哪一段通信线路出现故障或阻塞，或者宕机，系统都可以一步一个脚印，确保任务主动而自动的执行，并且忠实记录下有价值的状态信息，出现问题时管理员可以很直观的看到在哪个环节出现故障，从而快速找到问题关键并有效解决。<br/>
<br/>
Defensive programming可以让我们的应用更健壮，在保证数据正确性、完整性的前提下，面对困难也能更加独立自主。和defensive programming相关的话题我想大家如果感兴趣，可以展开更多更深入的探讨，这里只是给大家做个介绍性的铺垫，能抛砖引玉当然更好。<br/>
<br/>
<br/><img src ="http://www.blogjava.net/sean/aggbug/95819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-01-25 00:03 <a href="http://www.blogjava.net/sean/archive/2007/01/25/95819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Eclipse Joins JCP</title><link>http://www.blogjava.net/sean/archive/2007/01/13/93582.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 13 Jan 2007 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/13/93582.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/93582.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/13/93582.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/93582.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/93582.html</trackback:ping><description><![CDATA[<br/>
原文:<br/>
<a href="http://www.linux-watch.com/news/NS6467114693.html" target="_blank">http://www.linux-watch.com/news/NS6467114693.html</a><br/>
<br/>
#更新:<br/>
根据Eclipse Foundation的Executive Director Mike Milinkovich的<a href="http://milinkovich.blogspot.com/2007/01/joining-communities.html" target="_blank">blog</a>文章，Eclipse Foundation除了将加入JCP之外，还将加入OMG和OSGi。<br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/93582.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-01-13 12:05 <a href="http://www.blogjava.net/sean/archive/2007/01/13/93582.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Groovy 1.0发布</title><link>http://www.blogjava.net/sean/archive/2007/01/03/91659.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 03 Jan 2007 15:53:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/03/91659.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/91659.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/03/91659.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/91659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/91659.html</trackback:ping><description><![CDATA[<br/>
<a href='http://docs.codehaus.org/display/GROOVY/2007/01/02/Groovy+1.0+is+there' target='_blank'>http://docs.codehaus.org/display/GROOVY/2007/01/02/Groovy+1.0+is+there</a>
<br/>
<br/>
Groovy是与Java平台无缝结合的动态语言，如今终于发布了1.0版。
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/91659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-01-03 23:53 <a href="http://www.blogjava.net/sean/archive/2007/01/03/91659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] GWT(Google Web Toolkit)宣布开源</title><link>http://www.blogjava.net/sean/archive/2006/12/14/87775.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 14 Dec 2006 10:52:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/12/14/87775.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/87775.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/12/14/87775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/87775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/87775.html</trackback:ping><description><![CDATA[
		<br />在Google正式加入Eclipse Foundation后不到一周，又传来好消息：GWT开源了！GWT是Google重量级的Ajax开发框架，使得广大开发者可以使用熟悉的Java语法实现Ajax，这次GWT开源选择的是Apache License, version 2.0。详情：<br /><br /><a href="http://code.google.com/webtoolkit/">http://code.google.com/webtoolkit/</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/87775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-12-14 18:52 <a href="http://www.blogjava.net/sean/archive/2006/12/14/87775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接] Open Source Java Clustering</title><link>http://www.blogjava.net/sean/archive/2006/12/06/85950.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 06 Dec 2006 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/12/06/85950.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/85950.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/12/06/85950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/85950.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/85950.html</trackback:ping><description><![CDATA[
		<br />来自JavaLobby的报道：<br /><a href="http://www.javalobby.org/java/forums/t85683.html">http://www.javalobby.org/java/forums/t85683.html</a><br /><br />以及官方消息：<br /><a href="http://www.terracottatech.com/press_12_04_06_oss.shtml">http://www.terracottatech.com/press_12_04_06_oss.shtml</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/85950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-12-06 21:33 <a href="http://www.blogjava.net/sean/archive/2006/12/06/85950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Sun releases Java as open-source project (GPL)</title><link>http://www.blogjava.net/sean/archive/2006/11/13/80985.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Mon, 13 Nov 2006 13:49:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/11/13/80985.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/80985.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/11/13/80985.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/80985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/80985.html</trackback:ping><description><![CDATA[
		<br />看来传闻中的GPL成为现实。来自国际先驱论坛报IHT的报道：<br /><a target="_blank" title="http://www.iht.com/articles/2006/11/13/business/web.1113sun.php" href="http://www.iht.com/articles/2006/11/13/business/web.1113sun.php">http://www.iht.com/articles/2006/11/13/business/web.1113sun.php</a><br /><br /><br />以下援引美联社的新闻稿：<br /><br /><h1 class="headline">Sun releases Java as open-source project </h1><!-- /headline --><!-- subhead --><!-- /subhead --><!-- byline --><div class="byline"><div class="dots"><img src="http://img.iht.com/images/dot_h.gif" alt="" height="1" width="3" /><br /></div><div id="author" style="float: left;">
                The Associated Press</div></div><!-- /article tools - narrow (used with span photos) --><!-- copy --><p><br /></p><p>SAN
FRANCISCO: Computer server and software maker Sun Microsystems said
Monday that it had begun to make its Java technology an open-source
software project available for free on the Internet.</p><p>The announcement represents one of the largest additions of computer
code to the open-source community - and it marks a major shift for a
company that had once fiercely protected the source code used in 3.8
billion cell phones, supercomputers, medical devices and other gadgets.</p><p>Santa Clara-based Sun said it is making nearly all of Java's source
code - excluding small pockets of code that are not owned by Sun -
available under the GNU General Public License. The same type of
license also covers the distribution of the core, or kernel, of the
popular open-source operating system Linux, which competes against
Microsoft Corp.'s Windows operating system.</p><p>Making Java an open-source project allows programmers from around
the world to examine, modify, fix bugs and contribute new features in
Java's underlying code. It requires that any changes be made public.</p><!-- sidebar --><!-- /sidebar --><p>Sun, a formerly high-flying dot-com that has lost billions of
dollars since the stock market collapse of 2000, has hitched its
rebound strategy in part to the growing open source movement.</p><p>Rich Green, Sun's executive vice president of software, said the
company hopes to turn more developers into Java programmers, who may
then create additional software to support Sun products.</p><p>"The open-sourcing of this really means more - more richness of
offerings, more capability, more applications that consumers will get
to use," Green said. "The platform itself will become a place for
innovation."</p><p>All the Java source code is expected to be released by March 2007,
Green said. The move covers all Java technology, which includes
software that runs on handheld devices, personal computers and servers.</p><p>Analysts said the decision would likely extend the life of Java,
which was released more than a decade ago, and boost business for the
company.</p><p>"Sun profits from the Java ecosystem thriving," said Michael Cote,
an analyst with RedMonk. "Whether it's their hardware sales or their
service sales, by open-sourcing Java they're hoping to ensure its
longer life and ensure it's what the community wants it to be."</p><br /><img src ="http://www.blogjava.net/sean/aggbug/80985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-11-13 21:49 <a href="http://www.blogjava.net/sean/archive/2006/11/13/80985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Java SE 6 Release Candidate正式提供下载</title><link>http://www.blogjava.net/sean/archive/2006/11/12/80665.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 12 Nov 2006 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/11/12/80665.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/80665.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/11/12/80665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/80665.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/80665.html</trackback:ping><description><![CDATA[
		<br />
		<a target="_blank" title="http://java.sun.com/javase/downloads/ea.jsp" href="http://java.sun.com/javase/downloads/ea.jsp">http://java.sun.com/javase/downloads/ea.jsp</a>
		<br />
		<br />以下是Java SE 6的新特性介绍：<br /><a target="_blank" title="http://java.sun.com/javase/6/webnotes/features.html" href="http://java.sun.com/javase/6/webnotes/features.html">http://java.sun.com/javase/6/webnotes/features.html</a><br /><br />以及新版本Java SE的文档：<br /><a target="_blank" title="http://java.sun.com/javase/6/docs/" href="http://java.sun.com/javase/6/docs/">http://java.sun.com/javase/6/docs/</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/80665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-11-12 09:34 <a href="http://www.blogjava.net/sean/archive/2006/11/12/80665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[News] TestNG 5.3 发布</title><link>http://www.blogjava.net/sean/archive/2006/11/03/79002.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 03 Nov 2006 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/11/03/79002.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/79002.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/11/03/79002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/79002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/79002.html</trackback:ping><description><![CDATA[
		<br />Check it out:<br /><a target="_blank" title="http://testng.org/" href="http://testng.org/">http://testng.org/</a><br /><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/79002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-11-03 23:29 <a href="http://www.blogjava.net/sean/archive/2006/11/03/79002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接] Qt for Java?</title><link>http://www.blogjava.net/sean/archive/2006/08/02/61421.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 02 Aug 2006 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/08/02/61421.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/61421.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/08/02/61421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/61421.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/61421.html</trackback:ping><description><![CDATA[
		<br />Trolltech发布了针对Java的Qt工具包(Preview版本) - Qt Jambi，可以直接用Java编写Qt式跨平台(Linux/Mac OS/Windows)GUI应用，继承了Qt的简洁高效和本地化的L&amp;F，同时也和SWT/Swing/AWT友好共存。不过一方面这个小东东还在探索阶段，另一方面不太喜欢Qt的授权模式，姑且先观望一阵吧。<br /><br /><a title="http://www.trolltech.com/company/newsroom/announcements/press.2006-07-14.7914556269/" href="http://www.trolltech.com/company/newsroom/announcements/press.2006-07-14.7914556269/">http://www.trolltech.com/company/newsroom/announcements/press.2006-07-14.7914556269/</a><br /><br />FAQs:<br /><a title="http://www.trolltech.com/developer/faqs/Qt%20Jambi" href="http://www.trolltech.com/developer/faqs/Qt%20Jambi">http://www.trolltech.com/developer/faqs/Qt%20Jambi</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/61421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-08-02 23:29 <a href="http://www.blogjava.net/sean/archive/2006/08/02/61421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Open-Source Java, it's a matter of how, not why.</title><link>http://www.blogjava.net/sean/archive/2006/05/17/46698.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 17 May 2006 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/05/17/46698.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/46698.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/05/17/46698.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/46698.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/46698.html</trackback:ping><description><![CDATA[
		<br />
		<a href="http://www.vnunet.com/vnunet/news/2156205/sun-promises-open-source-java">http://www.vnunet.com/vnunet/news/2156205/sun-promises-open-source-java</a>
		<br />
		<br />很显然Sun自己也知道只有把Java真正完全开源，才能最大限度的阻止Java开发社群走向分化。但问题是如何确保Java不会像各式各样的Linux发行版本那样陷入一种开源而又相互排斥、各自为政的尴尬境地。<br /><br />在今年的JavaOne上，Sun公司新CEO Jonathan Schwartz向媒体传递了这样的信号："It's not a question of whether we'll open source Java, the question is how"。我们当中很多人应该都记得当年IBM多少带这些挑衅的要求Sun开源Java，我们不少人或许还自觉或不自觉地成了那次事件的炮灰。还有后来的Kaffe、GCJ等等开源的JVM和Java编译器不断涌现，不少开源社区的开发者等不及Sun，于是决定自己做一套开源的Java。所有这些事，Sun看在眼里，记在心里，却迟迟没有让人们看到曙光，Sun在犹豫，它没有准备好。<br /><br />虽然我很愿意相信这次Sun是认真的发自内心的对开源的热情拥抱，但是理智告诉我这是Sun在外界的强压下做出的又一次妥协，与之前Java部分开源、OpenSolaris开源并追加GPL方式、Sun ONE Studio等IDE免费/开源等等事件本质上并无二致。并且这样的决策取向也符合Sun的最高利益。<br /><br />与这次JavaOne宣布Java开源同步进行的另一件事也值得我们关注一下，那就是Sun重新定义了对GUN/Linux和OpenSolaris等开源操作系统的Java分发包的许可协议，OS厂商可以按照自己的打包方式发行官方许可的Java，以往我们在几乎所有通行的GNU/Linux开源发行版上找不到现成的Sun官方版Java的情况有希望成为历史，至少这个许可协议刚一推出，就得到了Debian和Ubuntu社区的积极回应，这当然是好事。<br /><br />"Official packages of Sun Java are now available from the non-free<br />section of Debian unstable, thanks to Sun releasing[1] Java under a new<br />license: the Operating System Distributor License for Java (DLJ)[2][3].<br />This license, while still non-free, allows the Sun Java Runtime<br />Environment (JRE) or Java Development Kit (JDK) to be distributed by<br />Debian, with our own packaging." [摘自debian-devel-announce的邮件列表]<br /><br />更多Sun Java在Debian的进展细节：<br /><a href="http://packages.qa.debian.org/s/sun-java5.html">http://packages.qa.debian.org/s/sun-java5.html</a><br /><br />Sun官方新闻（关于新的Operating System Distributor's License for Java）：<br /><a href="http://www.sun.com/smi/Press/sunflash/2006-05/sunflash.20060516.4.xml">http://www.sun.com/smi/Press/sunflash/2006-05/sunflash.20060516.4.xml</a><br /><br /><br />// 无关技术细节，故不确定是否合适放在首页。不过我觉得上述内容值得和大家，和更多关注Java的人分享。<br /><br /><img src ="http://www.blogjava.net/sean/aggbug/46698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-05-17 22:17 <a href="http://www.blogjava.net/sean/archive/2006/05/17/46698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Java EE 5 规范最终敲定</title><link>http://www.blogjava.net/sean/archive/2006/05/03/44413.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 02 May 2006 20:18:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/05/03/44413.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/44413.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/05/03/44413.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/44413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/44413.html</trackback:ping><description><![CDATA[
		<br />
		<a href="http://jcp.org//en/jsr/results?id=3770">http://jcp.org//en/jsr/results?id=3770</a>
		<br />
		<br />JSR #244 - Java Platform, Enterprise Edition 5 (Java EE 5) Specification在2006年5月1日全票通过。<br /><br /><img src ="http://www.blogjava.net/sean/aggbug/44413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-05-03 04:18 <a href="http://www.blogjava.net/sean/archive/2006/05/03/44413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[阅读] Sun's New Boss: The Same as the Old Boss?</title><link>http://www.blogjava.net/sean/archive/2006/04/25/43152.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 25 Apr 2006 15:57:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/04/25/43152.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/43152.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/04/25/43152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/43152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/43152.html</trackback:ping><description><![CDATA[
		<br />
		<a href="http://www.businessweek.com/technology/content/apr2006/tc20060425_843283.htm">http://www.businessweek.com/technology/content/apr2006/tc20060425_843283.htm</a>
		<br />
		<br />Jonathan Schwartz接任Scott McNealy成为Sun的新CEO。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/43152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-04-25 23:57 <a href="http://www.blogjava.net/sean/archive/2006/04/25/43152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接]Red Hat收购JBoss</title><link>http://www.blogjava.net/sean/archive/2006/04/10/40342.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Mon, 10 Apr 2006 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/04/10/40342.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/40342.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/04/10/40342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/40342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/40342.html</trackback:ping><description><![CDATA[
		<br />
		<a href="http://www.redhat.com/about/news/prarchive/2006/jboss.html">http://www.redhat.com/about/news/prarchive/2006/jboss.html</a>
		<br />
		<br />
<img src ="http://www.blogjava.net/sean/aggbug/40342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-04-10 23:19 <a href="http://www.blogjava.net/sean/archive/2006/04/10/40342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接]FreeBSD + Sun Java</title><link>http://www.blogjava.net/sean/archive/2006/04/06/39593.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 06 Apr 2006 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/04/06/39593.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/39593.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/04/06/39593.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/39593.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/39593.html</trackback:ping><description><![CDATA[
		<br />我相信我们当中不少人已经都知道GNU/Linux和Sun之间那种心照不宣选的分歧，加上是Stallman和他的FSF在中间掺合，还有一群志愿者自己弄一个开源的Java，似乎这个分歧已经要演化成为Java和Linux之间一堵柏林墙。真有必要这样吗？我不想说谁对谁错，谁都有自己的价值观和信仰，但是这样的纷争对开发者，对于那些真正想要通过软件改善这个世界的人们来说，有什么好处呢？喜欢(Sun)Java的会怎样看Linux，喜欢Linux的又会怎样看Sun？这还不止，拜FSF所赐，甚至Linux阵营内部也为了一个GPL v3出现了不小的裂痕，你说闹不闹庭？相比之下，还是BSD的世界来的清静，虽然也有分歧，但是更多了一分理性和务实。默默无闻的做自己想做的事，不是挺好的吗？<br /><br />题外话不多说了，看看这则新闻。FreeBSD将随他们的OS发行Sun授权的Java的二进制版本：<br /><br /><a href="http://lists.freebsd.org/pipermail/freebsd-announce/2006-April/001057.html">http://lists.freebsd.org/pipermail/freebsd-announce/2006-April/001057.html</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/39593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-04-06 15:07 <a href="http://www.blogjava.net/sean/archive/2006/04/06/39593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接]用于RCP的日期控件</title><link>http://www.blogjava.net/sean/archive/2006/02/02/29468.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 02 Feb 2006 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/02/02/29468.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/29468.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/02/02/29468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/29468.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/29468.html</trackback:ping><description><![CDATA[<BR><A href="http://www.eclipsezone.com/eclipse/forums/t62966.rhtml">http://www.eclipsezone.com/eclipse/forums/t62966.rhtml</A><BR><BR><img src ="http://www.blogjava.net/sean/aggbug/29468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-02-02 13:48 <a href="http://www.blogjava.net/sean/archive/2006/02/02/29468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在WTP 1.0中配置Geronimo 1.0</title><link>http://www.blogjava.net/sean/archive/2006/01/30/29374.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Mon, 30 Jan 2006 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/01/30/29374.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/29374.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/01/30/29374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/29374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/29374.html</trackback:ping><description><![CDATA[<BR>如果你和我一样，喜欢Eclipse和它的WTP，同时也对Geronimo感兴趣，那么当你把WTP 1.0和Geronimo 1.0的正式发行版本拿到以后，一定会感到迷惑，为什么WTP 1.0不直接支持Geronimo 1.0呢？当你尝试添加Geronimo服务器时，首先是找不到现成的Geronimo选项，然后当你点击"Don't see your server listed? Click here"，你会看到Geronimo的适配器可以下载，但是却怎么也下不下来。<BR><BR>不管是之前的Milestone版本，还是网上很多评价，WTP应该都是直接支持Geronimo的啊，到底发生了什么？<BR><BR>到Geronimo官网的Development Tools页面，可以找到部分答案，有一点可以肯定，你的WTP不支持Geronimo并非版本差异的偶然现象。Geronimo的Eclipse WTP适配器目前还没有正式发布，笔者猜测可能是还存在一些不稳定的地方，不适合包含在WTP 1.0这个重要的发行版本中。<BR><BR><A href="http://geronimo.apache.org/devtools/">http://geronimo.apache.org/devtools/</A><BR><BR>我们可以在Apache的CVS上找到下面的snapshot下载列表，正式的发布应该不会让大家等太久的：<BR><A href="http://cvs.apache.org/dist/geronimo/eclipse/unstable/">http://cvs.apache.org/dist/geronimo/eclipse/unstable/</A><BR><BR><img src ="http://www.blogjava.net/sean/aggbug/29374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-01-30 15:30 <a href="http://www.blogjava.net/sean/archive/2006/01/30/29374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 3.1.2 发布</title><link>http://www.blogjava.net/sean/archive/2006/01/29/29354.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 29 Jan 2006 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2006/01/29/29354.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/29354.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2006/01/29/29354.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/29354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/29354.html</trackback:ping><description><![CDATA[<BR>最近大家都忙着过年，但是也别错过了这个消息。如果感兴趣，就去官网上下吧。<BR><BR><A href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</A><BR><BR><img src ="http://www.blogjava.net/sean/aggbug/29354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2006-01-29 15:39 <a href="http://www.blogjava.net/sean/archive/2006/01/29/29354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>