【问题标题】:Is Java cross platform?Java是跨平台的吗?
【发布时间】:2011-08-24 02:17:13
【问题描述】:

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

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

如果是,怎么做?

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

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

【问题讨论】:

  • 尽可能跨平台使用 c 或 c++。
  • @Oded C 和 C++ 绝对不是跨平台的。您不能在一个操作系统中编译和链接其中任何一种语言的程序,并期望它在另一个操作系统中运行。
  • @Oded:我不认为 OP 希望像 “尽可能跨平台”“我想在每个不起眼的部分上运行已知的硬件”。我认为 OP 希望“尽可能跨平台”,例如,在 Windows、OS X 和 Linux 上运行 Swing 应用程序,它将覆盖所有桌面/笔记本电脑的 99.9% 以上在那里。关于 C/C++,你会建议有一个“跨平台 GUI”和并发库吗?至少 Java 确实提供了某种统一的 GUI 和良好的内置并发库令人惊叹的工具(我认为你不熟悉 IntelliJ IDEA)
  • @SyntaxT3rr0r 那里有足够多的 C++ 跨平台库。但是我理解你的意思,太多人只是无法为另一个平台重新编译软件。

标签: java cross-platform


【解决方案1】:

Java 是跨平台的吗?

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

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

是的,这是可能的。

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

如果是怎么办?

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

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

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

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

除非您正在开发的应用程序本身依赖于特定于平台的功能(例如低级系统调用),否则您应该可以使用普通 Java 来完成。

重要评论@Peter Lawrey

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

【讨论】:

  • 但是我发现应用程序是用java编写的,有两个安装文件,一个用于windows,另一个用于mac,是不是很奇怪
  • 这只是因为它们可能依赖于以本机方式与操作系统交互的低级库。因此,除非您依赖某些特定于 Linux 的系统调用等,否则您应该为每个系统使用一组类文件就可以了。
  • @AMH,可以是应用程序独立于平台,而安装程序则不是。例如IntelliJ 有三个特定于平台的安装程序,它们不是用 Java 编写的,但有一个 zip,您可以在任何平台上解压缩它,它就可以工作。
  • 即使同一个java应用程序可以在不同的操作系统上运行,它们在很大程度上取决于JDK/JRE版本。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    切换平台时无需重新编译 Java 字节码。

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

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

    更新:

    让我们重温一下问题中的原话:

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

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

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

    定义“跨平台”。听起来这里的偏见是“字节码可移植性”。 C/C++ 无法做到这一点,但只要您坚持使用 ANSI C/C++ 并避免使用供应商扩展,“源代码可移植性”当然是可能的。

    Java 从一开始就以字节码可移植性闻名。这就是 JVM 为您提供的。这并不意味着您的整个应用程序都是可移植的,因为您可能没有很好地管理其他依赖项。

    如果我用 "C/C++" 代替 "Java in that bloc,那么跨平台意味着不同的东西。我不能选择为一个平台编译的 .exe 或 .so 并期望在另一个平台上运行它,但如果我为每个平台创建一个 .exe 或 .so 并使其可用,当然可以使相同的源代码在多个平台上运行。

    如果是,怎么做?

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

    如果您有多个适用于您感兴趣的平台的 C/C++ .exe,您当然可以在需要时运行它。

    【讨论】:

    • 因此 C 和 C++不是 跨平台的。您不能指望用户自己编译和链接源代码以使程序正常工作。
    • 我不能期望用户这样做,但我可以期望希望将代码分发到各种平台的开发人员这样做。反对票不只是。这个答案没有错。
    • 该语言可能是跨平台的,但编译的 C/C++ 应用程序不是。 Java 是,但正如其他人所说,它的设置不是(比如设置 JAVA_HOME / 确保 Java 在你的路径中等)。
    • 这才是重点。 C/C++ 中的即用型应用程序只能在其构建的平台上运行,因此根据定义不是跨平台的。 Java 和 HTML 等其他语言一样。
    • 此外,如果我将该 .exe 嵌入到 VMWare 服务器中并共享它,我可以在任何可以运行 VMWare 的平台上运行它。那么可移植性的论点就变得模糊了。我认为我们应该讨论当前的实践和可能性,而不是 Bjarne Stroustrup 在开发 C++ 时的想法。
    【解决方案4】:

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

    每个操作系统运行应用程序的具体过程都不同。

    Java 开发工具包提供的库允许调用应该在任何操作系统上工作的系统功能(例如文件操作、用户界面)。然而,确切的行为可能会有所不同(类似于网站在不同浏览器中的外观不同)。此外,Java 应用程序的“外观和感觉”可能与专为该操作系统设计的应用程序的外观和感觉不完全匹配。

    【讨论】:

      【解决方案5】:

      这取决于您所说的“跨平台”是什么意思。 Java 代码可以在任何支持 JDK 的操作系统上编译为字节码二进制类或 jar 文件,并在任何支持 JRE 的平台上运行。然而,大多数编译语言可以在任何平台上编译,只要设计者能够满足它。 Java 比 C++ 更容易移植,但这并不意味着 C++ 代码不能在任何平台上编译。

      换句话说 - 不要只在这个单一功能上选择您的语言。为您的应用程序选择最佳语言将是一种更好的方法。也许脚本语言最适合您。也许发布另一个问题,询问使用什么语言来解决您的特定问题。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

          • 我也是。我正在开发一个水印应用程序,它使用在 linux 上使用 jdk 7 编译的图形标准库。但它在 ms windows 上不起作用。
          【解决方案8】:

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

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

          这在手机上比较多见,一些手机厂商因为硬件限制或者想控制设备的软件,不会完全实现JAVA,他们带有JAVA标志但是你必须使用他们自己的JDK和这些程序无法在其 JVM 实现之外运行。

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-21
              • 2011-04-12
              相关资源
              最近更新 更多