如果我使用 WebSphere 6.1 (Java 1.5) 部署到服务器,我应该在我的构建盒上使用 IBM 的 JDK 吗?或者 Sun 的 JDK 会编译成相同的二进制文件吗?
如果我应该使用 IBM 的,我在哪里可以获得 Windows x64 版本?
如果我使用 WebSphere 6.1 (Java 1.5) 部署到服务器,我应该在我的构建盒上使用 IBM 的 JDK 吗?或者 Sun 的 JDK 会编译成相同的二进制文件吗?
如果我应该使用 IBM 的,我在哪里可以获得 Windows x64 版本?
我会尽可能地尝试使开发尽可能接近生产。IBM 和 Sun 的 JDK 肯定都满足 SDK 认证,但它们绝不相同。它们的检测和内存管理至少略有不同。如果不出意外,JDK 中的错误会有所不同,您的代码可能只会在一种情况下与另一种情况下发生故障。它也可能只发生在凌晨 4 点,当满月时,尤其是当你有公司过来的时候。
我无法告诉您从哪里获得 IBM 的 jdk,但如果您在公司获得了 websphere 的许可证,您应该与 IBM 联系以获得指向该 JDK 的链接。
祝你好运,并始终尽量减少差异。
它不应该有任何区别。它可能不是完全相同的二进制文件,但 100% 兼容。我假设您无论如何都在使用外部库,例如 log4j 或者 hibernate 或其他任何东西,而那些不是使用 IBM JDK 构建的。
但是,JRE 存在差异。例如,我记得当我使用反射列出一个类的方法或字段时,IBM JRE 曾经以与 Sun 不同的顺序将它们提供给我。
我将使用相同的 JDK 来构建将在部署应用程序时使用的(如果您可以控制的话)。
如果编译器不同,则二进制文件可能不同,但它们在语义上应该相同。我不知道 IBM 是否编写了自己的编译器。JRockit JDK 实际上使用 Sun 编译器,但 JVM 不同。因此,对于 JRockit,二进制文件是相同的。
如果应用程序在运行时与不同的 JDK 一起使用,我仍然会使用您认为大多数时间在部署时使用的那个来构建,并使用不同的 JDK 进行一些运行时测试。
IBM JDK 附带 J9 VM,SUN JDK 在 Hotspot VM 上运行,它们具有不同的算法来运行。如果您在 SUN JDK 中部署和调优,并且您的生产使用 IBM JDK for WAS,那么您的应用程序可能不会执行相同的操作。与供应商核实并开票,让我们知道情况如何。
除非您引用 java.* 和 javax.* pacakges 之外的类(您不应该这样做),否则使用任何 JDK 编译都不会导致问题。当然,给定供应商的 JDK 和规范可能会导致一些很难追踪的非常奇怪的运行时错误,但我以前从未见过这种情况。
我建议使用目标 JRE 运行您拥有的任何测试套件,因为供应商之间的运行时行为差异比编译语义更频繁。
JDK 将您的代码编译为字节码,而不是直接编译为机器码。预计不同供应商的编译器会生成跨供应商兼容的代码。例如,IBM 的 JDK1.5 编译器将生成在 SUN 的 JDK 1.5 及更高版本上运行的代码,没有任何问题。
另一个问题是编译器如何优化字节码,我没有信息表明某些编译器比其他编译器执行更好的优化。大部分优化是在运行时由 JVM 执行的(例如 JIT(即时)或 AOT(提前)策略)。
长期使用 WebSphere,JDK 的版本非常重要。WebSphere 6.1 附带 IBM JDK 1.5(或者是 5)。当您修补 WebSphere 时,JDK 也有等效的修补程序。虽然它可能适用于不同版本的 JDK(甚至不同的供应商),但如果出现问题,我怀疑您是否会从 IBM 获得很多支持。
如果您需要 64 位 JVM,我建议可能有 64 位构建,虽然我无法具体评论 Windows,但我可以告诉您有一个适用于 AIX 和 Linux 的 64 位 WebSphere 6.1 构建。
最好的答案是与供应商核实,看看他们是否支持您的配置。你不想做的是让它工作,然后在现场遇到问题,打电话给支持并发现你有一个不受支持的环境。
它们应该编译成相同的字节码规范,尽管它们可能编译不同的字节码(就像不同的 C 编译器生成不同的机器码一样)。我认为运行生成的代码不会有任何问题——我已经在 Mac 上编译了 Java 1.4,然后部署到 IBM 的 J9 在 PocketPC 上运行之前没有任何问题(这是在 J9 可以处理 Java 5 字节码之前) .
无论如何,我肯定会让您的编译平台成为您自述文件中的要点,以便您的客户可以查看它是否有问题。
或者,您可以使用 ANT 构建和部署,并将 Sun 的 JDK 与 ANT 一起使用。