【问题标题】:Do jars behave differently in unix and linux?jar 在 unix 和 linux 中的行为是否不同?
【发布时间】:2013-09-03 07:16:13
【问题描述】:

我有一个 jar,它从一个巨大的 XML 文件创建一个过滤的 XML 文件。 现在这个 jar 在带有 Java SE 1.5.0.15 的 UNIX 中可以完美运行,但在 Linux 中,这个 jar 的行为有所不同,并创建了错误的 XML。

这可能是平台问题吗?

我需要为 LINUX 制作一个新的 jar 吗?

【问题讨论】:

  • 检查安装了哪些 JRE/JDK
  • 这太模糊了。究竟有什么区别?在您的 Linux 系统上创建的 XML 有什么“错误”?您使用的是什么品牌和版本的 Unix 和 Linux?为 Linux 制作一个新的 jar 不是解决方案。
  • Java 源代码的可移植性可能不如您想象的那么普遍。你应该展示一些。
  • 这可能是不同版本的 JRE 的错误(如果您在 unix 下使用 jdk 1.6 构建和使用 jar;在 linux 下使用 jre 1.7)。如果您使用不同版本的库(xml 解析,...),则相同。

标签: java linux unix executable-jar


【解决方案1】:

Linux 是 Unix 的一个版本。你是说索拉里斯吗?

我建议您使用最新版本的 Java,如果必须,请使用最新版本的 Java 5.0。我还会尝试使用 Java 6 update 45 或 Java 7 update 25 来查看这是否是已修复的错误。

【讨论】:

  • 严格来说,Linux(即GNU/Linux)是一个“类UNIX”操作系统。
  • JAVA_HOME 在 UNIX(HP-UX) 中设置为 java1.5/jre。 LINUX 中的 JAVA_HOME 设置为 Java/linux-x86/j2re1.5.0_64/ 前提是 jar 在使用相同版本的 java 的 3 台不同的 UNIX 机器中正常工作......!我无法找到问题所在?
  • 我们有一个限制,我们只能使用 j2se 1.5!!
  • @Ba3ykaa 我知道 Java 5.0 大约在 5 年前就结束了。我建议它的原因是看看它是否可能是一个错误。如果使用相同代码的更高版本没有出现问题,则表明 JVM 中存在错误。如果您可以确定错误是什么,则可以解决它。如果它是您的代码中的错误,您可以修复它。
【解决方案2】:

这可能是平台问题吗?

只是一个疯狂的猜测...在 java 中,默认字符集是平台相关的。默认字符集取决于底层操作系统的语言环境。将 XML 字符串转换为字节并将它们写入文件时,您可以获得不同的结果,具体取决于默认字符集。

byte[] xmlFileBytes = xmlString.getBytes() //取决于默认字符集

在两个平台的代码中查看 JVM 默认字符集调用 Charset.defaultCharset() 以进行比较。也许在 UNIX 上有所不同?
确定默认字符集的另一种方法是使用命令行实用程序:
$ jinfo <processId> | grep file\.encoding
要查看操作系统区域设置,请使用命令: $ locale

XML 文件应以 UTF-8 字符集编码。 您可以使用 UTF-8 覆盖代码中的默认字符集:xmlString.getBytes("UTF-8")
或者您可以在 JVM 启动时通过提供 file.encoding 系统属性来覆盖它:
$ java -Dfile.encoding=UTF-8 -jar your-jar-file.jar


我需要为 LINUX 制作一个新的 jar 吗?

可能不是,Java 口头禅应该是"Write once, run anywhere"

但是:

问题在于,由于有多种 JVM 实现,在各种不同的操作系统(如 Windows、Linux、Solaris、NetWare、HP-UX 和 Mac OS)之上,如何实现程序可以在每个 JVM/OS 组合上执行,这可能需要在各种目标平台上测试应用程序。这在 Java 开发人员中引起了一个笑话,“一次编写,到处调试”


【讨论】:

  • 实际上问题在于 LINUX 环境中的区域设置将其更改为 ISO-8859-1 并且一切都开始正常工作。文件中有法语字符导致 JAR 无法处理。我配置的设置以便可以在环境中读取法语和其他类型的字符:LANG= LC_ALL= LC_CTYPE=en_US.ISO8859-1
【解决方案3】:

这可能是平台问题吗?

可能。或者它可能是您正在运行的应用程序中的错误。

我需要为 LINUX 制作一个新的 jar 吗?

我怀疑这会有什么不同。如果问题是“平台问题”,则很可能是应用程序(在 JAR 中)和运行时库(在执行平台中)之间存在一些不兼容。重建 JAR 不太可能改变这一点。


然而,这都是猜测。如果没有更多细节(即应用程序在做什么,以及它如何“表现不同”),就不可能知道发生了什么,这是一个平台问题(或只是一个应用程序错误),以及你可以做什么修复它。

【讨论】:

    猜你喜欢
    • 2020-03-21
    • 1970-01-01
    • 2013-11-21
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2017-08-17
    • 2011-01-08
    相关资源
    最近更新 更多