关于两个不同公司开发的两个系统分别只支持MS JVM与Sun JVM的问题分析与解决方法的讨论背景说明:
================================================================================
某软件开发公司B ==>>代替真正公司的名字
某某客户 ==>> 代替真正的客户公司名字
两公司分别开发系统A与系统B,某软件开发公司A开发系统A,某软件开发公司B开发系统B
系统A实施与应用时间比系统B早一年多,但只支持IE默认的MS JVM
系统B只支持Sun JVM
================================================================================================================================================================
以下是某软件开发公司B对某软件开发公司A开发的系统A的升级建议
================================================================================
关于某某客户系统A升级的建议
自2005年1月系统B在某某客户分公司试运行以来,发现某某客户分公司的系统A与系统B二者不兼容。具体表现为:某某客户分公司的系统A的某些功能只能在Microsoft JVM下运行,而该JVM只支持1.1版本的JDK;系统B要求的JDK版本为1.3或1.4。就此问题,某软件开发公司B组织人员专门对JDK各版本兼容性进行深入研究,发现二者不兼容的原因如下。
1. JDK各版本类的组织发生了改变,导致系统B客户端程序运行在只支持低版本JDK的JVM下时(譬如说Microsoft JVM),该JVM会找不到相应的类。例如:系统B客户端程序用到PrintJob类,该类在JDK1.1版本中是位于java.awt包下,而在JDK1.2版本以后新增了一个java.awt.print包,并将该类放在此包下面。这样就导致即使以Microsoft JVM类的加载格式重新编译系统B,在运行过程中也会报错:找不到PrintJob类。
2. 高版本的JDK对低版本的某些类不但在功能进行了相应的增强,而且其运行机理也与低版本有较大不同。比如说系统B大量使用了Thread类, 1.1版本的JDK对该类的设计在安全性上存在严重问题,1.2及其以上版本的JDK对此进行了全面的改进。这样就导致1.1版本的JDK编译器编译出来的客户端程序不能运行在1.2或更高版本的JVM之下,1.2版本的JDK编译器编译出来的客户端程序即使能运行在1.1版本的JVM之下,也可能会抛出异常(比如说找不到该方法等等异常)。
通过对JDK各版本兼容性的研究以及对系统B功能实现的综合考虑,开发人员发现系统B向下兼容(即通过修改WEB系统源代码,使得客户端程序可以在Microsoft JVM下运行)实现起来需要修改大量程序代码,工作量很大,并且系统安全性、可靠性都会出现问题(这是由JDK1.1本身缺陷造成的)。相比较而言,升级系统A,使其可以运行在较高版本的JVM之下就容易很多,也更合理,原因如下。
1. 高版本的JDK开发、编译出来的客户端程序往往更加稳定、更强壮,解决问题的手段也较为丰富。升级之后的系统A扩展功能将会变得相对容易。
2. Microsoft已经宣布到2007年底推出的Internet Explorer将不再包含Microsoft JVM,即以后的IE都必须由用户自己安装相应的JAVA运行环境,也就是说日后系统A的升级的可能性非常大。
3. 升级系统A相对简单,只要将相应的源程序用高版本的JDK重新编译,编译过程中编译器可能会提示:找不到某些包,这样只需修改相应的import路径即可。工作量较小。
基于以上考虑,希望某某客户分公司采纳此意见,升级系统A,解决二者不兼容的问题。在此过程中,某软件开发公司B进行相应的配合。                                                      某软件开发公司B
       2005-02-05

解决方案 »

  1.   

    可以,你给钱哇!
    由于我们A公司对产品源代码有全部所有权,所以不打算给公司B看。
    所谓的升级系统A只是B公司单方面的片面之词,根据我们A公司的评估,发现升级非常麻烦,经初步估计,大概需要$1,000,000的费用。
    由于B公司擅自更改客户计算机上的JVM,导致A公司的程序不能运行,对A公司造成恶劣的影响,因此A公司强烈要求B公司停止这种破坏行为,并赔偿人民币若干云云。
      

  2.   

    Applet的应用我一般均会以这种形式来书写的,不会以调用ActiveX的方式来调用的: <applet code="Applet.class" width="100%" height="100%" codebase="./" MayScript> 
    <param name="cabbase" value="Applet.cab"> 
    <param name="archive" value="Applet.jar"> 
    <param name="Name" value="value"> 
    </applet>
      

  3.   

    对于java程序来说,jvm就是操作系统了。所以要换操作系统就是重大级别的软件变更。这个系统是产品类型还是项目类型?项目一般不需要升级操作系统。产品就不同,产品升级是必须的。就是尽量作到接口编程,降低耦合,让修改容易。如果原来没考虑过这些,那么修改的成本将很高。检查原系统的设计和代码,评估耦合程度,判断修改难度,估算出修改的成本。然后召开系统变更评审会议决定解决方案。
      

  4.   

    这样就是Java也没有移植性了,哈哈。
    不过象这样的情况,各打五十大板肯定解决不了问题,必须有一方做出改动,这可以说不是技术上的问题,要看两家公司怎么去协调处理了。
      

  5.   

    我看是大家都全部升级到Sun JVM 1.5.0上面好了
      

  6.   

    JAVA版本问题确实需要考虑,值得学习下!
      

  7.   

    Java的源码反编译很容易,我不敢用Java写商业程序的
      

  8.   

    这不符合java宗旨。到时候sun、ibm、microsoft(几乎很少用吧)各搞各的,不晕死一大片才怪。
      

  9.   

    反正MS是铁定不搞了,到2007年12月31日后就再不弄Java了
      

  10.   

    与其说MS非常尖,还不如说比尔.盖次非常天才!他可能准备从其他的方面进行对SUN的克制!
    MS已经从SUN挖走多少天才了!
    为了什么??
    就是想将来MS一统天下!
      

  11.   

    有网友说到兼容问题. 我想c++也有好多种不同的api,经过10年才定了一个标准. 结果这标准在ms平台下很多情况还用不上.这样看java反而好多了. 在sdk api方面,ibm和sun是相同的.只是执行效率有差别. ms的jvm就不用说了,挂羊头卖狗肉的东西.到目前为止.我只碰到两种不兼容情况.
    1. jdk1.1和后续版本不兼容. 因为jdk 1.1 实在太不成熟. 且ms的jdk也确实扰乱了市场.2. 一些awt io处理方面不兼容.写gui时比较麻烦. swing会比较好。其他大部分api都是可以继续用的.只是在后续版本中被标记为deprecated. 知道不兼容情况, 也很容易把握该怎么写能够继续用的程序了吧.
      

  12.   

    知道deprecated的原理与处理过程是什么不?如果我们自己要写程序标识为deprecated,怎么做?没有去做过,有做过的朋友公布一下经验。
      

  13.   

    经过查看JDK源码知道deprecated的原理与处理过程只要在你想deprecated的类或方法的JavaDoc文档说明上面标识一下就可以了即加上:
     * @deprecated As of JDK version 1.1,当然加上
     * @deprecated As of JDK version 1.1, replaced by <code>NewClass.newMethod(String s)</code>.
    给人家提示一下更好了比如:你的DepartedClass里有个方法departedMethod是即将被抛弃的,那么在另一个新类里引用这个被抛弃方法时,在编译时就人报信息的:)完整的程序附后。
      

  14.   

    package jdk;/**
     * <p>Title: DepartedClass</p>
     *
     * <p>Description: DepartedClass</p>
     *
     * <p>Copyright: Copyright (c) 2004</p>
     *
     * <p>Company: Beyond DayBreak Office</p>
     *
     * @author YuLimin
     * @version 1.0
     */
    public class DepartedClass
    {
        /**
         * 即将被抛弃的方法
         *
         * @param s a string.
         * @see NewClass
         * @see NewClass#newMethod(java.lang.String)
         * @deprecated As of JDK version 1.1, replaced by <code>NewClass.newMethod(String s)</code>.
         */
        public void departedMethod(String s)
        {
            System.out.println(s + ":Departed Method!");
        }    /**
         * 测试即被抛弃的类、方法,这里编译是不会报departed信息的,只有在另一个类引用此类时,在编译新类的时候才会提示departed信息的。
         *
         * @param args String[]
         */
        public static void main(String[] args)
        {
            DepartedClass departedclass = new DepartedClass();
            departedclass.departedMethod("Hello");
        }
    }
      

  15.   

    package jdk;/**
     * <p>Title: DepartedTest</p>
     *
     * <p>Description: DepartedTest</p>
     *
     * <p>Copyright: Copyright (c) 2004</p>
     *
     * <p>Company: Beyond DayBreak Office</p>
     *
     * @author YuLimin
     * @version 1.0
     */
    public class DepartedTest
    {
        /**
         * 引用即被抛弃的类、方法,这里编译的时候就会提示departed信息的。
         *
         * @param args String[]
         */
        public static void main(String[] args)
        {
            DepartedClass dc = new DepartedClass();
            dc.departedMethod("test");
        }
    }
      

  16.   

    标记为deprecated不见得能够正确使用,我印象就有几个方法被标记成deprecated后方法体就只一句return null了,这种时候不只是单单编译这么简单了
      

  17.   

    deprecated只是被声明不建议使用,至于你用不用是你自己的选择了:)
      

  18.   

    今天突然想到了一个方法,不知道行不行。对于第一个问题,可以把那两个JVM的jar文件都COPY出来,然后在源代码里面用来类时,用全名限制,也就是不用import,每用到一个类的时候,前面都加上java.util.Date这样的包名限定,这样就不会再也找不到那些类了。
      

  19.   

    如果修改,当然还不如一起改,改到jdk1.4
    不能改到1.5,因为我还没用过呵呵呵
    而且1.5与1.2,1.3,1.4差别很大
      

  20.   

    To:wanghongtaoleifeng 继续努力:)
      

  21.   

    说得我好迷茫,不是说java是跨平台的么,怎么自己的版本间还存在这么多问题呢。
      

  22.   

    做Applet应用时是要考虑不同的JVM的问题,做多了就知道:)
      

  23.   

    回复人: YuLimin(阿敏总司令:人是要有点精神的,一个民族更要有点精神) ( ) 信誉:708  2005-06-01 12:42:00  得分: 0  
     
     
       做Applet应用时是要考虑不同的JVM的问题,做多了就知道:)
     
     
    没做过,也知道啊
    比如263.net上的 那个棋牌室 就他 妈的要ms 的,晕,超级烂,还不能升级!辛好,还没有看到必须要IBM的
      

  24.   

    对了,楼主,为什么要公司使用applet呢?,我讨厌这种 垃圾产品(水平低,我认为applet就是垃圾),实在没什么理由要Applet
      

  25.   

    呵呵,Java可是从Applet开始的哦:)世界在变也在前进
      

  26.   

    只有全部用jdk v1.1.8写的就不用愁这个问题.呵呵!
      

  27.   

    看了各位高手的发言我似懂非懂啊 ,不过想起了遇到的一个问题:
    用浏览器运行applet时,总提示:
    java(TM)plug-in致命错误:
    无法从<\bin\hotspot\jvm.dll>载入java runtime environment
    是不是因为系统里装过不同版本的JVM呢?卸载时没有卸载干净?
    呵呵,借地方一用
      

  28.   

    楼上的,你重新安装一下JRE应当就可以了。
      

  29.   

    看了这么久,还是搞不明白,郁闷,我们公司以前有做过一个applet的应用,主要是用在接收消息快速作相应的人工处理,后把结果返回给客户端,但下个applet很慢,还要让客户安装jvm,反映不是很好,后面就干脆坐成了application 和网页结合使用,才耳根清静了点。不知道将来升级会不会有类似的问题