论坛首页 综合技术论坛

你的系统是跨平台的吗?

浏览 20840 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-10-19  
开发java应用,听到的最多的一句话就是“跨平台”,那么现在小声的问一句,你开发的系统真的能跨平台吗?
以我的拙见,所谓的跨平台,包含五方面的内容:
一、跨应用服务器
二、跨数据库
三、跨操作系统
四、跨浏览器
五、多语言支持

下面分别来说一下。
■跨应用服务器
  这一点,看起来好像有些多余,java的口号之一不就是“一次编译,到外运行”嘛,可实际经验告诉我们,这仅仅是一个口号而已。实际中是“一次编译,到处调试”。为什么会这样?从应用服务器来说,各个产品或多或少都在标准的java规范之上进行了一些拓展,小规模的应用开发,多以tomcat为基准;大规模的应用,多以weblogic/websphere为基准。
那么开发完成的应用,可否在所有的应用服务器上正常部署呢?答案是否定的。在tomcat5上部署没问题,在tomcat4上却可能有问题;在tomcat5/4上没问题,却可能在resin/jetty/weblogic/websphere上有问题。在我的经历中,在resin/jetty/weblogic为基准进行开发的应用,部署到tomcat上基本上没什么问题。但是以tomcat为基准的应用,部署到其他应用服务器中,却可能出现各种各样的问题。这与tomcat本身的定位和开发方式有关,它更像是一个学术产品,而不是一个商业产品。
  小型的应用,我偏好resin,它的速度、稳定性、兼容性、中文处理,都是非常不错的。相比而言,以“纯java、快速”著称的jetty,就不太令人满意。jetty的4/5/6各个版本中,对session的存放位置、web.xml的标准、struts的plugin的支持、log4j的处理,都各不相同。在最新的jetty6中,竟然会要命地“不能使用session.validate()”方法,一使用此方法之后,就无法再使用set/getAttribute了。
  也曾经在将一个应用转移到websphere5上时,费劲周折。这个应用跑在其他应用服务器上都没问题,但是一部署到ws5上,就无法正常加载struts的配置文件。本以为是struts配置文件写得有问题,但即便把所有的action/form配置均去掉,只保留一个空的配置文件,也无法正常启动。最后实在无法,只能乱碰运气,考虑是否是struts的几个jar包版本有问题,经检查,发现应用中使用的是struts1.2的jar包,换成struts1.1的jar包,再启动后就一切正常。这样的问题,可真的是折磨人呢。
  所以,我认为跨应用服务器是很重要的。你不能告诉客户,俺们的系统只能跑在tomcat下面,至于您花重金购买的weblogic/websphere,对不起,我们暂时还不支持。客户会吐血的。
■跨数据库
  经常看到某大公司产品,要求必须使用oracle或者sqlserver数据库,你想换个数据库来部署?没门,人家说了,我们的产品只支持这一种数据库,你就老实的用吧。但对于客户方来说,为了减少投资,并且保证内部系统尽可能使用同一种数据库以减少维护成本(总不能请一个oracle DBA,再请一个sqlserver DBA吧?),总会希望新系统使用的数据库是以前用过的吧。
  现在有了hibernate,在此基础上开发的应用,基本上是能满足跨数据库要求的,个人认为这是hibernate最大的亮点。但也要注意,在开发中尽可能考虑到不同数据库的特性。诸如sqlserver的text/image字段上不能查distinct,oracle内的各种对象名称长度不得超过30等,尽量不要调用数据库的内部特性(如存储过程、视图等)
■跨操作系统
  这一点,貌似没有什么可说的,很少有开发出的系统只能部署在一种操作系统上的。不过有一点也要注意,如果系统中某些功能依赖于通过JNI来调用windows本地组件的话,比如打印、word/excel操作,或与只能运行在windows下的报表组件(如国内的数巨报表、如意报表)集成的话。
■跨浏览器
  窃以为,如果只是做国内的应用,这一点倒不重要,就以IE为标准来开发也未尝不可。
PS:完全支持IE也不是一件容易的事情,IE5/6本身就有不少的差异。
但如果产品本身想立足于世界,想与国外产品竞争,对浏览器的全面支持也必不可少。至少应该同时支持ie和firefox吧,如果对自身严格要求的话,我认为应以opera为标准,opera对html/css/javascript的标准是实现和支持得最好的浏览器。
■多语言支持
  如果您的产品只想在中国卖,根本就不考虑世界市场,那这一条就pass好了。
  但对于面向全球市场的产品来说,在开发之初不考虑多语言支持(不是没有啊),等有一天,公司老板决定要向全球推出该产品的时候,嗯,才发现,要对系统进行伤筋动骨的大手术,就等着哭吧。
   发表时间:2006-10-19  
Java做的web应用跨操作系统,跨语言一般都没有啥问题。跨应用服务器只要不用太多高级特性也没有啥问题,就是AJAX应用跨浏览器太难了。
0 请登录后投票
   发表时间:2006-10-19  
楼主总结得还不错。不过看上去似乎经验不足。(我说错了请原谅我)

我补充几点:
1.跨应用服务器。这个痛苦我比较有体会。(注意:但tomcat5到4之间的的跨越可能意义不大,因为支持的servlet ,jsp spec版本不同;倒过来是应该完全兼容的。)
  1.1 EJB跨应用服务器。虽然有spec,但每家都有自己的扩展,有些特别要命特性比如,EJB spec2.0里居然对like 只支持常数,就是不能传入?。
   然后EJB的配置文件都有各自的扩展,真是痛苦。好在Jbuilder可以自动转换Weblogic到Jboss,但也不是那么好,总有魔鬼的细节要你反复调试。
   1.2无EJB的跨应用服务器。这个容易多了,但居然也不是很顺利的。我的war曾经在tomcat上调试好了,发布到websphere5上就失败。最后用二分法逐次删除app里的文件,发现引起问题的居然是...eclipse产生的.classpath文件!websphere对eclipse支持得太好了吧?删掉即可。
    这就算好的了。我后来把在tomcat5上调试好的war发布到resion3上,更郁闷。我在网上查了resion内置了自己的xml parser,导致我的castor xml无法正确执行,要更换parser,需要N步...遂放弃...

2.跨浏览器。这个绝不是很容易的事情。Javascript就够你喝一壶的,各种细微差别,各种特殊的扩展...,这个到罢了,到CSS,更有玩意,特别是主要用CSS布局的,有得玩,这一点上如果采取老式的Table布局,兼容性倒是很不错。还来新玩意要慎用。
3.跨数据库。
  这个有hibernate之类的封装,就好多了。不用它,问题也不会很大,可参考我以前的帖子。(当然如果你用了stored procedure或trigger之类,只能手动挨个重写了)
4.跨操作系统。
  这个听上去是最容易的。但我还是碰到了几个问题。
  4.1文件路径的分隔符。windows下似乎能兼容Unix的分隔符,但反之不可。不能随意的用/或\,最好是用Java里提供的File.seperator。
  4.2字符编码问题。一般我们会是用中文版的windows,默认编码是GBK;Unix可能会有差别,所以在使用new String(byte[]),String.toBytes()等与编码相关的操作时,要注意,可以指定编码。最好还是全部使用UTF-8。
5.国际化问题
  这里暂只说文字的国际化。
  需要将文字资源外部化,并且全部用UTF-8编码,根据Local选择文字资源等等。不难也不简单。
0 请登录后投票
   发表时间:2006-10-19  
File.seperator,仅在windows上做开发,可能容易有这方面的问题。所以得测试在不同操作系统上做部署。
0 请登录后投票
   发表时间:2006-10-19  
交流经验嘛,不然怎么叫论坛呢?
我现在开发的时候,会同时用tomcat/resin/jetty/weblogic来测试。在linux当然非常简单了,做个符号连接就OK了。想用哪个就启动哪个好了。数据库会使用mysql/oracle/sqlserver,浏览器就用firefox。给我的感觉,只要firefox上跑起来没问题,在ie上基本都正常。可能有些css需要再细调一下,来保证效果的完全一致。比如event的触发、xy定位、script控制table等。
0 请登录后投票
   发表时间:2006-10-19  
together 写道
给我的感觉,只要firefox上跑起来没问题,在ie上基本都正常。


我以前也以为是这样的。
自从我使用CSS作布局就改变看法了。

IE有很多智能的判断,好还是坏难说,Firefox就没有。
比如一个DIV框,指定了高度,里面嵌入一个DIV,如果里面的高度比前者大,
IE里会自动扩展外部的DIV;
Firefox就不会,结果两个DIV的边框交错了...

这个例子是IE到Firefox的,反过来也有很多啦,暂时记不起来了。
0 请登录后投票
   发表时间:2006-10-19  
嗯,所以需要看效果来细调。总会能调到在几个浏览器里的效果一样的。
0 请登录后投票
   发表时间:2006-10-19  
对跨平台自己有些研究,不过我是用C/C++的,一次编译到处运行是不行,但至少可以使得跨平台来的容易.
从语言角度,C/C++语法早已是工业标准,当然有些细微的问题上会有不同,但这不影响,最大影响的是OS API和Data Type, 所以使用C/C++作跨平台开发首先要把Data Type和OS API自己重新定义和规范好,这样就可以起到隔离的作用,换了一个平台只需要重写这些基本封装就可以了,而上层的大量代码无需更改.
在语言中不要用很多偏门的或者说过于高阶的语法或功能,比如template, 这些在跨平台的时候带来的问题会比较多.
不要使用与OS紧密相连的封装机制,例如在Windows下的COM, 这样不会因为换了OS而作废的情况发生.
数据流,可能遇到采用的硬件的数据编码方式不同的情况,对这种情况一般可以强制定义自己的数据采用何种方式,大尾或小尾, TCP/IP就是强制的.或者加上一些数据位表示也是解决之道.
和OS或某些AP紧密相连的部分,例如WEB等直接封装,然后以统一接口导出功能,这样跨平台时只会影响这一部分而不会影响整个程序.
数据库,只能做到在接口层的隔离,所以可以选用ODBC,同样作为工业标准,基本上通用的数据库都支持,而且自己如果再作一下简单的封装会更好.

其实做到跨平台性真的很难,所做的很多努力实际上只是为了降低跨平台带来的成本而已.
0 请登录后投票
   发表时间:2006-10-19  
一、跨应用服务器
   平时用的最多就是tomcat,resin使用过,但是部署的时候没发现什么问题,没有太多经验,所以这个就不说了。

二、跨数据库
    这个我觉得不应该归属与java的问题,而是各个数据库厂商的原因,各个数据库都有自己的特性,这种东西是没办法统一标准的。

三、跨操作系统
    如果是pure java的程序,只要注意不使用和操作系统相关的调用就没问题,上面说的文件分隔符使用File.seprator就能很好的解决,记得我曾经碰到的一个问题就是在unix上要调用shell脚本,确实很麻烦,开发环境是windows,只能另外写一个测试类放到unix上去测试这个调用。如果不包含这些东西,夸操作系统是没有问题的。

四、跨浏览器
    最近做了很多关于javascript的程序,头疼的紧,而且我还是仅仅要求兼容ff和IE,不过不兼容的地方都是dom上的一些操作,反正只要是涉及到dom操作的,我都是两个浏览器一起开,测时一直是跟着编码后面,生怕哪一段出了问题,查起来N麻烦。 不过很多地方操作可以使用开源的js库,他们都能很好的避免这些问题,还是能节省不少力气的。


五、多语言支持
    这个我觉得是没有问题的,现在的framework哪一个没有i18n。

0 请登录后投票
   发表时间:2006-10-20  
国际化问题补充一点. 大家只想到了文字, 其实应该还有图片,还有阅读习惯,还有因为语法问题, 导致传入的参数个数不一样(这样很麻烦). 所以国际化问题其实很复杂.

java的跨性, 我觉得还是非常不错.

至于应用服务器这个, 如果是完整按照规范的话, 兼容应该没有什么问题, 特别是那些经过sun验证过的.

数据库, SQL做得太好了.  短小, 精干.

觉得用AJAX后来会变成灾难.
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics