【问题标题】:Ant class path error when programmatically building Netbeans platform application以编程方式构建 Netbeans 平台应用程序时出现 Ant 类路径错误
【发布时间】:2015-02-25 17:47:08
【问题描述】:

我想从另一个 Java 应用程序(应用程序 B)运行 Netbeans 7.3 平台应用程序(我们将其命名为应用程序 A)。为此,我在 B 的代码中调用 Ant 库,如下所示:

Path pathA = ... // where the A's sources are
Path fileBuild = pathA.resolve("build.xml");
Project p = new Project();
p.setUserProperty("ant.file", fileBuild.toFile().getAbsolutePath());
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
p.addReference("ant.projectHelper", helper);
helper.parse(p, buildFile);
p.setDefault("run");
p.executeTarget(p.getDefaultTarget());

不幸的是,我得到的错误是:

C:\Program Files\NetBeans 7.3\harness\suite.xml:184: The following error occurred while executing this line:
C:\Program Files\NetBeans 7.3\harness\common.xml:217: Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK.
It is currently set to "C:\Program Files (x86)\Java\jdk1.7.0_45\jre"
    at org.apache.tools.ant.ProjectHelper.addLocationToBuildException(ProjectHelper.java:568)
    at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:443)
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:306)
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:221)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:435)
    at org.apache.tools.ant.Target.performTasks(Target.java:456)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
...

JAVA_HOME 变量被正确设置为系统路径变量和 netbeans 配置文件,并指向C:\Program Files (x86)\Java\jdk1.7.0_45

问题是,我错过了什么?从 Netbeans 菜单运行应用程序 A 时,一切运行正常,那么我应该在构建文件/ant 设置中附加什么以实现 A 从 B 的代码执行中运行?

提前致谢!


编辑:我设法获得了更精确的错误堆栈,也许这会有所帮助。

Error on test cases execution.
C:\Program Files\NetBeans 7.3\harness\common.xml:217: Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK.
It is currently set to "C:\Program Files (x86)\Java\jdk1.7.0_45\jre"
    at org.apache.tools.ant.taskdefs.compilers.CompilerAdapterFactory.getCompiler(CompilerAdapterFactory.java:130)
    at org.apache.tools.ant.taskdefs.Javac.findSupportedFileExtensions(Javac.java:984)
    at org.apache.tools.ant.taskdefs.Javac.scanDir(Javac.java:961)
    at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:932)
    at org.netbeans.nbbuild.CustomJavac.execute(CustomJavac.java:105)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:435)
    at org.apache.tools.ant.Target.performTasks(Target.java:456)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
    at odoetest.server.ServerInvokerAnt.start(ServerInvokerAnt.java:48)
    at odoetest.EntryPoint.invokeTests(EntryPoint.java:58)
    at odoetest.EntryPoint.main(EntryPoint.java:38)

Edit-2:我没有任何单独的 ant 安装,而是使用 Netbeans 提供的 ant。当我运行ant -diagnostics 时,我得到了这个info。当我从命令行调用构建或运行作业时,例如

ant -f /path/to/build.xml run

没有错误被抛出,程序启动。我只是不能从上面的 java 代码中做完全相同的事情。

【问题讨论】:

    标签: java netbeans ant netbeans-7 netbeans-platform


    【解决方案1】:

    您的 Ant build.xml 仍然指的是 JRE 而不是 JDK。

    右键单击您的项目,选择Libraries,检查Java Platform 是否指向JDK 而不是JRE。详情请见here

    如果失败:

    您可以显式设置Project p 的属性 如上面的manouti's answer。这将确保Project pProject A 指的是JDK 而不是JRE。 AFAIK,无需分叉。

    您可以在 .properties 文件中设置属性,但调试是否为每个项目实现这一点并不总是那么容易。

    您可以使用 <classpath> 元素在目标的类路径中显式包含文件夹/文件 - 请参阅 Apache Ant Manual 了解一些不太清楚的文档。

    这将是:

    <classpath>
      <pathelement path="${path.to.jdk}"/>
    </classpath>
    

    另见this answer

    【讨论】:

    • 你能再解释一下吗? :-) 不幸的是,我不是 ant 专家...我没有安装任何其他 java 发行版,我附上了 ant 诊断的输出。刺似乎没问题。右键单击构建文件是什么意思?在 Netbeans 中,我没有任何“运行方式”操作可以在右键单击时执行。
    【解决方案2】:

    NetBeans 已设置在内部使用哪个 java。它是netbeans.conf 文件的一部分。您可以为每个可能不同的 NetBeans 项目设置 Java 版本。

    但是你的JAVA_HOME指向一个JRE而不是JDK。这就是为什么它找不到编译器 - javac

    【讨论】:

    • netbeans.conf中的设置是正确的,指向jdk目录。但是,似乎在执行运行目标时,jre 不知从何处附加到 JAVA_HOME。
    • 不一样。将变量 JAVA_HOME 打印到控制台。它说什么?
    • 它是C:\Program Files (x86)\Java\jdk1.7.0_45。但我认为这无关紧要,因为在构建 Netbeans RCP 应用程序时,JAVA_HOME 在 netbeans.conf 中取值,而忽略了系统变量。我也更新了问题。
    • 你确定吗? /jre 为什么会出现是没有意义的。
    • 是的,我确定。如果解决方案如此明显,我不会提出这个问题。我的猜测是 Netbeans 修改了其构建文件中的路径,我只是找不到该位置。也许一些解决方法是静默内置的开发人员。我倾向于这样做,因为错误是在 nb 的线束 common.xml 中引发的。此外,从 Netbeans 成功运行应用程序这一事实已经足以证明 JAVA_HOME 的有效性。
    【解决方案3】:

    调用 Ant javac 任务时发生错误。尝试找到对该任务的调用(它应该在错误消息中显示的行中的common.xml 中),并尝试将fork="yes" 添加到它,以便它在外部进程中运行JDK 编译器。见http://ant.apache.org/manual/Tasks/javac.html

    <javac fork="yes" ...
    

    还可以尝试在项目调用中添加以下属性:

    Project p = new Project();
    p.setUserProperty("ant.file", fileBuild.toFile().getAbsolutePath());
    p.setProperty("java.home", "C:\\Program Files (x86)\\Java\\jdk1.7.0_45");
    

    【讨论】:

    • 不幸的是,这没有帮助。分叉会破坏 netbeans,因此无法启动构建/运行作业(无论如何我也不想调整 nb 安装文件),并且根本不使用 java.home 属性。相反,蚂蚁抓住了System.getProperty("java.home")
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2014-07-15
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多