diff --git a/src/main/java/org/apache/maven/archiver/PomPropertiesUtil.java b/src/main/java/org/apache/maven/archiver/PomPropertiesUtil.java index 1b5b768..3eceef6 100644 --- a/src/main/java/org/apache/maven/archiver/PomPropertiesUtil.java +++ b/src/main/java/org/apache/maven/archiver/PomPropertiesUtil.java @@ -18,22 +18,22 @@ */ package org.apache.maven.archiver; -import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.PrintWriter; -import java.io.StringReader; -import java.io.StringWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.nio.file.Path; +import java.util.Arrays; import java.util.Properties; +import java.util.stream.Collectors; import org.apache.maven.execution.MavenSession; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.archiver.Archiver; +import org.codehaus.plexus.util.io.CachingWriter; /** * This class is responsible for creating the pom.properties file @@ -51,44 +51,25 @@ private Properties loadPropertiesFile(File file) throws IOException { } } - private boolean sameContents(Properties props, File file) throws IOException { - if (!file.isFile()) { - return false; + private void createPropertiesFile(Properties properties, Path outputFile) throws IOException { + Path outputDir = outputFile.getParent(); + if (outputDir != null) { + Files.createDirectories(outputDir); } - - Properties fileProps = loadPropertiesFile(file); - return fileProps.equals(props); - } - - private void createPropertiesFile(Properties properties, File outputFile, boolean forceCreation) - throws IOException { - File outputDir = outputFile.getParentFile(); - if (outputDir != null && !outputDir.isDirectory() && !outputDir.mkdirs()) { - throw new IOException("Failed to create directory: " + outputDir); - } - if (!forceCreation && sameContents(properties, outputFile)) { - return; - } - - try (PrintWriter pw = new PrintWriter(outputFile, "ISO-8859-1"); - StringWriter sw = new StringWriter()) { - - properties.store(sw, null); - - List lines = new ArrayList<>(); - try (BufferedReader r = new BufferedReader(new StringReader(sw.toString()))) { - String line; - while ((line = r.readLine()) != null) { - if (!line.startsWith("#")) { - lines.add(line); - } - } - } - - Collections.sort(lines); - for (String l : lines) { - pw.println(l); - } + // For reproducible builds, sort the properties and drop comments. + // The java.util.Properties class doesn't guarantee order so we have + // to write the file using a Writer. + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + properties.store(baos, null); + // The encoding can be either UTF-8 or ISO-8859-1, as any non ascii character + // is transformed into a \\uxxxx sequence anyway + String output = Arrays.stream( + baos.toString(StandardCharsets.ISO_8859_1.name()).split("\\r?\\n")) + .filter(line -> !line.startsWith("#")) + .sorted() + .collect(Collectors.joining("\n", "", "\n")); + try (Writer writer = new CachingWriter(outputFile, StandardCharsets.ISO_8859_1)) { + writer.write(output); } } @@ -100,7 +81,6 @@ private void createPropertiesFile(Properties properties, File outputFile, boolea * @param archiver {@link org.codehaus.plexus.archiver.Archiver} * @param customPomPropertiesFile optional custom pom properties file * @param pomPropertiesFile The pom properties file. - * @param forceCreation force creation true/false * @throws org.codehaus.plexus.archiver.ArchiverException archiver exception. * @throws java.io.IOException IO exception. * @deprecated please use {@link #createPomProperties(MavenProject, Archiver, File, File, boolean)} @@ -153,7 +133,7 @@ public void createPomProperties( p.setProperty("version", version); - createPropertiesFile(p, pomPropertiesFile, forceCreation); + createPropertiesFile(p, pomPropertiesFile.toPath()); archiver.addFile(pomPropertiesFile, "META-INF/maven/" + groupId + "/" + artifactId + "/pom.properties"); }