macos - Netbeans使用什么javac?

标签 macos jdk1.6 netbeans-6.9 jdk1.5

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


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


tomcat尝试启动时。

所以我尝试过的事情


在项目属性/库下将“ Java Platform”设置为1.5。
在项目属性/源下,将源/二进制格式设置为JDK 5。
将蚂蚁家指向我在偏好/蚂蚁下使用的蚂蚁
重命名我可以找到的每个Javac可执行文件,希望它们能编译NetBeans,并且我可以弄清楚它使用的是哪个(不走运)
将1.5设置为默认值,导致需要将$ netbeans_jdkhome指向1.6 jdk才能启动NetBeans。


一切都不成功。

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

最佳答案

修改后的答案

假设: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中。从理论上讲,用户可以添加或覆盖build.xml中的内容,而核心NetBeans定义的配置在build-impl.xml文件中保持不变。

如果您查看NetBeans Java项目的默认nbproject/build-impl.xml文件,则会发现两次引用了Javac任务。 (搜索“ <javac”。)两者都在宏定义中,因此深入到NetBean默认构建配置的复杂性内。如果引用Javac Task documentation,则会发现这些任务在全局build.compiler属性,由compiler任务指定的<javac... />属性或默认值Java指定的位置使用编译器。在运行时使用的编译器,因此在运行NetBeans时使用的编译器(因为这会触发Ant进程)。由于在任何地方(默认为build.compiler)都看不到compilerbuild-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 Platform Manager中配置平台。 (我将把它作为练习,让您找到有关如何添加Java平台的文档。对Wiki的肤浅搜索不会发现任何明显的现象。无论如何,这是不言而喻的。)

在管理器中创建新平台后,您将在“项目”选项卡中右键单击您的项目,单击“属性”,然后单击“库”。在顶部,您将为项目选择适当的Java平台。更改此值并单击“确定”后,NetBeans会对build-impl.xml文件进行多项调整,将其指向要针对其进行编译的新JDK。 (这对我们当中真正的极客是有启发性的,在进行更改之前先复制nbproject目录,并在更改后将diffnbproject目录的新内容相对应。) Javac Ant任务,以使用(等于)指定平台的javac可执行文件。因此,这里我们有最正确的答案:NetBeans使用等效于在项目属性的Libraries节点下的项目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 FAQ以获取查找文件的帮助。

其他一些评论...

...您可以在项目属性中指定-target选项。在NetBeans 6.9中,右键单击项目,然后选择“属性”。单击“编译”节点。将-target添加到其他编译器选项。

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

关于macos - Netbeans使用什么javac?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4037265/

相关文章:

macos - 如何在 Mac 上制作 MD5 文件

macos - 在 mac os Eclipse 中解析 android-21 的数据失败 Unsupported major.minor version 51.0

python - 初学者Python书籍教程问题

c - Opencv 给了我一个不清楚的相机捕获

objective-c - 如何使用 NSTableView 的 selectedRowIndexes?

c - 我在哪里可以找到 OS X Mountain Lion 上 C 的头文件?

xcode - 理解 CGPostKeyboardEvent 和 CGEventCreateKeyboardEvent 的区别

java - 在 Windows 7 中重新安装 Jdk1.6?

eclipse - Mac OS X Java 更新 : where is my jdk?

scala - 我可以在netbeans6.9.1中编写scala代码吗?