当前位置: 首页 > 知识库问答 >
问题:

交叉编译旧版本的Java时,在哪里可以找到引导类?

鄂曦之
2023-03-14

我们有一个Java项目希望分发给用户,它不使用Java1.5以外的任何Java特性,所以我们希望它在1.5及以上Java上运行。

在这一点上,您可能会正确地注意到Java1.6是目前可用的最古老的,那么为什么要将目标Java1.5呢?然而,这并不能改变旧版本交叉编译问题的一般性质。

因此,人们通常开始交叉编译尝试的方式是,将-source 1.5-target 1.5选项指定给javac,这时人们会收到一个著名的警告,提示未设置-bootclasspath

$ javac -source 1.5 -target 1.5 Test.java 
warning: [options] bootstrap class path not set in conjunction with -source 1.5
1 warning

现在,根据Oracle博客文章以及官方留档,交叉编译的正确做法是:

要使用来自JDK N的javac跨编译器到较旧的平台版本,正确的做法是:

  • 使用旧的源代码设置

如果不采取第二步,javac将尽职尽责地使用旧的语言规则和新的库,这可能会导致类文件无法在旧的平台上工作,因为可以包含对不存在的方法的引用。

例如,引用官方文件:

% javac -source 1.6 -target 1.6 -bootclasspath jdk1.6.0/lib/rt.jar \
    -extdirs "" OldCode.java

这很好,在堆栈溢出和互联网的其他部分之前,已经被多次回答过。

然而,我们找到的所有资源似乎都没有指明在哪里可以找到旧版本Java的rt.jar。例如,JDK 1.7不附带rt.jar,除了它自己的:

$ find jdk-1.7.0_45 -name rt.jar
jdk-1.7.0_45/jre/lib/rt.jar

这让人认为,为了获得Java 1.6的rt.jar,需要下载JDK 1.6。但随后出现了两个问题:

  1. 如果我们下载JDK1.6,我们也可以用它来编译,而不是JDK1.7
  2. 如果我们希望针对Java1.5进行交叉编译,那么JDK1.5将不再可供下载

那么,我们如何实际指定-bootclasspath选项来使用这种交叉编译功能呢?

共有2个答案

涂溪叠
2023-03-14

这种类型的编译主要是因为需要针对已经在生产中的JRE或其他现有安装IME。在这种情况下,从现有安装中提取JRE引导类路径文件,并使其从构建系统中可用将是第一项任务。指定的bootclasspath值将取决于在该步骤中放置JRE bootclasspath文件的位置。

仅供参考,您可能需要更多的文件,而不仅仅是rt.jar.例如,当目标IBMJava6。

袁法
2023-03-14

rt.jar包含在JRE中。如果有JDK 1.6和JRE 1.5,您将能够执行交叉编译

使用您的JDK 1.6:

$ javac -source 1.5 -target 1.5 -bootclasspath jre1.5.0/lib/rt.jar Test.java

这里的优点是,JRE的大小可以是完整JDK的1/3。您通常可以删除旧的JDK版本,而无需删除旧的JRE版本。

如果您需要获得旧的JRE,可以在Java Archive页面上的以下链接中找到它们http://www.oracle.com/technetwork/java/javase/archive-139210.html

 类似资料:
  • 我想下载旧版本的Android SDK:21.0.0,在哪里可以下载? 我目前有最新版本的android SDK,从这里下载。 然而,我想要一个旧版本,完整的旧版本的SDK可以从任何地方下载吗? 我正在尝试使用SDK管理器获取旧版本,但它不起作用。一、 它只给我构建工具等。

  • 我正在寻找vaadin版本6文档。在vaadin主页上,我只能找到vaadin版本7的文档。 我在哪里可以找到: 瓦丁之书第六版 可用时:-采样器的源代码/war?

  • 我不知道这是因为android-studio做错了什么,还是intelliJ中所有gradle项目都做错了什么,但有时当我运行Build/Debug时,我得到的只是: 我似乎找不到任何方法来获得更多信息,因为这段文字已经出现在我认为是编译器输出的内容上。 我该看哪?

  • 问题内容: 几年前,我在维护的Linux服务器上安装了Apache 2.2x和PHP 5.3.1。我使用.tar.gz并按照指示进行构建(而不是rpm和您拥有什么)。一切都很好。 今天,我需要安装它,它看起来像一个PHP库。我完成了所有步骤以进行安装,并在其中找到ibm_db2.so。 最好的收获是最后一步是配置php.ini,但是我的系统上没有php.ini。恐怖的恐怖。PHP可以正常工作,当然

  • 问题内容: hibernatejar中的DTD是了解可以包含哪些属性以及该标记的预期名称的好方法。 打开DTD文件是获得所有元素和属性的概述,查看默认值以及一些注释的最简单方法。 这将帮助程序员从scracth编写hibernate.cfg.xml文件(疯狂,但有些人确实要求在不使用internet的情况下实现:O) 当我们有一个hibernatejar时,请告诉DDT的位置。 这不是编程问题,但