以编程方式构建Netbeans平台应用程序时Ant类路径错误

时间:2015-02-19 16:53:19

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

我想从另一个Java应用程序(应用程序B)运行Netbeans 7.3平台应用程序(让我们将其命名为app 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)

编辑-2:我没有任何单独的ant安装并使用随Netbeans提供的ant。当我运行ant -diagnostics时,我得到info。当我从命令行调用构建或运行作业时,如

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

没有错误被抛出,程序启动。我不能从上面的java代码做同样的事情。

3 个答案:

答案 0 :(得分:5)

您的Ant build.xml仍将引用JRE而不是JDK。

右键单击您的项目,选择Libraries,检查Java Platform是否指向JDK而不是JRE。有关详细信息,请参阅here

如果失败:

您可以明确设置Project p的属性 如上面manouti's answer所述。这将确保Project p以及Project A将引用JDK而不是JRE。 AFAIK,无需分叉。

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

您可以使用<classpath>元素在目标的类路径中明确包含文件夹/文件 - 有关一些不太清晰的文档,请参阅Apache Ant Manual

这将是:

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

另见this answer

答案 1 :(得分:1)

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

然而您的JAVA_HOME指向JRE而不是JDK。这就是它无法找到编译器的原因 - javac

答案 2 :(得分:0)

调用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");