什么问题会阻止Java应用在多个平台上运行?

20

Java被称为“一次编写,随处运行”,确实如此,但在某些情况下它变成了“一次编写,到处调试”。

将Java应用程序从一个平台移植到另一个平台时,最常见的问题是什么?

有哪些不太常见但有趣的原因呢?


根据注释,它是“一次编写,随处运行”。 - IAdapter
8个回答

31
  • 不要假设文件系统大小写敏感或不敏感
  • 不要假设路径或目录分隔符
  • 不要假设行结束符
  • 除非你非常确定自己的意图,否则不要使用默认平台编码
  • 不要启动 "cmd.exe" 等(我知道这听起来很明显 - 但我见过它引起问题)

2
另外,不要对路径前缀(如\、C:、/)进行假设。 - Peter Štibraný
我喜欢在我们的办公室时不时地提出一些关于在应用程序中硬编码 /dev/null 的问题。是的,只要您不运行 Windows,它就可以很好地工作,而 Windows 可以说是我们支持的主要平台之一... - Esko
不要假设读者的阅读方向是从右到左、从左到右或从上到下。 - jpse
@jpse:这不是平台问题,而是用户界面问题,可能会在任何平台上都会出现。 - Jon Skeet
@jonSkeet 当然,在大多数情况下,这是一个UI问题。您可以在编码方面进行扩展...请确保使用类似于utf-8的东西。 - jpse

14

一些与界面设计相关的问题:

  • 按钮顺序错误,如 OK/Cancel
  • 使用绝对布局
  • 加速键不一致
  • 字体大小或渲染不同
  • 期望某些键存在(例如 Windows 键、Meta 键)

(尽管这些问题并非特定于 Java)


它们可能不是特定于Java的,但很容易忘记它们。 - Joachim Sauer

9

以下是我个人的经验。这些是我所看到的:

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

7
使用随Sun JDK捆绑的com.sun.*包中的类。

为什么这是个问题? - Sam

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

这是什么问题,为什么会成为一个问题? - Sam

5

使用JNI是值得考虑的。为每个目标平台提供本地库可以减少这个问题。


如果您在想要运行应用程序的每个平台上都有库,那就不需要了。在我的工作中,我开发了一个应用程序,它通过JNI在Windows和Linux上使用外部库。不幸的是,这个库在Mac OS上不可用 :-( - Peter Štibraný
但是你仍然限制自己只能在那些安装了本地库的平台上运行,而不是所有支持Java的平台。 - Joachim Sauer
没错,我只是想指出JNI不一定是个问题。(但显然需要检查,所以+1)。 - Peter Štibraný

1

从我的记忆中...这些事情中有一些实际上发生在工作中

  • JNI

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

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

  • 底层硬件,如可用内存或核心,可能导致行为变化


1

有许多不同的JVM,因此取决于客户端在其计算机上安装了哪个版本,他们可能会得到略微不同的结果。


它们不都必须遵守API和合同吗? - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接