4

我的工作项目需要在JDK1.5下编译运行,我在Mac上。我按照此处的说明在 Snow Leopard 上恢复了 1.5,并且在从 IntelliJ IDEA 构建时工作正常,或者如果我与 build.xml 位于同一目录中并在“运行目标”时尝试“ant CleanRebuild”在 NetBeans 中,它们都是用错误的版本编译的,导致

java.lang.UnsupportedClassVersionError:.class 文件中的错误版本号(无法加载类...

当tomcat试图启动时。

所以我尝试过的事情

  1. 在项目属性/库下将“Java 平台”设置为 1.5。
  2. 在项目属性/源下将源/二进制格式设置为 JDK 5。
  3. 在首选项/蚂蚁下将蚂蚁家指向我正在使用的蚂蚁
  4. 重命名我能找到的每个 javac 可执行文件,希望 NetBeans 无法编译,我可以弄清楚它正在使用哪个(不走运)
  5. 将 1.5 设置为默认值,导致需要将 $netbeans_jdkhome 指向 1.6 jdk 才能启动 NetBeans。

都失败了......

同样,如果我使用 build.xml 进入 netbeans 项目的目录并手动运行命令,一切都很好......所以 NetBeans。这是怎么回事?

4

1 回答 1

4

修改后的答案

假设:NetBeans 版本 6.9.1(尽管可能适用于大多数或所有 6.x 版本),使用替代构建系统(例如,Maven)...使用默认值 (Ant)。

默认情况下,NetBeans 使用Ant作为其构建系统来执行诸如编译项目、构建项目、从项目中清除构建文件等操作。Ant 有两个适用于此的概念:目标和任务。在Ant 的词汇中,目标只是一个“命令”或一系列需要为特定工作完成的工作。在 NetBeans 中,常见的目标是“编译”、“构建”、“清理和构建”等。目标完成的“作业”是(除其他外)Ant任务。在 NetBeans 中,一项任务(与回答这个问题特别相关)是Javac Task。这是 Ant 用来将文件编译.java.class文件的任务。

基于 Ant 的项目,因此也是 NetBeans 项目,使用该文件build.xml来控制构建过程并告诉 Ant 如何完成目标。在 NetBeans 项目中,build.xml默认情况下位于项目的根目录中。但是,NetBeans 使用用户可扩展build.xml文件。NetBeans 定义的核心目标和任务实际上位于nbprojects/build-impl.xml并导入到build.xml文件的前几行中。理论上,用户可以添加或覆盖其中的内容,而核心 NetBeans 定义的配置在文件build.xml中保持不变。build-impl.xml

如果您查看nbproject/build-impl.xmlNetBeans Java 项目的默认文件,您会发现 Javac 任务被引用了两次。(搜索“ <javac”。)两者都在宏定义中,因此深入到 NetBean 的默认构建配置的复杂性中。如果我们参考Javac 任务文档,我们会发现任务在由全局build.compiler属性、任务compiler指定的属性<javac... />或运行时使用的默认 Java 编译器指定的位置使用编译器,并且因此运行 NetBeans 时使用的那个(因为它是触发 Ant 进程的原因)。由于我们在任何地方都看不到build.compilercompiler属性(默认build-impl.xml),那么我们只能得出正在使用默认值的结论。

所以在这里我们有(或多或少正确的)第一个答案。NetBeans 使用默认情况下用于执行 NetBeans 的 JDK 进行编译。看起来它实际上比那个简单的答案要复杂一些,但它基本上是正确的。如果您查看 Javac Task 的文档,它暗指“实现 CompilerAdapter 接口的类”,这表明 Ant(以及因此 NetBeans)不是直接调用 javac 可执行文件,而是使用编译器类进行编译(总之可能,javac 可执行文件也使用)。请参阅下面的原始答案以确定用于运行 NetBeans 的 JDK。

那么,如果您不想使用用于运行 NetBeans 的默认 JDK 怎么办?这就是“ Java 平台”进来。转到“工具”菜单,然后单击“Java 平台”。您可能在这里只定义了一个平台。(顺便说一句,这实际上是对默认使用 JDK 的最正确答案......一个在 Java 平台管理器中定义的版本。)如果您想针对另一个 Java 版本进行编译(假设您的默认 JDK 是 1.6,但您想针对 1.5 进行编译),那么您可以在系统的某个位置安装备用 JDK,然后在 NetBeans 的 Java 平台管理器中配置平台。(我将把它作为练习留给您查找有关如何添加 Java 平台的文档。对 wiki 的肤浅搜索并没有发现任何明显的东西。在任何案例,这是相当不言自明的。)

在管理器中创建新平台后,您将在“项目”选项卡中右键单击您的项目,单击“属性”,然后单击“库”。在顶部,您将为项目选择适当的 Java 平台。一旦您更改此值并单击“确定”,NetBeans 就会对您的build-impl.xml文件进行一些调整,将其指向要编译的新 JDK。(对于我们当中真正的极客来说,nbproject在进行此更改之前制作目录的副本以及在进行更改后diff针对目录的新内容制作副本是有指导意义nbproject的。)这些更改指示 Javac Ant 任务使用(等效的) javac 指定平台的可执行文件。所以这里我们有最正确的答案:在项目的Java 平台中指定的 javac 可执行文件(由 Ant javac 任务调用),位于项目属性的节点下。

原始答案

NetBeans 使用的 JDK 的路径可以在该netbeans.conf文件中找到。寻找netbeans_jdkhome入口。

您还可以在运行时指定 jdkhome(给出 *NIX 示例):

netbeans --jdkhome /usr/bin/jdk1.6.0_22

netbeans.conf文件位于不同的位置,具体取决于您使用的操作系统。有关查找文件的帮助,请参阅NetBeans wiki 上的NetBeans.conf 常见问题解答。

一些额外的评论......

...您可以在项目属性中指定 -target 选项。在 NetBeans 6.9 中,右键单击该项目,然后选择 Properties。单击编译节点。将您的 -target 添加到Additional Compiler Options

...我在一些地方读到,指定目标并不能保证代码将在版本低于构建它的 JDK 的 JRE 上运行。换句话说,建议似乎是如果您想要 1.5 二进制文件,则使用 1.5 JDK 进行编译。

于 2010-12-05T03:20:05.843 回答