⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ant.java

📁 Use the links below to download a source distribution of Ant from one of our mirrors. It is good pra
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                    Target other =                        (Target) (getProject().getTargets().get(it.next()));                    circular |= (other != null                                 && other.dependsOn(owningTargetName));                }                if (circular) {                    throw new BuildException(getTaskName()                                             + " task calling a target"                                             + " that depends on"                                             + " its parent target \'"                                             + owningTargetName                                             + "\'.");                }            }            addReferences();            if (locals.size() > 0 && !(locals.size() == 1                                       && "".equals(locals.get(0)))) {                BuildException be = null;                try {                    log("Entering " + antFile + "...", Project.MSG_VERBOSE);                    newProject.fireSubBuildStarted();                    newProject.executeTargets(locals);                } catch (BuildException ex) {                    be = ProjectHelper                        .addLocationToBuildException(ex, getLocation());                    throw be;                } finally {                    log("Exiting " + antFile + ".", Project.MSG_VERBOSE);                    newProject.fireSubBuildFinished(be);                }            }        } finally {            // help the gc            newProject = null;            Enumeration e = properties.elements();            while (e.hasMoreElements()) {                Property p = (Property) e.nextElement();                p.setProject(null);            }            if (output != null && out != null) {                try {                    out.close();                } catch (final Exception ex) {                    //ignore                }            }            dir = savedDir;            antFile = savedAntFile;        }    }    /**     * Override the properties in the new project with the one     * explicitly defined as nested elements here.     * @throws BuildException under unknown circumstances.     */    private void overrideProperties() throws BuildException {        // remove duplicate properties - last property wins        // Needed for backward compatibility        Set set = new HashSet();        for (int i = properties.size() - 1; i >= 0; --i) {            Property p = (Property) properties.get(i);            if (p.getName() != null && !p.getName().equals("")) {                if (set.contains(p.getName())) {                    properties.remove(i);                } else {                    set.add(p.getName());                }            }        }        Enumeration e = properties.elements();        while (e.hasMoreElements()) {            Property p = (Property) e.nextElement();            p.setProject(newProject);            p.execute();        }        getProject().copyInheritedProperties(newProject);    }    /**     * Add the references explicitly defined as nested elements to the     * new project.  Also copy over all references that don't override     * existing references in the new project if inheritrefs has been     * requested.     * @throws BuildException if a reference does not have a refid.     */    private void addReferences() throws BuildException {        Hashtable thisReferences            = (Hashtable) getProject().getReferences().clone();        Hashtable newReferences = newProject.getReferences();        Enumeration e;        if (references.size() > 0) {            for (e = references.elements(); e.hasMoreElements();) {                Reference ref = (Reference) e.nextElement();                String refid = ref.getRefId();                if (refid == null) {                    throw new BuildException("the refid attribute is required"                                             + " for reference elements");                }                if (!thisReferences.containsKey(refid)) {                    log("Parent project doesn't contain any reference '"                        + refid + "'",                        Project.MSG_WARN);                    continue;                }                thisReferences.remove(refid);                String toRefid = ref.getToRefid();                if (toRefid == null) {                    toRefid = refid;                }                copyReference(refid, toRefid);            }        }        // Now add all references that are not defined in the        // subproject, if inheritRefs is true        if (inheritRefs) {            for (e = thisReferences.keys(); e.hasMoreElements();) {                String key = (String) e.nextElement();                if (newReferences.containsKey(key)) {                    continue;                }                copyReference(key, key);                newProject.inheritIDReferences(getProject());            }        }    }    /**     * Try to clone and reconfigure the object referenced by oldkey in     * the parent project and add it to the new project with the key newkey.     *     * <p>If we cannot clone it, copy the referenced object itself and     * keep our fingers crossed.</p>     * @param oldKey the reference id in the current project.     * @param newKey the reference id in the new project.     */    private void copyReference(String oldKey, String newKey) {        Object orig = getProject().getReference(oldKey);        if (orig == null) {            log("No object referenced by " + oldKey + ". Can't copy to "                + newKey,                Project.MSG_WARN);            return;        }        Class c = orig.getClass();        Object copy = orig;        try {            Method cloneM = c.getMethod("clone", new Class[0]);            if (cloneM != null) {                copy = cloneM.invoke(orig, new Object[0]);                log("Adding clone of reference " + oldKey, Project.MSG_DEBUG);            }        } catch (Exception e) {            // not Clonable        }        if (copy instanceof ProjectComponent) {            ((ProjectComponent) copy).setProject(newProject);        } else {            try {                Method setProjectM =                    c.getMethod("setProject", new Class[] {Project.class});                if (setProjectM != null) {                    setProjectM.invoke(copy, new Object[] {newProject});                }            } catch (NoSuchMethodException e) {                // ignore this if the class being referenced does not have                // a set project method.            } catch (Exception e2) {                String msg = "Error setting new project instance for "                    + "reference with id " + oldKey;                throw new BuildException(msg, e2, getLocation());            }        }        newProject.addReference(newKey, copy);    }    /**     * Copies all properties from the given table to the new project -     * omitting those that have already been set in the new project as     * well as properties named basedir or ant.file.     * @param props properties <code>Hashtable</code> to copy to the     * new project.     * @since Ant 1.6     */    private void addAlmostAll(Hashtable props) {        Enumeration e = props.keys();        while (e.hasMoreElements()) {            String key = e.nextElement().toString();            if (MagicNames.PROJECT_BASEDIR.equals(key) || MagicNames.ANT_FILE.equals(key)) {                // basedir and ant.file get special treatment in execute()                continue;            }            String value = props.get(key).toString();            // don't re-set user properties, avoid the warning message            if (newProject.getProperty(key) == null) {                // no user property                newProject.setNewProperty(key, value);            }        }    }    /**     * The directory to use as a base directory for the new Ant project.     * Defaults to the current project's basedir, unless inheritall     * has been set to false, in which case it doesn't have a default     * value. This will override the basedir setting of the called project.     * @param dir new directory as <code>File</code>.     */    public void setDir(File dir) {        this.dir = dir;    }    /**     * The build file to use. Defaults to "build.xml". This file is expected     * to be a filename relative to the dir attribute given.     * @param antFile the <code>String</code> build file name.     */    public void setAntfile(String antFile) {        // @note: it is a string and not a file to handle relative/absolute        // otherwise a relative file will be resolved based on the current        // basedir.        this.antFile = antFile;    }    /**     * The target of the new Ant project to execute.     * Defaults to the new project's default target.     * @param targetToAdd the name of the target to invoke.     */    public void setTarget(String targetToAdd) {        if (targetToAdd.equals("")) {            throw new BuildException("target attribute must not be empty");        }        targets.add(targetToAdd);        targetAttributeSet = true;    }    /**     * Set the filename to write the output to. This is relative to the value     * of the dir attribute if it has been set or to the base directory of the     * current project otherwise.     * @param outputFile the name of the file to which the output should go.     */    public void setOutput(String outputFile) {        this.output = outputFile;    }    /**     * Property to pass to the new project.     * The property is passed as a 'user property'.     * @return the created <code>Property</code> object.     */    public Property createProperty() {        Property p = new Property(true, getProject());        p.setProject(getNewProject());        p.setTaskName("property");        properties.addElement(p);        return p;    }    /**     * Add a Reference element identifying a data type to carry     * over to the new project.     * @param ref <code>Reference</code> to add.     */    public void addReference(Reference ref) {        references.addElement(ref);    }    /**     * Add a target to this Ant invocation.     * @param t the <code>TargetElement</code> to add.     * @since Ant 1.6.3     */    public void addConfiguredTarget(TargetElement t) {        if (targetAttributeSet) {            throw new BuildException(                "nested target is incompatible with the target attribute");        }        String name = t.getName();        if (name.equals("")) {            throw new BuildException("target name must not be empty");        }        targets.add(name);    }    /**     * Add a set of properties to pass to the new project.     *     * @param ps <code>PropertySet</code> to add.     * @since Ant 1.6     */    public void addPropertyset(PropertySet ps) {        propertySets.addElement(ps);    }    /**     * Get the (sub)-Project instance currently in use.     * @return Project     * @since Ant 1.7     */    protected Project getNewProject() {        if (newProject == null) {            reinit();        }        return newProject;    }    /**     * @since Ant 1.6.2     */    private Iterator getBuildListeners() {        return getProject().getBuildListeners().iterator();    }    /**     * Helper class that implements the nested &lt;reference&gt;     * element of &lt;ant&gt; and &lt;antcall&gt;.     */    public static class Reference        extends org.apache.tools.ant.types.Reference {        /** Creates a reference to be configured by Ant. */        public Reference() {                super();        }        private String targetid = null;        /**         * Set the id that this reference to be stored under in the         * new project.         *         * @param targetid the id under which this reference will be passed to         *        the new project. */        public void setToRefid(String targetid) {            this.targetid = targetid;        }        /**         * Get the id under which this reference will be stored in the new         * project.         *         * @return the id of the reference in the new project.         */        public String getToRefid() {            return targetid;        }    }    /**     * Helper class that implements the nested &lt;target&gt;     * element of &lt;ant&gt; and &lt;antcall&gt;.     * @since Ant 1.6.3     */    public static class TargetElement {        private String name;        /**         * Default constructor.         */        public TargetElement() {                //default        }        /**         * Set the name of this TargetElement.         * @param name   the <code>String</code> target name.         */        public void setName(String name) {            this.name = name;        }        /**         * Get the name of this TargetElement.         * @return <code>String</code>.         */        public String getName() {            return name;        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -