Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式构建Netbeans平台应用程序时出现Ant类路径错误_Java_Netbeans_Ant_Netbeans 7_Netbeans Platform - Fatal编程技术网

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

Java 以编程方式构建Netbeans平台应用程序时出现Ant类路径错误,java,netbeans,ant,netbeans-7,netbeans-platform,Java,Netbeans,Ant,Netbeans 7,Netbeans Platform,我想从另一个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().ge

我想从另一个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)

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

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

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

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


但是您的
JAVA\u HOME
指向的是JRE而不是JDK。这就是为什么它找不到编译器-javac

调用Ant
javac
任务时出错的原因。尝试定位对该任务的调用(它应该位于错误消息中显示的行中的
common.xml
),并尝试向其添加
fork=“yes”
,以便它在外部进程中运行JDK编译器。见:


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

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

如果失败:

您可以显式设置
项目p的属性
如上所述。这将确保
projectp
以及
projecta
将引用JDK而不是JRE。好了,不用叉子了

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

您可以使用
元素在目标的类路径上显式地包含文件夹/文件-有关一些不太清楚的文档,请参阅

这将是:

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


另请参见。

netbeans.conf中的设置正确,并指向jdk dir。然而,似乎在执行run目标时,
jre
不知从何而来地被附加到JAVA_HOME中,这是不一样的。将变量JAVA_HOME打印到控制台中。它说了什么?它是
C:\ProgramFiles(x86)\Java\jdk1.7.0\u 45
。但我认为这不相关,因为在构建Netbeans RCP应用程序时,Java\u HOME会在Netbeans.conf中取值,忽略系统变量。我还更新了问题。你确定吗?为什么会出现/jre是没有意义的。是的,我确定。如果解决方案如此显而易见,我不会提出这个问题。我的猜测是Netbeans修改了其构建文件中的路径,我就是找不到这个点。也许可以解决开发人员在静默中内置的一些问题。我倾向于这样做,因为错误是在nb的harnese common.xml中提出的。此外,从Netbeans运行应用程序成功的事实已经足以证明JAVA_HOME的有效性。分叉会损坏netbeans,因此无法启动任何构建/运行作业(我也不想调整nb安装文件),并且根本不使用java.home属性。相反,ant抓住了
System.getProperty(“java.home”)
。您能进一步解释一下吗?:-)不幸的是,我不是蚂蚁专家。。。我没有安装任何其他java发行版,我附加了ant diagnostic的输出。情况似乎很好。右键单击构建文件是什么意思?在Netbeans中,我没有任何“运行方式”操作可以在右键单击时执行。
Project p = new Project();
p.setUserProperty("ant.file", fileBuild.toFile().getAbsolutePath());
p.setProperty("java.home", "C:\\Program Files (x86)\\Java\\jdk1.7.0_45");
<classpath>
  <pathelement path="${path.to.jdk}"/>
</classpath>