Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package maven-archiver for openSUSE:Factory checked in at 2025-10-09 15:05:30 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/maven-archiver (Old) and /work/SRC/openSUSE:Factory/.maven-archiver.new.11973 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "maven-archiver" Thu Oct 9 15:05:30 2025 rev:11 rq:1309870 version:3.6.5 Changes: -------- --- /work/SRC/openSUSE:Factory/maven-archiver/maven-archiver.changes 2025-08-11 13:54:22.593770274 +0200 +++ /work/SRC/openSUSE:Factory/.maven-archiver.new.11973/maven-archiver.changes 2025-10-09 15:08:09.834827586 +0200 @@ -1,0 +2,20 @@ +Wed Oct 8 23:12:31 UTC 2025 - Fridrich Strba <[email protected]> + +- Upgrade to maven-archiver 3.6.5 + * New features and improvements + + add Java-Version entry to default MANIFEST.MF + * Bug Fixes + + avoid negative entry time: upgrade plexus-archiver + + don't limit outputTimestamp to zip (MS DOS) range + * Documentation updates + + remove extra newline in code blocks + + reformat descriptor description to match usual + Modello-generated ones + + document Java-Version entry added in #298 + * Maintenance + + Update site descriptor to 2.0.0 + * Dependency updates + + Bump org.assertj:assertj-core from 3.27.3 to 3.27.6 + + Bump org.codehaus.plexus:plexus-archiver from 4.10.0 to 4.10.1 + +------------------------------------------------------------------- Old: ---- maven-archiver-3.6.4-source-release.zip New: ---- _scmsync.obsinfo build.specials.obscpio maven-archiver-3.6.5-source-release.zip ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ maven-archiver.spec ++++++ --- /var/tmp/diff_new_pack.5J998W/_old 2025-10-09 15:08:10.290846809 +0200 +++ /var/tmp/diff_new_pack.5J998W/_new 2025-10-09 15:08:10.294846977 +0200 @@ -18,7 +18,7 @@ %bcond_with tests Name: maven-archiver -Version: 3.6.4 +Version: 3.6.5 Release: 0 Summary: Maven Archiver License: Apache-2.0 @@ -33,7 +33,7 @@ BuildRequires: maven-shared-utils BuildRequires: plexus-archiver >= 4.2.0 BuildRequires: plexus-interpolation >= 1.25 -BuildRequires: plexus-utils >= 3.3.0 +BuildRequires: plexus-xml BuildRequires: sisu-plexus BuildRequires: unzip BuildArch: noarch @@ -64,7 +64,8 @@ maven-shared-utils/maven-shared-utils \ org.eclipse.sisu.plexus \ plexus/archiver \ - plexus/interpolation + plexus/interpolation \ + plexus/xml ant jar javadoc ++++++ _scmsync.obsinfo ++++++ mtime: 1759965464 commit: f8c49b01eb8cb04ddede38c6ce2e31f1a043e059850216e72b0149a39bc4afa3 url: https://src.opensuse.org/java-packages/maven-archiver.git revision: f8c49b01eb8cb04ddede38c6ce2e31f1a043e059850216e72b0149a39bc4afa3 projectscmsync: https://src.opensuse.org/java-packages/_ObsPrj ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2025-10-09 01:18:04.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ maven-archiver-3.6.4-source-release.zip -> maven-archiver-3.6.5-source-release.zip ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-archiver-3.6.4/DEPENDENCIES new/maven-archiver-3.6.5/DEPENDENCIES --- old/maven-archiver-3.6.4/DEPENDENCIES 2025-08-07 10:55:20.000000000 +0200 +++ new/maven-archiver-3.6.5/DEPENDENCIES 2025-10-05 14:24:06.000000000 +0200 @@ -14,28 +14,31 @@ - javax.inject (http://code.google.com/p/atinject/) javax.inject:javax.inject:jar:1 License: The Apache Software License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) - - XZ for Java (https://tukaani.org/xz/java.html) org.tukaani:xz:jar:1.9 - License: Public Domain + - XZ for Java (https://tukaani.org/xz/java.html) org.tukaani:xz:jar:1.10 + License: 0BSD From: 'Codehaus Plexus' (https://codehaus-plexus.github.io/) - - Plexus Archiver Component (https://codehaus-plexus.github.io/plexus-archiver/) org.codehaus.plexus:plexus-archiver:jar:4.10.0 - License: Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) + - Plexus Archiver Component (https://codehaus-plexus.github.io/plexus-archiver/) org.codehaus.plexus:plexus-archiver:jar:4.10.2 + License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - Plexus Interpolation API (https://codehaus-plexus.github.io/plexus-pom/plexus-interpolation/) org.codehaus.plexus:plexus-interpolation:bundle:1.28 License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - - Plexus IO Components (https://codehaus-plexus.github.io/plexus-pom/plexus-io/) org.codehaus.plexus:plexus-io:jar:3.5.0 + - Plexus IO Components (https://codehaus-plexus.github.io/plexus-pom/plexus-io/) org.codehaus.plexus:plexus-io:jar:3.5.1 License: Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - Plexus Common Utilities (https://codehaus-plexus.github.io/plexus-utils/) org.codehaus.plexus:plexus-utils:jar:4.0.2 License: Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) + - Plexus XML Utilities (https://codehaus-plexus.github.io/plexus-xml/) org.codehaus.plexus:plexus-xml:jar:3.0.2 + License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) + From: 'com.github.luben' - - zstd-jni (https://github.com/luben/zstd-jni) com.github.luben:zstd-jni:jar:1.5.6-3 + - zstd-jni (https://github.com/luben/zstd-jni) com.github.luben:zstd-jni:jar:1.5.7-4 License: BSD 2-Clause License (https://opensource.org/licenses/BSD-2-Clause) @@ -47,16 +50,16 @@ From: 'The Apache Software Foundation' (https://www.apache.org/) - - Apache Commons Codec (https://commons.apache.org/proper/commons-codec/) commons-codec:commons-codec:jar:1.17.0 + - Apache Commons Codec (https://commons.apache.org/proper/commons-codec/) commons-codec:commons-codec:jar:1.19.0 License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - - Apache Commons IO (https://commons.apache.org/proper/commons-io/) commons-io:commons-io:jar:2.16.1 + - Apache Commons IO (https://commons.apache.org/proper/commons-io/) commons-io:commons-io:jar:2.20.0 License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - - Apache Commons Compress (https://commons.apache.org/proper/commons-compress/) org.apache.commons:commons-compress:jar:1.26.2 + - Apache Commons Compress (https://commons.apache.org/proper/commons-compress/) org.apache.commons:commons-compress:jar:1.28.0 License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) - - Apache Commons Lang (https://commons.apache.org/proper/commons-lang/) org.apache.commons:commons-lang3:jar:3.14.0 + - Apache Commons Lang (https://commons.apache.org/proper/commons-lang/) org.apache.commons:commons-lang3:jar:3.18.0 License: Apache-2.0 (https://www.apache.org/licenses/LICENSE-2.0.txt) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-archiver-3.6.4/pom.xml new/maven-archiver-3.6.5/pom.xml --- old/maven-archiver-3.6.4/pom.xml 2025-08-07 10:55:20.000000000 +0200 +++ new/maven-archiver-3.6.5/pom.xml 2025-10-05 14:24:06.000000000 +0200 @@ -28,7 +28,7 @@ <groupId>org.apache.maven</groupId> <artifactId>maven-archiver</artifactId> - <version>3.6.4</version> + <version>3.6.5</version> <name>Apache Maven Archiver</name> <description>Provides utility methods for creating JARs and other archive files from a Maven project.</description> @@ -36,7 +36,7 @@ <scm> <connection>scm:git:https://github.com/apache/maven-archiver.git</connection> <developerConnection>scm:git:https://github.com/apache/maven-archiver.git</developerConnection> - <tag>maven-archiver-3.6.4</tag> + <tag>maven-archiver-3.6.5</tag> <url>https://github.com/apache/maven-archiver/tree/${project.scm.tag}</url> </scm> <issueManagement> @@ -57,7 +57,7 @@ <properties> <mavenVersion>3.2.5</mavenVersion> <javaVersion>8</javaVersion> - <project.build.outputTimestamp>2025-08-07T10:55:20Z</project.build.outputTimestamp> + <project.build.outputTimestamp>2025-10-05T14:24:05Z</project.build.outputTimestamp> </properties> <dependencies> @@ -76,13 +76,18 @@ <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-archiver</artifactId> - <version>4.10.0</version> + <version>4.10.2</version> </dependency> <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-interpolation</artifactId> <version>1.28</version> </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-xml</artifactId> + <version>3.0.2</version> + </dependency> <!-- Test dependencies --> @@ -99,7 +104,7 @@ <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> - <version>3.27.3</version> + <version>3.27.6</version> <scope>test</scope> </dependency> <dependency> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-archiver-3.6.4/src/main/java/org/apache/maven/archiver/BuildHelper.java new/maven-archiver-3.6.5/src/main/java/org/apache/maven/archiver/BuildHelper.java --- old/maven-archiver-3.6.4/src/main/java/org/apache/maven/archiver/BuildHelper.java 1970-01-01 01:00:00.000000000 +0100 +++ new/maven-archiver-3.6.5/src/main/java/org/apache/maven/archiver/BuildHelper.java 2025-10-05 14:24:06.000000000 +0200 @@ -0,0 +1,133 @@ +/* + * 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. + */ +package org.apache.maven.archiver; + +import java.util.Arrays; +import java.util.Map; + +import org.apache.maven.model.Plugin; +import org.apache.maven.model.PluginContainer; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.util.xml.Xpp3Dom; + +/** + * Helper to detect info about build info in a MavenProject, as configured in plugins. + * + * @since 3.6.5 + */ +public class BuildHelper { + /** + * Tries to determine the target Java release from the following sources (until one is found) + * <ol> + * <li>use {@code release} configuration of {@code org.apache.maven.plugins:maven-compiler-plugin}</li> + * <li>use {@code maven.compiler.release<} property</li> + * <li>use {@code target} configuration of {@code org.apache.maven.plugins:maven-compiler-plugin}</li> + * <li>use {@code maven.compiler.target} property</li> + * </ol> + * + * @param project not null + * @return the Java release version configured in the project, or null if not configured + */ + public static String discoverJavaRelease(MavenProject project) { + Plugin compiler = getCompilerPlugin(project); + + String jdk = getPluginParameter(project, compiler, "release", "maven.compiler.release"); + + if (jdk == null) { + jdk = getPluginParameter(project, compiler, "target", "maven.compiler.target"); + } + + return normalizeJavaVersion(jdk); + } + + /** + * Normalize Java version, for versions 5 to 8 where there is a 1.x alias. + * + * @param jdk can be null + * @return normalized version if an alias was used + */ + public static String normalizeJavaVersion(String jdk) { + if (jdk != null + && jdk.length() == 3 + && Arrays.asList("1.5", "1.6", "1.7", "1.8").contains(jdk)) { + jdk = jdk.substring(2); + } + return jdk; + } + + public static Plugin getCompilerPlugin(MavenProject project) { + return getPlugin(project, "org.apache.maven.plugins:maven-compiler-plugin"); + } + + /** + * Get plugin from project based on coordinates {@code groupId:artifactId}. + * + * @param project not null + * @param pluginGa {@code groupId:artifactId} + * @return the plugin from build or pluginManagement, if available in project + */ + public static Plugin getPlugin(MavenProject project, String pluginGa) { + Plugin plugin = getPlugin(project.getBuild(), pluginGa); + if (plugin == null) { + plugin = getPlugin(project.getPluginManagement(), pluginGa); + } + return plugin; + } + + /** + * Get plugin parameter value if configured in current project. + * + * @param project not null + * @param plugin can be null + * @param parameter the parameter name when configured in plugin's configuration + * @param defaultValueProperty the property name when default value is used for the plugin parameter + * @return the value, or null if not configured at all, but using internal default from plugin. + */ + public static String getPluginParameter( + MavenProject project, Plugin plugin, String parameter, String defaultValueProperty) { + String value = getPluginParameter(plugin, parameter); + if (value == null) { + value = project.getProperties().getProperty(defaultValueProperty); + } + return value; + } + + private static Plugin getPlugin(PluginContainer container, String pluginGa) { + if (container == null) { + return null; + } + Map<String, Plugin> pluginsAsMap = container.getPluginsAsMap(); + return pluginsAsMap.get(pluginGa); + } + + private static String getPluginParameter(Plugin plugin, String parameter) { + if (plugin != null) { + Xpp3Dom pluginConf = (Xpp3Dom) plugin.getConfiguration(); + + if (pluginConf != null) { + Xpp3Dom target = pluginConf.getChild(parameter); + + if (target != null) { + return target.getValue(); + } + } + } + return null; + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-archiver-3.6.4/src/main/java/org/apache/maven/archiver/MavenArchiver.java new/maven-archiver-3.6.5/src/main/java/org/apache/maven/archiver/MavenArchiver.java --- old/maven-archiver-3.6.4/src/main/java/org/apache/maven/archiver/MavenArchiver.java 2025-08-07 10:55:20.000000000 +0200 +++ new/maven-archiver-3.6.5/src/main/java/org/apache/maven/archiver/MavenArchiver.java 2025-10-05 14:24:06.000000000 +0200 @@ -97,10 +97,6 @@ "${artifact.groupIdPath}/${artifact.artifactId}/" + "${artifact.baseVersion}/${artifact.artifactId}-" + "${artifact.baseVersion}${dashClassifier?}.${artifact.extension}"; - private static final Instant DATE_MIN = Instant.parse("1980-01-01T00:00:02Z"); - - private static final Instant DATE_MAX = Instant.parse("2099-12-31T23:59:59Z"); - private static final List<String> ARTIFACT_EXPRESSION_PREFIXES; static { @@ -252,7 +248,7 @@ Manifest m = new Manifest(); if (config.isAddDefaultEntries()) { - handleDefaultEntries(m, entries); + handleDefaultEntries(project, m, entries); } if (config.isAddBuildEnvironmentEntries()) { @@ -607,12 +603,17 @@ archiver.createArchive(); } - private void handleDefaultEntries(Manifest m, Map<String, String> entries) throws ManifestException { + private void handleDefaultEntries(MavenProject project, Manifest m, Map<String, String> entries) + throws ManifestException { String createdBy = this.createdBy; if (createdBy == null) { createdBy = createdBy(CREATED_BY, "org.apache.maven", "maven-archiver"); } addManifestAttribute(m, entries, "Created-By", createdBy); + String javaVersion = BuildHelper.discoverJavaRelease(project); + if (javaVersion != null) { + addManifestAttribute(m, entries, "Java-Version", javaVersion); + } if (buildJdkSpecDefaultEntry) { addManifestAttribute(m, entries, "Build-Jdk-Spec", System.getProperty("java.specification.version")); } @@ -714,8 +715,7 @@ * @return the parsed timestamp, may be <code>null</code> if <code>null</code> input or input contains only 1 * character * @since 3.5.0 - * @throws IllegalArgumentException if the outputTimestamp is neither ISO 8601 nor an integer, or it's not within - * the valid range 1980-01-01T00:00:02Z to 2099-12-31T23:59:59Z + * @throws IllegalArgumentException if the outputTimestamp is neither ISO 8601 nor an integer * @deprecated Use {@link #parseBuildOutputTimestamp(String)} instead. */ @Deprecated @@ -751,10 +751,7 @@ * @return the parsed timestamp as an {@code Optional<Instant>}, {@code empty} if input is {@code null} or input * contains only 1 character (not a number) * @since 3.6.0 - * @throws IllegalArgumentException if the outputTimestamp is neither ISO 8601 nor an integer, or it's not within - * the valid range 1980-01-01T00:00:02Z to 2099-12-31T23:59:59Z as defined by - * <a href="https://pkwaredownloads.blob.core.windows.net/pem/APPNOTE.txt">ZIP application note</a>, - * section 4.4.6. + * @throws IllegalArgumentException if the outputTimestamp is neither ISO 8601 nor an integer. * @see <a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=74682318">Maven Wiki "Reproducible/Verifiable * Builds"</a> */ @@ -772,11 +769,6 @@ // Number representing seconds since the epoch if (isNumeric(outputTimestamp)) { final Instant date = Instant.ofEpochSecond(Long.parseLong(outputTimestamp)); - - if (date.isBefore(DATE_MIN) || date.isAfter(DATE_MAX)) { - throw new IllegalArgumentException( - "'" + date + "' is not within the valid range " + DATE_MIN + " to " + DATE_MAX); - } return Optional.of(date); } @@ -786,11 +778,6 @@ .withOffsetSameInstant(ZoneOffset.UTC) .truncatedTo(ChronoUnit.SECONDS) .toInstant(); - - if (date.isBefore(DATE_MIN) || date.isAfter(DATE_MAX)) { - throw new IllegalArgumentException( - "'" + date + "' is not within the valid range " + DATE_MIN + " to " + DATE_MAX); - } return Optional.of(date); } catch (DateTimeParseException pe) { throw new IllegalArgumentException( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-archiver-3.6.4/src/site/site.xml new/maven-archiver-3.6.5/src/site/site.xml --- old/maven-archiver-3.6.4/src/site/site.xml 2025-08-07 10:55:20.000000000 +0200 +++ new/maven-archiver-3.6.5/src/site/site.xml 2025-10-05 14:24:06.000000000 +0200 @@ -19,13 +19,8 @@ under the License. --> -<project xmlns="http://maven.apache.org/DECORATION/1.8.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/DECORATION/1.8.0 https://maven.apache.org/xsd/decoration-1.8.0.xsd"> - <skin> - <groupId>org.apache.maven.skins</groupId> - <artifactId>maven-fluido-skin</artifactId> - <version>1.9</version> - </skin> +<site xmlns="http://maven.apache.org/SITE/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/SITE/2.0.0 https://maven.apache.org/xsd/site-2.0.0.xsd"> <body> <menu name="Overview"> <item name="Introduction" href="index.html"/> @@ -45,4 +40,4 @@ <item name="Use Your Own Manifest File" href="examples/manifestFile.html"/> </menu> </body> -</project> +</site> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-archiver-3.6.4/src/site/xdoc/index.xml.vm new/maven-archiver-3.6.5/src/site/xdoc/index.xml.vm --- old/maven-archiver-3.6.4/src/site/xdoc/index.xml.vm 2025-08-07 10:55:20.000000000 +0200 +++ new/maven-archiver-3.6.5/src/site/xdoc/index.xml.vm 2025-10-05 14:24:06.000000000 +0200 @@ -33,8 +33,7 @@ for that plugin. </p> - <source> -<<a href="#class_archive">archive</a>> + <source><<a href="#class_archive">archive</a>> <addMavenDescriptor/> <compress/> <forced/> @@ -67,48 +66,51 @@ </manifestEntries> <manifestSection/> </manifestSections> -</archive> - </source> +</archive></source> <a name="class_archive"/> <subsection name="archive"> + <p>The <code><archive></code> element is the root of the archiver configuration. + The following table lists all of the possible child elements.</p> <table> <tr> <th>Element</th> - <th>Description</th> <th>Type</th> <th>Since</th> + <th>Description</th> </tr> <tr> - <td>addMavenDescriptor</td> + <td><code>addMavenDescriptor</code></td> + <td><code>boolean</code></td> + <td></td> <td> Whether the created archive will contain these two Maven files: <ul> <li> - The pom file, located in the archive in + The <code>pom.xml</code> file, located in the archive in <code>META-INF/maven/${groupId}/${artifactId}/pom.xml</code> </li> <li> - A <a href="#pom-properties-content">pom.properties</a> file, + A <code><a href="#pom-properties-content">pom.properties</a></code> file, located in the archive in <code>META-INF/maven/${groupId}/${artifactId}/pom.properties</code> </li> </ul> The default value is <code>true</code>. </td> - <td>boolean</td> - <td></td> </tr> <tr> - <td>compress</td> + <td><code>compress</code></td> + <td><code>boolean</code></td> + <td></td> <td> Activate compression for the archive. The default value is <code>true</code>. </td> - <td>boolean</td> - <td></td> </tr> <tr> - <td>forced</td> + <td><code>forced</code></td> + <td><code>boolean</code></td> + <td>2.2</td> <td> Whether recreating the archive is forced (default) or not. Setting this option to <code>false</code>, means that the archiver should compare the @@ -125,11 +127,11 @@ </p> The default value is <code>true</code>. </td> - <td>boolean</td> - <td>2.2</td> </tr> <tr> - <td>index</td> + <td><code>index</code></td> + <td><code>boolean</code></td> + <td></td> <td> <strong>Deprecated:</strong> See <a href="https://bugs.openjdk.org/browse/JDK-8305597">JDK-8305597</a> <p> @@ -140,39 +142,37 @@ The default value is <code>false</code>. </p> </td> - <td>boolean</td> - <td></td> </tr> <tr> - <td>pomPropertiesFile</td> + <td><code>pomPropertiesFile</code></td> + <td><code>File</code></td> + <td>2.3</td> <td> Use this to override the auto created <a href="#pom-properties-content">pom.properties</a> file (only if <code>addMavenDescriptor</code> is set to <code>true</code>) </td> - <td>File</td> - <td>2.3</td> </tr> <tr> - <td>manifestFile</td> - <td>With this you can supply your own manifest file.</td> - <td>File</td> + <td><code>manifestFile</code></td> + <td><code>File</code></td> <td></td> + <td>With this you can supply your own manifest file.</td> </tr> <tr> - <td><a href="#class_manifest">manifest</a></td> + <td><code><a href="#class_manifest">manifest</a></code></td> <td></td> <td></td> <td></td> </tr> <tr> - <td>manifestEntries</td> - <td>A list of key/value pairs to add to the manifest.</td> - <td>Map</td> + <td><code>manifestEntries</code></td> + <td><code>Map</code></td> <td></td> + <td>A list of key/value pairs to add to the manifest.</td> </tr> <tr> - <td><a href="#class_manifestSection">manifestSections</a></td> + <td><code><a href="#class_manifestSection">manifestSections</a></code></td> <td></td> <td></td> <td></td> @@ -183,98 +183,100 @@ <a name="pom-properties-content"/> <subsection name="pom.properties content"> <p> - The auto created <code>pom.properties</code> file will contain the + The auto created <code>META-INF/maven/${groupId}/${artifactId}/pom.properties</code> file will contain the following content: </p> - <source> -artifactId=\${project.artifactId} + <source>artifactId=\${project.artifactId} groupId=\${project.groupId} version=\${project.version}</source> </subsection> <a name="class_manifest"/> <subsection name="manifest"> + <p>The <code><manifest></code> element configures main section of <code>META-INF/MANIFEST.MF</code>. + The following table lists all of the possible child elements.</p> <table> <tr> <th>Element</th> - <th>Description</th> <th>Type</th> <th>Since</th> + <th>Description</th> </tr> <tr> - <td>addClasspath</td> + <td><code>addClasspath</code></td> + <td><code>boolean</code></td> + <td></td> <td> Whether to create a <code>Class-Path</code> manifest entry. The default value is <code>false</code>. </td> - <td>boolean</td> - <td></td> </tr> <tr> - <td>addDefaultEntries</td> + <td><code>addDefaultEntries</code></td> + <td><code>boolean</code></td> + <td>3.4.0</td> <td> If the manifest will contain these entries: - <source> -Created-By: Maven Archiver ${project.version} -Build-Jdk-Spec: ${java.specification.version}</source> - Since 3.5.0, the default value of <code>Created-By</code> entry can be overridden using + <source>Created-By: Maven Archiver ${project.version} +Build-Jdk-Spec: ${java.specification.version} +Java-Version: ${project maven.compiler.release/target}</source> + Since 3.5.0, the default value of <code>Created-By</code> entry can be overridden (usually by plugin code) using <a href="./apidocs/org/apache/maven/archiver/MavenArchiver.html">MavenArchiver.setCreatedBy(...)</a> API.<br /> + Since 3.6.5, <code>Java-Version</code> entry is discovered by + <a href="./apidocs/org/apache/maven/archiver/BuildHelper.html">BuildHelper.discoverJavaRelease(...)</a> API.<br /> The default value is <code>true</code>. </td> - <td>boolean</td> - <td>3.4.0</td> </tr> <tr> - <td>addDefaultImplementationEntries</td> + <td><code>addDefaultImplementationEntries</code></td> + <td><code>boolean</code></td> + <td>2.1 and 2.6</td> <td> If the manifest will contain these entries: - <source> -Implementation-Title: \${project.name} + <source>Implementation-Title: \${project.name} Implementation-Version: \${project.version} Implementation-Vendor: \${project.organization.name}</source> The default value is <code>false</code>. </td> - <td>boolean</td> - <td>2.1 and 2.6</td> </tr> <tr> - <td>addDefaultSpecificationEntries</td> + <td><code>addDefaultSpecificationEntries</code></td> + <td><code>boolean</code></td> + <td>2.1</td> <td> If the manifest will contain these entries: - <source> -Specification-Title: \${project.name} + <source>Specification-Title: \${project.name} Specification-Version: \${project.artifact.selectedVersion.majorVersion}.\${project.artifact.selectedVersion.minorVersion} Specification-Vendor: \${project.organization.name}</source> The default value is <code>false</code>. </td> - <td>boolean</td> - <td>2.1</td> </tr> <tr> - <td>addBuildEnvironmentEntries</td> + <td><code>addBuildEnvironmentEntries</code></td> + <td><code>boolean</code></td> + <td>3.4.0</td> <td> If the manifest will contain these entries: - <source> -Build-Tool: ${maven.build.version} + <source>Build-Tool: ${maven.build.version} Build-Jdk: ${java.version} (${java.vendor}) Build-Os: ${os.name} (${os.version}; (${os.arch})</source> The default value is <code>false</code>. </td> - <td>boolean</td> - <td>3.4.0</td> </tr> <tr> - <td>addExtensions</td> + <td><code>addExtensions</code></td> + <td><code>boolean</code></td> + <td></td> <td> Whether to create an <code>Extension-List</code> manifest entry. The default value is <code>false</code>. </td> - <td>boolean</td> - <td></td> </tr> <tr> - <td>classpathLayoutType</td> + <td><code>classpathLayoutType</code></td> + <td><code>String</code></td> + <td>2.4</td> <td> The type of layout to use when formatting entries in the created <code>Class-Path</code>. Valid values are: <code>simple</code>, @@ -285,21 +287,21 @@ <b>must</b> also set <code>customClasspathLayout</code>. The default value is <code>simple</code>. </td> - <td>String</td> - <td>2.4</td> </tr> <tr> - <td>classpathPrefix</td> + <td><code>classpathPrefix</code></td> + <td><code>String</code></td> + <td></td> <td> A text that will be prefixed to all your <code>Class-Path</code> entries. The default value is <code>""</code>. </td> - <td>String</td> - <td></td> </tr> <tr> - <td>customClasspathLayout</td> + <td><code>customClasspathLayout</code></td> + <td><code>String</code></td> + <td>2.4</td> <td> The layout expression to use when the layout type set in <code>classpathLayoutType</code> has the value <code>custom</code>. @@ -312,55 +314,55 @@ <b>Note:</b> If you specify a layout type of <code>custom</code> you <b>must</b> set this layout expression. </td> - <td>String</td> - <td>2.4</td> </tr> <tr> - <td>mainClass</td> - <td>The <code>Main-Class</code> manifest entry.</td> - <td>String</td> + <td><code>mainClass</code></td> + <td><code>String</code></td> <td></td> + <td>The <code>Main-Class</code> manifest entry.</td> </tr> <tr> - <td>packageName</td> - <td>Package manifest entry.</td> - <td>String</td> + <td><code>packageName</code></td> + <td><code>String</code></td> <td></td> + <td>Package manifest entry.</td> </tr> <tr> - <td>useUniqueVersions</td> + <td><code>useUniqueVersions</code></td> + <td><code>boolean</code></td> + <td>2.4</td> <td> Whether to use unique timestamp Snapshot versions rather than -SNAPSHOT versions. The default value is <code>true</code>. </td> - <td>boolean</td> - <td>2.4</td> </tr> </table> </subsection> <a name="class_manifestSection"/> <subsection name="manifestSection"> + <p>The <code><manifestSection></code> element configures sections of <code>META-INF/MANIFEST.MF</code>. + The following table lists all of the possible child elements.</p> <table> <tr> <th>Element</th> - <th>Description</th> <th>Type</th> <th>Since</th> + <th>Description</th> </tr> <tr> - <td>name</td> + <td><code>name</code></td> + <td><code>String</code></td> + <td></td> <td> The name of the section. </td> - <td>String</td> - <td></td> </tr> <tr> - <td>manifestEntries</td> - <td>A list of key/value pairs to add to the manifest.</td> - <td>Map</td> + <td><code>manifestEntries</code></td> + <td><code>Map</code></td> <td></td> + <td>A list of key/value pairs to add to the manifest.</td> </tr> </table> </subsection> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/maven-archiver-3.6.4/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java new/maven-archiver-3.6.5/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java --- old/maven-archiver-3.6.4/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java 2025-08-07 10:55:20.000000000 +0200 +++ new/maven-archiver-3.6.5/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java 2025-10-05 14:24:06.000000000 +0200 @@ -44,6 +44,7 @@ import java.util.jar.Manifest; import java.util.stream.Stream; import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.handler.ArtifactHandler; @@ -1426,26 +1427,6 @@ } @ParameterizedTest - @ValueSource( - strings = { - "0", - "1", - "9", - "1980-01-01T00:00:01Z", - "2100-01-01T00:00Z", - "2100-02-28T23:59:59Z", - "2099-12-31T23:59:59-01:00", - "1980-01-01T00:15:35+01:00", - "1980-01-01T10:15:35+14:00" - }) - void testThrownParseOutputTimestampInvalidRange(String outputTimestamp) { - // date is not within the valid range 1980-01-01T00:00:02Z to 2099-12-31T23:59:59Z - assertThatExceptionOfType(IllegalArgumentException.class) - .isThrownBy(() -> parseBuildOutputTimestamp(outputTimestamp)) - .withMessageContaining("is not within the valid range 1980-01-01T00:00:02Z to 2099-12-31T23:59:59Z"); - } - - @ParameterizedTest @CsvSource({ "2011-12-03T10:15:30+01,1322903730", "2019-10-05T20:37:42+02,1570300662", @@ -1456,4 +1437,33 @@ void testShortOffset(String value, long expected) { assertThat(parseBuildOutputTimestamp(value)).contains(Instant.ofEpochSecond(expected)); } + + private long testReproducibleJarEntryTime(String name, String timestamp) throws Exception { + File jarFile = new File("target/test/dummy-" + name + ".jar"); + + MavenArchiver archiver = getMavenArchiver(getCleanJarArchiver(jarFile)); + archiver.configureReproducibleBuild(timestamp); + archiver.createArchive(getDummySession(), getDummyProject(), new MavenArchiveConfiguration()); + + assertThat(jarFile).exists(); + ZipFile zf = new ZipFile(jarFile); + ZipEntry ze = zf.getEntry("META-INF/MANIFEST.MF"); + return ze.getTime(); + } + + /** + * before upgrading plexus archiver to 4.10.2 to benefit from https://github.com/codehaus-plexus/plexus-archiver/pull/388 + * $ zipdetails target/test/dummy-1970.jar + * gives negative Extended Timestamp in Java, that is seen as some point in time in 2106 (zip spec is unsigned) + * 0027 Extra ID #0001 5455 'UT: Extended Timestamp' + * 0029 Length 0005 + * 002B Flags '01 mod' + * 002C Mod Time FFFFF1FA 'Sun Feb 7 06:28:26 2106' + * @throws Exception + */ + @Test + void testReproducibleJar19700101() throws Exception { + long entryTime = testReproducibleJarEntryTime("1970", "10"); + assertThat(entryTime).isGreaterThanOrEqualTo(0); + } } ++++++ maven-archiver-build.xml ++++++ --- /var/tmp/diff_new_pack.5J998W/_old 2025-10-09 15:08:10.550857769 +0200 +++ /var/tmp/diff_new_pack.5J998W/_new 2025-10-09 15:08:10.554857937 +0200 @@ -10,7 +10,7 @@ <property name="project.groupId" value="org.apache.maven"/> <property name="project.artifactId" value="maven-archiver"/> - <property name="project.version" value="3.6.4"/> + <property name="project.version" value="3.6.5"/> <property name="project.name" value="Apache Maven Archiver"/> <property name="project.organization.name" value="The Apache Software Foundation"/>
