diff --git a/WHATSNEW b/WHATSNEW index 125def983..6a7416328 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -57,6 +57,9 @@ Other changes: * rmic has been removed from Java 15. The task will now throw an exception if you try to use it while running Java 15 or newer. + * a new property ant.tmpdir provides improved control over the + location Ant uses to create temporary files + Changes from Ant 1.10.6 TO Ant 1.10.7 ===================================== diff --git a/manual/Tasks/cab.html b/manual/Tasks/cab.html index 24f8af67c..a773b04e4 100644 --- a/manual/Tasks/cab.html +++ b/manual/Tasks/cab.html @@ -39,6 +39,10 @@ how the inclusion/exclusion of files works, and how to write patterns.
attributes of<fileset>
(dir becomes basedir) as well as
the nested <include>
, <exclude>
and <patternset>
elements.
+
+On non-Unix platforms this task writes the list of files to archive + to the temporary directory.
+timediffauto | set to trueto make Ant calculate the time difference between client and server. requires write access in the remote directory Since Ant - 1.6 |
+ 1.6No |
all | No; default is no |
Attribute | diff --git a/manual/running.html b/manual/running.html index c1b031f81..ab48f95ac 100644 --- a/manual/running.html +++ b/manual/running.html @@ -460,6 +460,22 @@ And I filtered out theant.tstamp.now.iso |
ISO-8601 timestamp string like 1972-04-17T08:07:00Z |
---|---|---|
java.io.tmpdir |
+ Some tasks need to create temporary files and will write them to
+ the directory specified by this property. This property is set by
+ the Java VM but can be overridden when Ant is started. + See also Temporary Directories. |
+
ant.tmpdir
java.io.tmpdir
if it has been
+ set. Unlike java.io.tmpdir
this property can be set
+ from within the build file.
@@ -477,6 +493,37 @@ return code of the java
program. So a successful build
returns 0
, failed builds return other values.
java.io.tmpdir
. The default value of it depends
+on the platform and the JVM implementation.
+
+Setting a system property when invoking Ant is not straight forward
+ as the corresponding command line arguments must be sent to the Java
+ executable rather than Ant's main class. When using
+ the ant(.cmd)
wrapper scripts you can do so with the
+ help of the ANT_OPTS
environment variable.
Starting with Ant 1.10.8 we've introduced a new Ant
+ property ant.tmpdir
that takes precedence
+ over java.io.tmpdir
when set. As this is a normal Ant
+ property it can be set via the command line or even from within a
+ build file.
Tasks and types using the temporary directory will state the fact + inside of their respective manual page. In addition every execution + of an external command on OpenVMS will create a temporary file + holding a DCL script that invokes the actual command.
+ +Tasks not provided with the Ant distribution will ignore
+ the ant.tmpdir
property and
+ use java.io.tmpdir
unless they have been adapted to the
+ changed API of Ant 1.10.8.
Unix launch script that come with Ant works correctly with Cygwin. You
@@ -489,7 +536,6 @@ task, executable names such as /bin/sh
will not work, even
though these work from the Cygwin shell from which Ant was
launched. You can use an executable name such as sh
and rely on
that command being available in the Windows path.
-
diff --git a/src/main/org/apache/tools/ant/MagicNames.java b/src/main/org/apache/tools/ant/MagicNames.java
index 6e7fc702c..29bbaeef6 100644
--- a/src/main/org/apache/tools/ant/MagicNames.java
+++ b/src/main/org/apache/tools/ant/MagicNames.java
@@ -322,5 +322,13 @@ public final class MagicNames {
*/
public static final String TSTAMP_NOW_ISO = "ant.tstamp.now.iso";
+ /**
+ * Magic property that can be set to override the java.io.tmpdir
+ * system property as the location for Ant's default temporary
+ * directory.
+ * Value: {@value}
+ * @since Ant 1.10.8
+ */
+ public static final String TMPDIR = "ant.tmpdir";
}
diff --git a/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java b/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
index 405234038..cff7ed820 100644
--- a/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
+++ b/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
@@ -354,7 +354,7 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
fcv = new Vector<>(1);
fcv.add(fc);
}
- File tmpFile = FILE_UTILS.createTempFile("fixcrlf", "", null, true, true);
+ File tmpFile = FILE_UTILS.createTempFile(getProject(), "fixcrlf", "", null, true, true);
try {
FILE_UTILS.copyFile(srcFile, tmpFile, null, fcv, true, false,
encoding, outputEncoding == null ? encoding : outputEncoding,
diff --git a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
index bca0e0bdc..d768088e8 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
@@ -1868,7 +1868,7 @@ public class Javadoc extends Task {
*/
BufferedWriter srcListWriter = null;
if (useExternalFile) {
- tmpList = FILE_UTILS.createTempFile("javadoc", "", null, true, true);
+ tmpList = FILE_UTILS.createTempFile(getProject(), "javadoc", "", null, true, true);
toExecute.createArgument()
.setValue("@" + tmpList.getAbsolutePath());
wr = new FileWriter(tmpList.getAbsolutePath(), true);
@@ -2049,7 +2049,7 @@ public class Javadoc extends Task {
File optionsTmpFile = null;
try {
optionsTmpFile = FILE_UTILS.createTempFile(
- "javadocOptions", "", null, true, true);
+ getProject(), "javadocOptions", "", null, true, true);
final String[] listOpt = toExecute.getArguments();
toExecute.clearArgs();
toExecute.createArgument().setValue(
diff --git a/src/main/org/apache/tools/ant/taskdefs/Jikes.java b/src/main/org/apache/tools/ant/taskdefs/Jikes.java
index 7453933ef..f428a4de5 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Jikes.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Jikes.java
@@ -81,7 +81,7 @@ public class Jikes {
// Windows has a 32k limit on total arg size, so
// create a temporary file to store all the arguments
if (Os.isFamily(Os.FAMILY_WINDOWS) && args.length > MAX_FILES_ON_COMMAND_LINE) {
- tmpFile = FileUtils.getFileUtils().createTempFile("jikes",
+ tmpFile = FileUtils.getFileUtils().createTempFile(project, "jikes",
"tmp", null, false, true);
try (BufferedWriter out = new BufferedWriter(new FileWriter(tmpFile))) {
for (String arg : args) {
diff --git a/src/main/org/apache/tools/ant/taskdefs/Replace.java b/src/main/org/apache/tools/ant/taskdefs/Replace.java
index 05d4767a8..66cdef43b 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Replace.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Replace.java
@@ -649,7 +649,7 @@ public class Replace extends MatchingTask {
logFilterChain(src.getPath());
try {
- File temp = FILE_UTILS.createTempFile("rep", ".tmp",
+ File temp = FILE_UTILS.createTempFile(getProject(), "rep", ".tmp",
src.getParentFile(), false, true);
try {
try (FileInput in = new FileInput(src);
diff --git a/src/main/org/apache/tools/ant/taskdefs/TempFile.java b/src/main/org/apache/tools/ant/taskdefs/TempFile.java
index f0e1e234a..7a1570f9d 100644
--- a/src/main/org/apache/tools/ant/taskdefs/TempFile.java
+++ b/src/main/org/apache/tools/ant/taskdefs/TempFile.java
@@ -154,7 +154,7 @@ public class TempFile extends Task {
if (destDir == null) {
destDir = getProject().resolveFile(".");
}
- File tfile = FILE_UTILS.createTempFile(prefix, suffix, destDir,
+ File tfile = FILE_UTILS.createTempFile(getProject(), prefix, suffix, destDir,
deleteOnExit, createFile);
getProject().setNewProperty(property, tfile.toString());
}
diff --git a/src/main/org/apache/tools/ant/taskdefs/Zip.java b/src/main/org/apache/tools/ant/taskdefs/Zip.java
index b545cb83e..9efae6d4d 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Zip.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Zip.java
@@ -800,7 +800,7 @@ public class Zip extends MatchingTask {
/** rename the zip file. */
private File renameFile() {
final File renamedFile = FILE_UTILS.createTempFile(
- "zip", ".tmp", zipFile.getParentFile(), true, false);
+ getProject(), "zip", ".tmp", zipFile.getParentFile(), true, false);
try {
FILE_UTILS.rename(zipFile, renamedFile);
} catch (final SecurityException | IOException e) {
diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
index ec2d9d886..7b37a5845 100644
--- a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
@@ -545,7 +545,7 @@ public abstract class DefaultCompilerAdapter
&& firstFileName >= 0) {
try {
tmpFile = FILE_UTILS.createTempFile(
- "files", "", getJavac().getTempdir(), true, true);
+ getProject(), "files", "", getJavac().getTempdir(), true, true);
try (BufferedWriter out =
new BufferedWriter(new FileWriter(tmpFile))) {
for (int i = firstFileName; i < args.length; i++) {
diff --git a/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagDiff.java b/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagDiff.java
index 56b8e8c40..e01dd6e53 100644
--- a/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagDiff.java
+++ b/src/main/org/apache/tools/ant/taskdefs/cvslib/CvsTagDiff.java
@@ -260,7 +260,7 @@ public class CvsTagDiff extends AbstractCvsTask {
try {
handlePackageNames();
- tmpFile = FILE_UTILS.createTempFile("cvstagdiff", ".log", null,
+ tmpFile = FILE_UTILS.createTempFile(getProject(), "cvstagdiff", ".log", null,
true, true);
setOutput(tmpFile);
diff --git a/src/main/org/apache/tools/ant/taskdefs/launcher/VmsCommandLauncher.java b/src/main/org/apache/tools/ant/taskdefs/launcher/VmsCommandLauncher.java
index 6d9306716..be5c44da1 100644
--- a/src/main/org/apache/tools/ant/taskdefs/launcher/VmsCommandLauncher.java
+++ b/src/main/org/apache/tools/ant/taskdefs/launcher/VmsCommandLauncher.java
@@ -48,7 +48,7 @@ public class VmsCommandLauncher extends Java13CommandLauncher {
@Override
public Process exec(Project project, String[] cmd, String[] env)
throws IOException {
- File cmdFile = createCommandFile(cmd, env);
+ File cmdFile = createCommandFile(project, cmd, env);
Process p =
super.exec(project, new String[] {cmdFile.getPath()}, env);
deleteAfter(cmdFile, p);
@@ -76,7 +76,7 @@ public class VmsCommandLauncher extends Java13CommandLauncher {
@Override
public Process exec(Project project, String[] cmd, String[] env,
File workingDir) throws IOException {
- File cmdFile = createCommandFile(cmd, env);
+ File cmdFile = createCommandFile(project, cmd, env);
Process p = super.exec(project, new String[] {cmdFile.getPath()}, env,
workingDir);
deleteAfter(cmdFile, p);
@@ -91,9 +91,9 @@ public class VmsCommandLauncher extends Java13CommandLauncher {
* @return the command File.
* @throws IOException if errors are encountered creating the file.
*/
- private File createCommandFile(String[] cmd, String[] env)
+ private File createCommandFile(final Project project, String[] cmd, String[] env)
throws IOException {
- File script = FILE_UTILS.createTempFile("ANT", ".COM", null, true, true);
+ File script = FILE_UTILS.createTempFile(project, "ANT", ".COM", null, true, true);
try (BufferedWriter out = new BufferedWriter(new FileWriter(script))) {
// add the environment as logicals to the DCL script
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
index bddbdb4fb..7be3b2874 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
@@ -173,7 +173,7 @@ public class Cab extends MatchingTask {
*/
protected File createListFile(Vector
- * The filename is prefixNNNNNsuffix where NNNN is a random number. - *
* - * @param prefix - * prefix before the random number. + * @param prefix file name prefix. * @param suffix * file extension; include the '.'. * @param parentDir * Directory to create the temporary file in; java.io.tmpdir used * if not specified. * - * @deprecated since ant 1.7.1 use createTempFile(String, String, File, + * @deprecated since ant 1.7.1 use createTempFile(Project, String, String, File, * boolean, boolean) instead. * @return a File reference to the new, nonexistent temporary file. */ @@ -912,8 +909,6 @@ public class FileUtils { return createTempFile(prefix, suffix, parentDir, false, false); } - private static final String NULL_PLACEHOLDER = "null"; - /** * Create a temporary file in a given directory. * @@ -921,7 +916,7 @@ public class FileUtils { * exist before this method was invoked, any subsequent invocation * of this method will yield a different file name. * - * @param prefix prefix before the random number. + * @param prefix file name prefix. * @param suffix file extension; include the '.'. * @param parentDir Directory to create the temporary file in; * java.io.tmpdir used if not specified. @@ -934,13 +929,52 @@ public class FileUtils { * * @return a File reference to the new temporary file. * @since Ant 1.7.1 + * @deprecated since Ant 1.10.8 use createTempFile(Project, String, String, File, + * boolean, boolean) instead. */ + @Deprecated public File createTempFile(String prefix, String suffix, File parentDir, boolean deleteOnExit, boolean createFile) { + return createTempFile(null, prefix, suffix, parentDir, deleteOnExit, createFile); + } + + private static final String NULL_PLACEHOLDER = "null"; + + /** + * Create a temporary file in a given directory. + * + *The file denoted by the returned abstract pathname did not + * exist before this method was invoked, any subsequent invocation + * of this method will yield a different file name.
+ * + * @param project reference to the current Ant project. + * @param prefix file name prefix. + * @param suffix file extension; include the '.'. + * @param parentDir Directory to create the temporary file in; + * if not specified and {@code project} is not null then the value + * of the property {@code ant.tmpdir} is used if set; + * otherwise {@code java.io.tmpdir} is used. + * @param deleteOnExit whether to set the tempfile for deletion on + * normal VM exit. + * @param createFile true if the file must actually be created. If false + * chances exist that a file with the same name is created in the time + * between invoking this method and the moment the file is actually created. + * If possible set to true. + * + * @return a File reference to the new temporary file. + * @since Ant 1.9.15 + */ + public File createTempFile(final Project project, String prefix, String suffix, + final File parentDir, final boolean deleteOnExit, final boolean createFile) { File result; - String parent = (parentDir == null) - ? System.getProperty("java.io.tmpdir") - : parentDir.getPath(); + final String parent; + if (parentDir != null) { + parent = parentDir.getPath(); + } else if (project != null && project.getProperty(MagicNames.TMPDIR) != null) { + parent = project.getProperty(MagicNames.TMPDIR); + } else { + parent = System.getProperty("java.io.tmpdir"); + } if (prefix == null) { prefix = NULL_PLACEHOLDER; } @@ -980,12 +1014,8 @@ public class FileUtils { * this method was invoked, any subsequent invocation of this method will * yield a different file name. * - *- * The filename is prefixNNNNNsuffix where NNNN is a random number. - *
* - * @param prefix - * prefix before the random number. + * @param prefix file name prefix. * @param suffix * file extension; include the '.'. * @param parentDir @@ -994,7 +1024,7 @@ public class FileUtils { * @param deleteOnExit * whether to set the tempfile for deletion on normal VM exit. * - * @deprecated since ant 1.7.1 use createTempFile(String, String, File, + * @deprecated since ant 1.7.1 use createTempFile(Project, String, String, File, * boolean, boolean) instead. * @return a File reference to the new, nonexistent temporary file. */ diff --git a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java index fe5a02498..899c714a9 100644 --- a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java +++ b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java @@ -542,7 +542,7 @@ public final class JavaEnvUtils { */ public static File createVmsJavaOptionFile(String[] cmds) throws IOException { - File script = FILE_UTILS.createTempFile("ANT", ".JAVA_OPTS", null, false, true); + File script = FILE_UTILS.createTempFile(null, "ANT", ".JAVA_OPTS", null, false, true); try (BufferedWriter out = new BufferedWriter(new FileWriter(script))) { for (String cmd : cmds) { out.write(cmd); diff --git a/src/main/org/apache/tools/ant/util/SymbolicLinkUtils.java b/src/main/org/apache/tools/ant/util/SymbolicLinkUtils.java index 30492aacc..7a5f7ed0a 100644 --- a/src/main/org/apache/tools/ant/util/SymbolicLinkUtils.java +++ b/src/main/org/apache/tools/ant/util/SymbolicLinkUtils.java @@ -22,6 +22,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.taskdefs.Execute; @@ -240,9 +241,9 @@ public class SymbolicLinkUtils { if (task == null || target.getParentFile().canWrite()) { // rename the resource, thus breaking the link: - final File temp = FILE_UTILS.createTempFile("symlink", ".tmp", - target.getParentFile(), false, - false); + final Project project = task == null ? null : task.getProject(); + final File temp = FILE_UTILS.createTempFile(project, "symlink", ".tmp", + target.getParentFile(), false, false); if (FILE_UTILS.isLeadingPath(target, link)) { // link points to a parent directory, renaming the parent diff --git a/src/tests/junit/org/apache/tools/ant/util/FileUtilsTest.java b/src/tests/junit/org/apache/tools/ant/util/FileUtilsTest.java index 5f68b80db..fc584563d 100644 --- a/src/tests/junit/org/apache/tools/ant/util/FileUtilsTest.java +++ b/src/tests/junit/org/apache/tools/ant/util/FileUtilsTest.java @@ -29,6 +29,7 @@ import java.util.Optional; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.MagicTestNames; +import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.condition.Os; import org.junit.Before; import org.junit.Rule; @@ -355,9 +356,14 @@ public class FileUtilsTest { */ @Test public void testCreateTempFile() throws IOException { - // null parent dir - File tmp1 = getFileUtils().createTempFile("pre", ".suf", null, false, true); - String tmploc = System.getProperty("java.io.tmpdir"); + final String tmploc = System.getProperty("java.io.tmpdir"); + final Project projectWithoutTempDir = new Project(); + final Project projectWithTempDir = new Project(); + final File projectTmpDir = folder.newFolder("subdir"); + projectWithTempDir.setProperty("ant.tmpdir", projectTmpDir.getAbsolutePath()); + + // null parent dir, null project + File tmp1 = getFileUtils().createTempFile(null, "pre", ".suf", null, false, true); String name = tmp1.getName(); assertThat("starts with pre", name, startsWith("pre")); assertThat("ends with .suf", name, endsWith(".suf")); @@ -366,9 +372,29 @@ public class FileUtilsTest { tmp1.getAbsolutePath()); tmp1.delete(); + // null parent dir, project without magic property + tmp1 = getFileUtils().createTempFile(projectWithoutTempDir, "pre", ".suf", null, false, true); + name = tmp1.getName(); + assertTrue("starts with pre", name.startsWith("pre")); + assertTrue("ends with .suf", name.endsWith(".suf")); + assertTrue("File was created", tmp1.exists()); + assertEquals((new File(tmploc, tmp1.getName())).getAbsolutePath(), tmp1 + .getAbsolutePath()); + tmp1.delete(); + + // null parent dir, project with magic property + tmp1 = getFileUtils().createTempFile(projectWithTempDir, "pre", ".suf", null, false, true); + name = tmp1.getName(); + assertTrue("starts with pre", name.startsWith("pre")); + assertTrue("ends with .suf", name.endsWith(".suf")); + assertTrue("File was created", tmp1.exists()); + assertEquals((new File(projectTmpDir, tmp1.getName())).getAbsolutePath(), tmp1 + .getAbsolutePath()); + tmp1.delete(); + File dir2 = folder.newFolder("ant-test"); - File tmp2 = getFileUtils().createTempFile("pre", ".suf", dir2, true, true); + File tmp2 = getFileUtils().createTempFile(null, "pre", ".suf", dir2, true, true); String name2 = tmp2.getName(); assertThat("starts with pre", name2, startsWith("pre")); assertThat("ends with .suf", name2, endsWith(".suf")); @@ -377,6 +403,25 @@ public class FileUtilsTest { tmp2.getAbsolutePath()); tmp2.delete(); + tmp2 = getFileUtils().createTempFile(projectWithoutTempDir, "pre", ".suf", dir2, true, true); + name2 = tmp2.getName(); + assertTrue("starts with pre", name2.startsWith("pre")); + assertTrue("ends with .suf", name2.endsWith(".suf")); + assertTrue("File was created", tmp2.exists()); + assertEquals((new File(dir2, tmp2.getName())).getAbsolutePath(), tmp2 + .getAbsolutePath()); + tmp2.delete(); + + tmp2 = getFileUtils().createTempFile(projectWithTempDir, "pre", ".suf", dir2, true, true); + name2 = tmp2.getName(); + assertTrue("starts with pre", name2.startsWith("pre")); + assertTrue("ends with .suf", name2.endsWith(".suf")); + assertTrue("File was created", tmp2.exists()); + assertEquals((new File(dir2, tmp2.getName())).getAbsolutePath(), tmp2 + .getAbsolutePath()); + tmp2.delete(); + dir2.delete(); + File parent = new File((new File("/tmp")).getAbsolutePath()); tmp1 = getFileUtils().createTempFile("pre", ".suf", parent, false); assertFalse("new file", tmp1.exists()); @@ -388,13 +433,8 @@ public class FileUtilsTest { .getParent()); tmp2 = getFileUtils().createTempFile("pre", ".suf", parent, false); - assertNotEquals("files are different", tmp1.getAbsolutePath(), tmp2.getAbsolutePath()); - - // null parent dir - File tmp3 = getFileUtils().createTempFile("pre", ".suf", null, false); - tmploc = System.getProperty("java.io.tmpdir"); - assertEquals((new File(tmploc, tmp3.getName())).getAbsolutePath(), - tmp3.getAbsolutePath()); + assertTrue("files are different", !tmp1.getAbsolutePath().equals( + tmp2.getAbsolutePath())); } /**