Netbeans 使用什么 javac?

2024-01-01

我的工作项目需要在JDK1.5下编译和运行,我使用的是Mac。我按照说明进行操作here http://chxor.chxo.com/post/183013153/installing-java-1-5-on-snow-leopard在 Snow Leopard 上恢复 1.5,并且在从 IntelliJ IDEA 构建时工作正常,或者如果我只是在与 build.xml 相同的目录中并尝试“ant CleanRebuild”,当我在 NetBeans 中“运行目标”时,它们会全部用错误的版本编译,导致

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

当 tomcat 尝试启动时。

所以我尝试过的事情

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

一切都没有成功......

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


修改后的答案

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

NetBeans 默认情况下使用Ant http://ant.apache.org/作为它的构建系统,用于执行编译项目、构建项目、从项目中清理构建文件等操作。Ant 有两个适用于此的概念:目标和任务。 Atarget在Ant的词汇中,简单来说就是一个“命令”或者是某项特定工作需要完成的一系列工作。在 NetBeans 中,常见目标有“编译”、“构建”、“清理和构建”等。目标完成的“作业”包括(除其他外)Anttasks。在 NetBeans 中,一项任务(与回答这个问题特别相关)是Javac任务 http://ant.apache.org/manual/Tasks/javac.html。这是Ant用来编译的任务.java文件到.class files.

基于 Ant 的项目(即 NetBeans 项目)使用该文件build.xml控制构建过程并告诉 Ant 如何实现目标。在 NetBeans 项目中,build.xml默认情况下,可以在项目的根目录中找到。然而,NetBeans 使用用户可扩展的build.xml文件。 NetBeans定义的核心目标和任务实际上位于nbprojects/build-impl.xml并导入到build.xml在文件的前几行内。理论上,用户可以添加或覆盖中的内容build.xml而 NetBeans 定义的核心配置在build-impl.xml file.

如果你查看默认的nbproject/build-impl.xml在 NetBeans Java 项目的文件中,您会发现 Javac 任务被引用两次。 (搜索 ”<javac".) 两者都在宏定义中,因此深入 NetBean 的默认构建配置的复杂性。如果我们参考Javac 任务文档 http://ant.apache.org/manual/Tasks/javac.html我们发现任务在全局指定的位置使用编译器build.compiler财产,由compiler指定的属性<javac... />任务,或者是运行时使用的默认 Java 编译器,因此也是运行 NetBeans 时使用的编译器(因为它是启动 Ant 进程的工具)。既然我们看不到build.compiler or the compiler任何地方的属性(默认情况下build-impl.xml),那么我们只能断定正在使用默认值。

所以这里我们有(或多或少正确的)第一个答案。NetBeans 使用默认用于执行 NetBeans 的 JDK 进行编译。看起来实际上比这个简单的答案复杂一点,但本质上是正确的。如果您查看 Javac 任务的文档,它会提到“实现 CompilerAdapter 接口的类”,这表明 Ant(以及 NetBeans)不是直接调用 javac 可执行文件,而是使用编译器类(很可能 javac 可执行文件也使用该编译器类)进行编译。请参阅原答案下面确定用于运行 NetBeans 的 JDK。

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

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

原答案

NetBeans使用的JDK的路径可以在netbeans.conf文件。寻找netbeans_jdkhome entry.

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

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

The netbeans.conf根据您使用的操作系统,可以在不同的位置找到该文件。请参阅NetBeans.conf 常见问题解答 http://wiki.netbeans.org/FaqNetbeansConf在 NetBeans wiki 上获取查找该文件的帮助。

一些补充评论...

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netbeans 使用什么 javac? 的相关文章

随机推荐

  • 多线程环境下静态局部变量初始化

    假设有一个函数 可能是成员函数 SomeType foo static SomeType var generateVar return var How var将被初始化 如果foo会同时从多个线程中 第一次 调用吗 是否保证generate
  • ndk-build eclipse 参数:找不到类

    我们正在为 Android 设备开发一个系统 为此 我们使用 FC16 Eclipse SDK NDK 在 Eclipse 中 运行 gt 外部工具 gt 外部收费配置 gt 我们有以下选项卡 Main Location usr java
  • IntelliJ IDEA 在哪里保存本地历史文件?

    我的公司有一项政策 要求在本地开发人员计算机上将源代码保存在加密存储中 IntelliJ IDEA 在哪里保存用于驱动其的代码更改的副本当地历史特色 http www jetbrains com idea features local hi
  • 构建失败 java.lang.OutOfMemoryError: Java 堆空间

    我在构建 build xml 时遇到这个问题 BUILD FAILED java lang OutOfMemoryError Java heap space at java util Arrays copyOf Arrays java 27
  • 捕获模块加载错误并处理它们

    我正在尝试使用 require js 加载一些内容 如果内容不存在 我想捕获错误并通知用户 在萤火虫中我可以看到两个错误 网络错误 404 未找到 然后几秒钟后 var e new Error msg nhttp requirejs org
  • AbstractRoutingDataSource + JPA 不会创建除 defaultTargetDataSource 之外的表

    我使用 JPA 注释 Hibernate 实现 来初始化我的数据库架构 我关注这篇文章动态数据源路由 http blog springsource com 2007 01 23 dynamic datasource routing 实现动态
  • For 循环中的 onClick 事件

    我尝试创建一个循环for 并通过 onclick 事件递增 但它不起作用 var gameCase 9 itemLists game getElementsByTagName li 9 items for var i 0 i lt item
  • 当默认异常处理建议已被另一个建议处理时,如何忽略它

    我目前有一个 ExceptionAdvice 类 它处理所有基本 400 405 404 和其他 异常 例如 我有一个默认建议 它处理所有 MethodArgumentNotValidExceptions 并返回 400 Bad Reque
  • For循环删除行

    我使用的宏列出了我选择的任何目录中的所有文件名 我正在编写代码 将文件名分解为稍后可以使用的块 文件名列表从单元格 F6 开始并沿列向下延伸 这是我到目前为止编写的代码 Dim ContractNum As String Dim InvNu
  • 客户端机器上的hadoop api配置

    超级菜鸟 我有一台带有 cdh3u1 伪发行版的服务器计算机 以及一台带有使用 cdh3u1 API 的 java 应用程序的客户端计算机 如何配置客户端与服务器通信 我已经搜索了几个小时 但找不到 客户端配置 文件在哪里 对我来说 hdf
  • 如何阻止创建 .mdmp 文件

    我有一个由 Tomcat 托管的 Solr 实例 最近开始创建小型转储文件 任何日志中都没有错误 Solr 继续顺利工作 这些文件大约有 14GB 正在填满硬盘 在我们调查问题时 有没有办法关闭此功能 一般来说 当JVM崩溃时的内容hs e
  • 性能计数器 NextValue() 非常慢(1,000+ 计数器)

    在我们的应用程序中 我们使用 Windows 性能计数器来存储一些应用程序指标 稍后在某些 Web 服务中检索这些指标 我对从计数器读取值所需的时间有疑问 我已经查看了应用程序的其余部分 一切都很好 性能方面 但是从循环内的计数器 从列表或
  • 带 OR 的 LINQ WHERE

    我使用 LINQ 创建 where 子句 如下所示 var query from x in context Xs select x if y query query Where x gt x Y 1 我有一堆 如果 哪里 的陈述 我遇到的问
  • 是否可以使用 cognito 的授权代码授予类型作为 api 网关中的授权者?

    我想知道是否有任何方法或可能性可以在保护API网关时将授权代码授予类型实现为Authroizer 根据搜索结果 最推荐使用 授权代码 授予类型来保护 API 我发现下面的文章解释了使用 cognito 客户端凭据 作为授权类型来保护 api
  • FtpWebRequest 返回错误 550 文件不可用

    我创建了一个小型 Windows 窗体应用程序 用于将文件上传到我们客户的 ftp 站点之一 但我遇到的问题是 当我在本地计算机上运行此应用程序时 它会成功上传文件 但是如果我在我们的服务器上运行这个程序 我会收到此错误消息 远程服务器返回
  • 当赋值的类型可以容纳它时,为什么计算时会发生溢出,具体取决于数据类型

    早些时候我想出了一些东西 我解决了 但后来它让我 让我们看一下我正在做的类似的例子 int b 35000000 35million int a 30000000 unsigned long n 100 a b 输出 4294967260
  • 为什么我不能将 __getattr__ 与 Django 模型一起使用?

    我在网上看到过人们使用的例子 getattr 使用 Django 模型 但每当我尝试时都会出错 姜戈1 2 3 我使用的时候没有任何问题 getattr 在普通物体上 例如 class Post object def getattr sel
  • 使用 R 从 google 驱动器下载文件

    我已经尝试了在谷歌驱动器中读取 csv 文件的建议 我点击文件来获取可共享文件链接 我已经尝试了这 4 种方法 我用 ZZZZ 替换了右键单击文件名时得到的链接 x lt curl https drive google com open i
  • 最小路径 - 所有边至少一次

    我有很多循环的有向图 可能是强连接的 我需要从中得到一个最小的循环 我的意思是我需要得到周期 这是图中最短的周期 并且每条边至少被覆盖一次 我一直在寻找一些算法或一些理论背景 但我唯一找到的是中国邮递员算法 但这个解决方案不适用于有向图 有
  • Netbeans 使用什么 javac?

    我的工作项目需要在JDK1 5下编译和运行 我使用的是Mac 我按照说明进行操作here http chxor chxo com post 183013153 installing java 1 5 on snow leopard在 Sno