Running Ant 1.8.2 on Windows XP, I'm writing a task that returns a string resource collection of target names in a project. Well, attempting to write one.
I'm running into problems when the build file I'm parsing is from a URL instead of a File. The main method that I have looks like this: private Collection<String> getTargetNames() { if (!projectFile.isExists()) { throw new BuildException("Cannot find resource " + projectFile); } Project childProject = project.createSubProject(); childProject.setJavaVersionProperty(); project.copyUserProperties(childProject); childProject.initProperties(); ProjectHelper helper = ProjectHelperRepository.getInstance().getProjectHelperForBuildFile(projectFile); childProject.addReference(ProjectHelper.PROJECTHELPER_REFERENCE, helper); helper.parse(childProject, projectFile); Collection<String> names = childProject.getTargets().keySet(); return names; } The projectFile variable is a URLResource. However, I'm getting a NPE thrown from helper.parse(Project, Object): java.lang.NullPointerException at org.apache.tools.ant.helper.ProjectHelper2$ProjectHandler.onStartElement(ProjectHelper2.java:845) at org.apache.tools.ant.helper.ProjectHelper2$RootHandler.startElement(ProjectHelper2.java:600) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3103) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:307) at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:178) The relevant code in ProjectHelper2 is: // set explicitly before starting ? if (project.getProperty("basedir") != null) { project.setBasedir(project.getProperty("basedir")); } else { // Default for baseDir is the location of the build file. if (baseDir == null) { project.setBasedir(context.getBuildFileParent().getAbsolutePath()); } else { // check whether the user has specified an absolute path if ((new File(baseDir)).isAbsolute()) { project.setBasedir(baseDir); } else { project.setBaseDir(FILE_UTILS.resolveFile(context.getBuildFileParent(), baseDir)); } } } The problem appears to be that build files will have a parent build file, but in this case that's null. Setting the basedir attribute in the build file does fix the problem, and I can use it as a workaround for now. But since I can't always depend on that being set I need to know if is this a Bug or a Feature? If the former I'll submit a bug report. Thanks, Rich