Java 写一次,到处跑,但要多久?

Java 写一次,到处跑,但要多久?,java,language-agnostic,Java,Language Agnostic,Java提出了“一次编写,到处运行” 从长远来看,如何利用所有框架实现这一点 几年前,我用JSF和richfaces编写了一个应用程序。浏览器已经进化并引入了新的功能,当然还有新的bug。现在应用程序仍在运行,有时它会显示底层库中的javascript错误 由于技术上的“改进”,我们是否真的需要重新实现一个finsihed应用程序(无需添加用例) 编辑:我提到的应用程序只是一个例子。如果供应商更改许可证,同样的事情很容易发生。(Oracle可能会对vm收费,而open vm与您的应用程序堆栈不兼

Java提出了“一次编写,到处运行”

从长远来看,如何利用所有框架实现这一点

几年前,我用JSF和richfaces编写了一个应用程序。浏览器已经进化并引入了新的功能,当然还有新的bug。现在应用程序仍在运行,有时它会显示底层库中的javascript错误

由于技术上的“改进”,我们是否真的需要重新实现一个finsihed应用程序(无需添加用例)


编辑:我提到的应用程序只是一个例子。如果供应商更改许可证,同样的事情很容易发生。(Oracle可能会对vm收费,而open vm与您的应用程序堆栈不兼容等)

您似乎不是在谈论应用程序,而是在谈论小程序(因为您提到了java脚本)。此外,这是一个小程序,从部署它的页面调用javascript。在本例中,它并不完全是纯java。听起来像是使用Runtime.exec()调用依赖于平台的命令行,然后更改操作系统并抱怨应用程序无法工作

或者可能我没有正确理解您的用例?

即使我们相信“编写一次,在任何地方运行”,这与永久的向后兼容性并不完全相同。实际上,您必须期望未来版本的框架能够改变一些事情。有时,这将是删除过去被保证的行为(最糟糕的一种更改),其他时候,代码中的错误将被忽略,直到库的某个未来版本显示您依赖于未被保证的实现细节。更罕见的是,您的旧代码会在最新版本中发现一个新的bug

在理想情况下,我们编写的代码只依赖于保证的行为,保证永远不会被删除,因此有效的代码将永远工作。与此相反,很难证明您的程序是完全正确的,语言/框架/库开发人员决定是否可以添加他们想要的改进,同时保持完美的兼容性

为了使兼容性赢得争论,原始API必须足够强大和稳定,能够在没有破坏性更改的情况下生存。如果不是,那么要么进行不兼容的更改,要么完全放弃API。不管是哪种方式,你的程序都不会再运行了,除非你有一个旧版本藏在某处运行它

你会问如何做到这一点——它首先需要非常好的、有点幸运的界面设计,以允许你以后提出的所有扩展,或者需要坚定的承诺和“商业案例”(或非商业动机)来无限期地支持“旧”版本。例如,Python3与Python2不兼容,但Python2仍然受到更新的积极支持,因此旧的Python代码仍然可以运行。C99只删除C89的一些功能,如果所有其他功能都失败,C89编译器仍会积极维护。浏览器支持一千零一个旧版本和HTML的非标准特性。我不知道JSF和richfaces与之相比如何,也不知道它们输出的页面有多少依赖于客户端对“旧”(或古怪)HTML/CSS/Javascript行为的支持


所以这可能发生,至少在一段时间内。但是IE6的一些功能在任何浏览器中都不再可用,可以安全地在网络上发布(我想你可以在沙盒虚拟机上运行IE6,或者在你不关心的机器上运行IE6),所以这是一个你首先依赖什么的问题。在未来的版本中,专有浏览器扩展会像石头一样掉落吗?可能吧,但那些IE6应用程序编写者是否能够使用当时可用的适当标准实现他们想要的目标?不总是这样。即使对于那些没有参与IE6的人来说,如果你的应用程序陷入了类似的陷阱,你也会倒霉。

编程语言和技术不断发展。从广义上讲,如果一个web应用程序非常基本,那么它可能能够在不需要太多更改的情况下进行更新

基于Java的语言更新频率似乎低于Microsoft堆栈中的语言。然而,JSF2与以前的版本相比有一些很大的变化,如果您想使用RichFaces4.x,RichFaces3.x应用程序将需要迁移


作为一种解决方法,您不必总是升级;有很多网站都是用较旧的语言编写的(其中一个是经典的ASP),它们已经部署,并且仍然在愉快地运行。

我想没有人能认真承诺“永远在任何地方运行”。Linux、Windows和MacOS迟早都会过时,新的操作系统会出现,没有人会为它们编写JVM,所以你的Java应用程序都不会再运行了。(我有一个旧的MS DOS游戏,我认为它很酷,但它不会在Windows DOS下运行。该公司推出了一个Windows版本,但他们认真地重新设计了该游戏,在我看来,破坏了一切让它有趣的东西。真是个扫兴的人。)


与此同时,新版本的向上兼容性是一件好事,但供应商时不时会认为这太麻烦了。

社区wiki复选框发生了什么?它不见了:你能举例说明你遇到了哪些JavaScript错误吗?我的意思是,它们会影响应用程序的功能,还是只是令人讨厌?公平地说,“一次编写,随处运行”适用于Java语言,而不是不相关的(尽管名称不同)Javascript脚本语言。这是web的本质。它在进化。如果您希望一个程序从现在起运行20年,请用C编写它,并保留源代码以便在必要时重新编译。+1我编写的“虚拟现实”引擎也有同样的问题,该引擎已被弃用,因为windows不再允许DOS的全屏模式。@stacker:您可以试一试。它模拟包括DOS在内的整个x86,并在此基础上运行您的DOS程序。不要乱搞这些像“窗户”这样的新式概念