在Windows编译的Java程序能在Linux系统中运行吗?

13

我的Java程序在Windows(Eclipse和Bluej)下使用时正常运行。我将其压缩成Jar文件并发送到我的Red Hat系统,结果什么都不起作用。它会在最奇怪的地方出现问题,比如文本字段设置文本不会显示,JPasswordfield就消失了,Java AWT ROBOT也死掉了... 这个列表还很长。起初我以为是我的Linux JRE过时了,但是我安装了最新的JRE和JDK,没有任何改进。我感觉我误解了Java跨平台的能力。我还尝试删除所有函数和内部代码,看看是什么出了问题,但好像每隔一秒钟就有一件事情出问题,除了一些主要的GUI组件和大部分后端内容之外。基本上任何使用炫酷功能的东西都会爆炸,比如将文本字段变成密码字段...

这是我第一次发布帖子;)请善待新手!

谢谢!!!

问题已解决!!!太棒了。问题解决了!!!因为我的Java路径没有设置,所以我的GCC/GCJ代替了我的Oracle Java,即使我使用了java -jar xxx.jar命令。所以我在java -jar xxx.jar之前输入了Java目录路径,然后就像魔术一样正常工作。除非你设置路径,否则你必须手动执行此操作。

/usr/java/jdk1.6.0_21/jre/bin/java -jar xxxxx.jar

使用java -version检查当前运行的Java版本是否是真正的Java还是GCJ。


它是跨平台的(例如,您不必重新编译JAR文件),但仍然存在一些小问题,因此您必须小心处理。您应该发布一个相对较小的程序,在Linux上显示问题。 - Matthew Flaschen
3
@OMG:Swing非常易于移植。人们遇到的问题(例如控件不能正确对齐)更多是由于程序员没有正确使用布局。 - Reverend Gonzo
你在Linux系统下使用的是哪个JRE?如果你安装了Oracle的JRE,你确定你实际上使用的就是它,而不是Linux发行版默认包含的其他JRE吗?你可以使用"java -version"命令来检查。 - jarnbjo
AWT机器人如何停止工作?Javadoc指出,您可能需要特殊权限来运行它并启用X Window系统的扩展。这不是Java的错误,而是Linux的安全措施。 - josefx
耶!问题解决了!!!这是因为我的Java路径没有设置,所以我的GCC/GCJ代替了我的Oracle Java,即使我使用了java -jar xxx.jar。所以我把java目录路径放在了我的java -jar xxx.jar之前,就像魔法一样奏效了。除非你设置了路径,否则你必须手动执行以下命令: /usr/java/jdk1.6.0_21/jre/bin/java -jar xxxxx.jar使用java -version检查你的真正的Java是否正在运行或者它是否仍然是GCJ。 - JavaLu
显示剩余3条评论
10个回答

12

Linux用户经常使用gcj而不是java来运行java程序。检查您是否使用了正确的可执行文件。


哦,我实际上正在使用gcj -jar xxx来运行我的Jar文件。 - JavaLu
1
@JavaLu:我认为那就是你的问题所在。在Linux上,你应该使用OpenJDK或Sun的Java。 - Mike Baranczak

7

请确保您在Linux机器上使用Sun(Oracle)的JRE,而不是一些第三方Java实现,例如gcj或类似物。

根据我的经验,只要您在每个目标操作系统上坚持使用相同的JVM /运行时供应商,Java应用程序就非常易于移植,但来自不同供应商的Java实现可能会表现出不同的行为。


我明白了,我正在使用gcj运行我的Jar文件。我已经安装了Oracle的JRE,但不确定运行jar文件的命令是什么。 - JavaLu
顺便提一下,您可以使用“which java”命令来查找实际被调用的Java命令。 - Grodriguez
开放jdk能用吗?对我来说情况正好相反 - 我在Linux上编写,所以我想在Windows上部署。 - shevy

5

是的,类和jar格式有意地跨平台。

你确定你的jar文件已经正确复制到了Linux机器上吗?如果你使用ftp进行传输,关键是要使用二进制而不是ascii传输。


2
如果这是一个二进制/ASCII问题,那么.jar文件甚至无法被识别为有效的文件。什么都不会起作用。 - Erick Robertson
我使用Total Commander进行FTP,由于我离开了我的电脑,现在无法测试。我不知道是FTP还是ASCII,但我会尝试使用我的存储棒。 - JavaLu
这取决于传输文件中存在的位模式。 - Thorbjørn Ravn Andersen
@JavaLu,你也可以将_source_文件传输到你的Linux机器上进行编译。你需要安装JDK。 - Thorbjørn Ravn Andersen

3

您的应用程序是否依赖于任何外部库,这些库也需要在您的Linux机器上可用?


1
如果这是问题的原因,那么就会在各个地方抛出ClassDefNotFoundExceptions异常。 - Erick Robertson
确实如此,但除了模糊的“它坏了”之外,我们没有太多线索可供参考。 - Dave
抱歉,我离开了我的电脑,所以无法回忆起所有的错误。但我记得其中一个:java.lang.error: not implemented。很抱歉没有准备好,我原本预计在第一次回复前有5个小时,而且不会这么紧张。 - JavaLu

3

Java说:“一次编写,到处运行”。


1
说到Swing,实际上更像是“一次编写,到处测试”。 - finalman
“Write once, run anywhere” 对于 C 而言比 Java 更为真实。Java 应该被描述为“编译一次,在安装有 JVM 的任何地方运行”。 - Ben Voigt
@finalman 如果你不知道如何很好地使用布局,并且没有意识到跨平台的影响,那么你可能应该在多个分辨率和字体大小下进行测试。你必须考虑到不同平台上不存在的字体并进行测试,但至少Java有布局管理器可以处理变化的条件,因为他们知道允许这种代码重用会带来新的问题... 在这方面它仍然比其他任何语言都要好。 - Bill K

2

Swing应该是完全可移植的。尝试使用广泛支持的金属外观和感觉。不过我对于java.awt.Robot有些怀疑,如果这是你问题的源头也就不足为奇了。


1

你在使用KDE吗?用的是哪个主题?昨天我遇到了一个问题,主题“Cleanlooks”在渲染小部件时有很多bug。试试“Oxygen”主题。

如果可以的话,尝试在另一台Linux机器上运行代码(也许它有硬件缺陷)。运行“memtest”(应该是启动加载程序或救援CD中的选项)。


1

我有一个Swing应用程序,通过Java Web Start分发,自2004年以来我没有更新过它,但我知道它在Mac OS X、Windows和Linux上仍然可以正常工作。就在前几天,有人给我发了一封关于它的问题的电子邮件,所以我运行了它。它最初是在Windows上编写的,但在其他操作系统甚至更晚版本的Java中也从未出现任何问题。

JVM在各种平台上提供了非常公平的竞争环境,而Java API的实现也很好,可以提供相同的功能和工作方式。我的打赌是,你会发现这个问题与你的Java代码完全无关。除了建议在运行相同操作系统的另一台机器上尝试你的应用程序之外,还要尝试其他人在出现问题的计算机上运行的Java应用程序。尝试我的HotSheet:http://www.johnmunsch.com/projects/HotSheet/或像Legerdemain这样的游戏:http://roguelikefiction.com/?page_id=6,看看它们是否能够正常工作。


1
在Linux上,使用Sun JDK/JRE而不是openjdk可能非常重要,因为openjdk是官方sun java jdk的一个实现。所以虽然不确定,但可能会出现这种情况。

0

Java非常可移植。你的虚拟机可能不同。尽管开源虚拟机变得越来越好,我建议尝试使用Sun的虚拟机——我从未遇到过任何运行代码的问题。

此外,如果您正在使用任何带有机器语言组件的库,这些库将不同(我注意到某些图形库会调用平台的3D子系统)

但是Java本身将轻松移植到具有相同库和良好虚拟机的任何系统中——我一直在做这个工作,已经十年了,从未遇到过问题。这是在客户端/服务器系统上运行,其中客户端和服务器位于不同的平台上,如PC/Mac和Unix甚至嵌入式系统——所有东西都可以移植。

现在,在不同浏览器中运行的小应用程序,或者在不包含相同字体的计算机上视觉匹配字体——没有什么可以帮助你。


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