哪些问题阻止Java应用程序在多个平台上运行?

Java应该是“一次编写,随处运行”,它确实可以,但在某些情况下,它会变成“一次编写,随处调试”。

将Java应用程序从一个平台移动到另一个平台时出现问题的最常见原因是什么?

什么是不常见但有趣的原因?

  • 不要假设文件系统的大小写(in)敏感性
  • 不要对路径或目录分隔符做出假设
  • 不要对行终止符做出假设
  • 不要使用默认的平台编码,除非你真的,非常确定你的意思
  • 不要启动“cmd.exe”等(我知道,这听起来很明显 – 但我看到它会导致问题)

UI领域很少:

  • 正确/取消等按钮排序不正确
  • 使用绝对布局
  • 不同的加速键
  • 不同大小/字体的渲染
  • 预计存在某些键(Windows键,Meta键)

(虽然这些不是Java特定的)

我只能从个人经历中说出来。 这些是我见过的东西:

  1. 在某些体系结构上,线程的抽象方式不同,因此在延迟和可能的排序方面存在细微差别。 (这可能导致一些竞争条件)
  2. 控制键盘的状态(大写锁定,数字锁定等)并不总是按预期工作(Linux不允许我将大写锁定更改为禁用的v1.5)

使用Sun JDK附带的com.sun.*包中的类。

假设您可以写入包含您的应用程序的目录。

使用JNI是值得研究的问题。 为每个目标平台提供本机库可以减少此问题。

有许多不同的JVM,因此根据客户端在其盒子上安装的JVM,它们可能会得到略微不同的结果。

脱离我的头脑……其中一些实际上发生在工作中

  • JNI

  • 开发工具将字符引入到格式化的字符串文字中,这些文字在Windows下工作但在Linux下不起作用(实际上发生了)

  • 文件系统不一致(将应用程序紧密耦合到一个环境)

  • 诸如可用内存或核心之类的基础硬件可能导致行为改变