写一次到处运行 - 但多久?

时间:2010-11-23 21:44:40

标签: java language-agnostic

Java提出了“一次编写一次运行”。

如何长期使用所有框架?

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

为了赢得争论的兼容性,原始API必须足够强大且足够稳定,能够在没有破坏性变化的情况下生存。如果不是,则将进行不兼容的更改,否则将完全放弃API。无论哪种方式,你的程序将不再运行,除非你有一个旧版本隐藏在某个地方运行它。

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

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

答案 1 :(得分:1)

我认为任何人都不能认真地承诺“永远在任何地方奔跑”。迟早Linux和Windows以及MacOS都将过时,新的操作系统将会出现,没有人会费心为它们编写JVM,因此你的Java应用程序都不会再运行了。 (我有一个旧的MS DOS游戏,我认为它很酷但它不会在Windows DOS框下运行。该公司推出了Windows版本,但他们认真地重新设计了游戏,并且在我的拙见中,摧毁了一切让它变得有趣。糟糕的男人。)

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

答案 2 :(得分:0)

似乎你不是在谈论应用程序而是关于applet(因为你提到了java脚本)。此外,这是一个applet,它从部署它的页面调用javascript。在这种情况下,它不是完全纯粹的java。听起来像使用Runtime.exec()调用平台相关的命令行,然后更改操作系统并抱怨该应用程序不起作用。

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

答案 3 :(得分:0)

编程语言和技术不断发展。从广义上讲,如果一个Web应用程序非常基础,它可以在不需要很多更改的情况下进行更新。

基于Java的语言似乎比Microsoft堆栈中的语言更新频率更低。但是,JSF 2与以前的版本相比有一些重大变化,如果你想使用Richfaces 4.x,Richfaces 3.x应用程序将需要迁移。

作为一种解决方法,您并不总是需要升级;有很多以旧语言编写的网站(经典的ASP一个),部署并仍然愉快地运行。