git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@810060 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -939,6 +939,11 @@ Other changes: | |||||
| * <property> can now specify values as nested text. | * <property> can now specify values as nested text. | ||||
| Bugzilla Report 32917. | Bugzilla Report 32917. | ||||
| * a new parentFirst attribute on <javaresource> allows resources to | |||||
| be loaded from the specified classpath rather than the system | |||||
| classloader. | |||||
| Bugzilla Report 41369. | |||||
| Changes from Ant 1.7.0 TO Ant 1.7.1 | Changes from Ant 1.7.0 TO Ant 1.7.1 | ||||
| ============================================= | ============================================= | ||||
| @@ -149,6 +149,15 @@ implementations are also usable as single-element | |||||
| used to load the resource, constructed from the specified classpath.</td> | used to load the resource, constructed from the specified classpath.</td> | ||||
| <td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
| </tr> | </tr> | ||||
| <tr> | |||||
| <td valign="top">parentFirst</td> | |||||
| <td valign="top">Whether to consult the parent classloader first - | |||||
| the parent classloader most likely is the system classloader - | |||||
| when using a nested classpath. Defaults | |||||
| to <code>true</code>.<br/> | |||||
| <em>Since Ant 1.8.0</em></td> | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| </table> | </table> | ||||
| <p>The classpath can also be specified as nested classpath element, | <p>The classpath can also be specified as nested classpath element, | ||||
| @@ -17,6 +17,7 @@ | |||||
| */ | */ | ||||
| package org.apache.tools.ant.types.resources; | package org.apache.tools.ant.types.resources; | ||||
| import org.apache.tools.ant.AntClassLoader; | |||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.types.Resource; | import org.apache.tools.ant.types.Resource; | ||||
| import org.apache.tools.ant.types.Path; | import org.apache.tools.ant.types.Path; | ||||
| @@ -31,13 +32,14 @@ import java.util.Stack; | |||||
| * | * | ||||
| * A Resource representation of anything that is accessed via a Java classloader. | * A Resource representation of anything that is accessed via a Java classloader. | ||||
| * The core methods to set/resolve the classpath are provided. | * The core methods to set/resolve the classpath are provided. | ||||
| * @since Ant 1.8 | |||||
| * @since Ant 1.8.0 | |||||
| * | * | ||||
| */ | */ | ||||
| public abstract class AbstractClasspathResource extends Resource { | public abstract class AbstractClasspathResource extends Resource { | ||||
| private Path classpath; | private Path classpath; | ||||
| private Reference loader; | private Reference loader; | ||||
| private boolean parentFirst = true; | |||||
| /** | /** | ||||
| * Set the classpath to use when looking up a resource. | * Set the classpath to use when looking up a resource. | ||||
| @@ -116,6 +118,17 @@ public abstract class AbstractClasspathResource extends Resource { | |||||
| loader = r; | loader = r; | ||||
| } | } | ||||
| /** | |||||
| * Whether to consult the parent classloader first. | |||||
| * | |||||
| * <p>Only relevant if a classpath has been specified.</p> | |||||
| * | |||||
| * @since Ant 1.8.0 | |||||
| */ | |||||
| public void setParentFirst(boolean b) { | |||||
| parentFirst = b; | |||||
| } | |||||
| /** | /** | ||||
| * Overrides the super version. | * Overrides the super version. | ||||
| * @param r the Reference to set. | * @param r the Reference to set. | ||||
| @@ -165,7 +178,14 @@ public abstract class AbstractClasspathResource extends Resource { | |||||
| if (cl == null) { | if (cl == null) { | ||||
| if (getClasspath() != null) { | if (getClasspath() != null) { | ||||
| Path p = getClasspath().concatSystemClasspath(); | Path p = getClasspath().concatSystemClasspath(); | ||||
| cl = getProject().createClassLoader(p); | |||||
| if (parentFirst) { | |||||
| cl = getProject().createClassLoader(p); | |||||
| } else { | |||||
| cl = AntClassLoader.newAntClassLoader(getProject() | |||||
| .getCoreLoader(), | |||||
| getProject(), | |||||
| p, false); | |||||
| } | |||||
| } else { | } else { | ||||
| cl = JavaResource.class.getClassLoader(); | cl = JavaResource.class.getClassLoader(); | ||||
| } | } | ||||
| @@ -0,0 +1,62 @@ | |||||
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <!-- | |||||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||||
| contributor license agreements. See the NOTICE file distributed with | |||||
| this work for additional information regarding copyright ownership. | |||||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
| (the "License"); you may not use this file except in compliance with | |||||
| the License. You may obtain a copy of the License at | |||||
| http://www.apache.org/licenses/LICENSE-2.0 | |||||
| Unless required by applicable law or agreed to in writing, software | |||||
| distributed under the License is distributed on an "AS IS" BASIS, | |||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| See the License for the specific language governing permissions and | |||||
| limitations under the License. | |||||
| --> | |||||
| <project default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> | |||||
| <import file="../../antunit-base.xml"/> | |||||
| <target name="setUp"> | |||||
| <mkdir dir="${output}"/> | |||||
| </target> | |||||
| <target name="testUsesSystemClasspath" depends="setUp"> | |||||
| <copy todir="${output}"> | |||||
| <javaresource name="org/apache/tools/ant/antlib.xml"/> | |||||
| </copy> | |||||
| <au:assertFileExists file="${output}/org/apache/tools/ant/antlib.xml"/> | |||||
| </target> | |||||
| <target name="-setUpAntlibXmlInInput" depends="setUp"> | |||||
| <mkdir dir="${input}/org/apache/tools/ant"/> | |||||
| <echo file="${input}/org/apache/tools/ant/antlib.xml">Hello, world!</echo> | |||||
| </target> | |||||
| <target name="testParentFirstIsDefault" depends="-setUpAntlibXmlInInput"> | |||||
| <copy todir="${output}"> | |||||
| <javaresource name="org/apache/tools/ant/antlib.xml"> | |||||
| <classpath location="${input}"/> | |||||
| </javaresource> | |||||
| </copy> | |||||
| <au:assertFileExists file="${output}/org/apache/tools/ant/antlib.xml"/> | |||||
| <au:assertFilesDiffer | |||||
| expected="${input}/org/apache/tools/ant/antlib.xml" | |||||
| actual="${output}/org/apache/tools/ant/antlib.xml"/> | |||||
| </target> | |||||
| <target name="testParentFirstFalse" depends="-setUpAntlibXmlInInput"> | |||||
| <copy todir="${output}"> | |||||
| <javaresource name="org/apache/tools/ant/antlib.xml" | |||||
| parentFirst="false"> | |||||
| <classpath location="${input}"/> | |||||
| </javaresource> | |||||
| </copy> | |||||
| <au:assertFileExists file="${output}/org/apache/tools/ant/antlib.xml"/> | |||||
| <au:assertFilesMatch | |||||
| expected="${input}/org/apache/tools/ant/antlib.xml" | |||||
| actual="${output}/org/apache/tools/ant/antlib.xml"/> | |||||
| </target> | |||||
| </project> | |||||