Java跨平台吗?

我想开发一个跨平台的应用程序。

Java跨平台吗? 我的意思是,我可以在Windows中开发Java应用程序并在Mac OS X和Linux中使用它吗?

如果有,怎么样?

我发现用Java编写的应用程序有两个安装文件,一个用于Windows,另一个用于Mac。 这让我很困惑。

任何插图或建议将受到高度赞赏。

Java是一个跨平台吗?

Java是跨平台的,因为编译的 Java程序在存在JVM的所有平台上运行。 (适用于所有主要操作系统,包括Windows,Mac OS和Linux。)

我的意思是我可以在Windows中开发Java应用程序并在mac和Linux中使用它?

是的,这是可能的。

这(以及安全方面)是在虚拟机中运行程序的主要优点之一。

如果有,怎么样?

  • 用Java编写应用程序(在.java文件中)
  • 使用Eclipse或javac编译应用程序(转换为.class文件)
  • (可选)将.class文件捆绑在可执行文件( .jar文件)中

可以在Windows系统,Mac系统等上分发和执行相同的.jar文件。

我发现用Java编写的应用程序有两个安装文件,一个用于Windows,另一个用于mac。 这让我很困惑。

这是因为某些应用程序依赖于特定于平台的function。 然后将它们与不同的平台特定库捆绑在一起。

除非您正在开发一个本身依赖于特定于平台的function的应用程序(例如低级系统调用),否则您应该可以使用普通的Java做得很好。

@Peter Lawrey的 重要评论

它可以是应用程序独立于平台的,而安装程序则不是。 例如,IntelliJ有三个特定于平台的安装程序,这些安装程序不是用Java编写的,但是有一个zip,您可以在任何平台上解压缩它并且它可以工作。

您可以在具有JVM的每个设备上运行Java应用程序。 如果没有,那你就不走运了。

Oded的评论非常重要。 C和C ++在许多设备上都有编译器。

切换平台时,不需要重新编译Java字节代码。

C和C ++将要求开发人员在将应用程序分发到目标系统之前重新编译应用程序,但一旦完成,客户端将能够无问题地运行。

无论您选择哪种语言,都必须处理特定于平台的自定义和设置问题。 您的应用程序越依赖于特定于平台的function,它的可移植性就越低。

更新:

让我们重温一下问题中的原始单词:

我想开发一个跨平台的应用程序。

这是目标 – 直接引用。 没有关于网络,移动或桌面应用的详细信息。

Java跨平台吗? 我的意思是,我可以在Windows中开发Java应用程序并在Mac OS X和Linux中使用它吗?

定义“跨平台”。 听起来像这里的偏见是“字节码可移植性”。 C / C ++不能这样做,但只要你坚持使用ANSI C / C ++并且不使用供应商扩展,“源代码可移植性”肯定是可能的。

Java从一开始就声名鹊起,一直是字节码可移植性。 这就是JVM带给你的东西。 这并不意味着您的整个应用程序都是可移植的,因为您可能没有很好地管理其他依赖项。

如果我用“C / C ++”代替“那个集团中的Java,那么跨平台意味着不同的东西。我不能为一个平台选择.exe或.so编译,并希望在另一个平台上运行它,但如果我创建一个。 exe或.so对于每个平台并使它们可用它当然可以使相同的源代码在多个平台上可运行。

如果有,怎么样?

如果您已将Java应用程序打包为JAR,则可以将其放在任何您喜欢的平台上。

如果你有兴趣的平台有多个C / C ++ .exes,你当然可以在需要的时候运行它。

关于Java可移植性有一个重要的警告。 “业务逻辑”(非UI东西)非常便携,但是至少有六种不同的(并且不兼容的)用户界面范例适用于Java,因此,例如,编写为在Android上运行的Java代码(甚至忽略了Android的不兼容的JVM)不能在诺基亚手机上运行,​​任何一个的代码都不能在台式机上运行。

但据我所知,没有其他语言可以做得更好。

是的,在一个OS上编写和编译的Java可以在另一个OS上运行。 JVM可用于许多现代操作系统。

Java应用程序打包为.jar文件。 这些可以在为应用程序实现正确的Java运行时环境的任何操作系统上运行,前提是用户已安装该JRE(JRE免费提供给用户)。

对于每个操作系统,运行应用程序的精确过程是不同的。

Java Development Kit提供的库允许调用应该在任何操作系统上运行的系统函数(例如文件操作,用户界面)。 但是,精确的行为可能会有所不同(与网站在不同浏览器中的外观类似)。 此外,Java应用程序可能具有“外观和感觉”,与专门为该操作系统设计的应用程序的外观和感觉不完全匹配。

这取决于你所谓的“跨平台”。 Java代码可以编译为支持JDK的任何操作系统上的字节码二进制类或jar文件,并在支持JRE的任何平台上运行。 但是,大多数编译语言都可以在任何平台上编译,前提是设计人员可以满足它。 Java比C ++更容易移植,但这并不意味着C ++代码无法在任何平台上编译。

换句话说 – 不要单独选择这个单一function的语言。 为您的应用选择最佳语言将是一种更好的方式。 也许脚本语言最适合您。 也许发布另一个问题,询问用什么语言来解决你的具体问题。

我用Java写了一个带声音的小游戏。 我使用过标准库(AudioInputStream和Clip类)。 该程序在Windows XP上运行得非常好,但我没有得到Windows 7或Linux Ubuntu的声音。

为所有这些操作系统安装了Java 6,我使用标准编译器JAVAC编译了该程序。

所以Java不是那么“跨平台”。

JAVA并不是真正的跨平台,因为它只是一种设计,一些JAVA实现可以是跨平台的,但它实际上取决于JAVA实现者。

SUN / Oracle为Windows,MAC和Linux制定JAVA标准实现,如果使用JDK构建程序,则应使用其JRE运行程序,如果尝试与其他JRE一起运行,则可能存在兼容性问题。

这在移动设备中可以看得更多,一些手机制造商不会完全实现JAVA,因为硬件限制或者因为他们想要控制设备的软件,他们带有JAVA标识,但你必须使用他们自己的JDK,这些程序可以不要在JVM实现之外运行。

JAVA的另一个问题是某些function可能会被弃用,而某些特定版本的JRE中运行的function无法在较新版本中运行或以不同方式运行。

最大的问题是当我们谈论移动应用程序时。 对于桌面操作系统,java可以完美运行,但对于移动设备,开发人员实际上只能为Android创建。 Totalcross等工具可以帮助Java开发人员为iOS和Android创建应用程序。 重点是将WORA假设保持在每个平台上,甚至是移动平台。