[MARTIFACT-14] add buildinfo.reproducible parameter
diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java
index 3de2930..24b0651 100644
--- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java
+++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java
@@ -55,7 +55,7 @@
this.mono = mono;
}
- void printHeader( MavenProject project, MavenProject aggregate )
+ void printHeader( MavenProject project, MavenProject aggregate, boolean reproducible )
{
p.println( "# https://reproducible-builds.org/docs/jvm/" );
p.println( "buildinfo.version=1.0-SNAPSHOT" );
@@ -71,14 +71,27 @@
p.println( "build-tool=mvn" );
//p.println( "# optional build setup url, as plugin parameter" );
p.println();
- p.println( "# effective build environment information" );
- p.println( "java.version=" + System.getProperty( "java.version" ) );
- p.println( "java.vendor=" + System.getProperty( "java.vendor" ) );
- p.println( "os.name=" + System.getProperty( "os.name" ) );
+ if ( reproducible )
+ {
+ p.println( "# build environment information (simplified for reproducibility)" );
+ p.println( "java.version=" + extractJavaMajorVersion( System.getProperty( "java.version" ) ) );
+ String ls = System.getProperty( "line.separator" );
+ p.println( "os.name=" + ( "\n".equals( ls ) ? "Unix" : "Windows" ) );
+ }
+ else
+ {
+ p.println( "# effective build environment information" );
+ p.println( "java.version=" + System.getProperty( "java.version" ) );
+ p.println( "java.vendor=" + System.getProperty( "java.vendor" ) );
+ p.println( "os.name=" + System.getProperty( "os.name" ) );
+ }
p.println();
p.println( "# Maven rebuild instructions and effective environment" );
//p.println( "mvn.rebuild-args=" + rebuildArgs );
- p.println( "mvn.version=" + MavenVersion.createMavenVersionString() );
+ if ( !reproducible )
+ {
+ p.println( "mvn.version=" + MavenVersion.createMavenVersionString() );
+ }
if ( ( project.getPrerequisites() != null ) && ( project.getPrerequisites().getMaven() != null ) )
{
// TODO wrong algorithm, should reuse algorithm written in versions-maven-plugin
@@ -86,7 +99,12 @@
}
if ( toolchain != null )
{
- p.println( "mvn.toolchain.jdk=" + JdkToolchainUtil.getJavaVersion( toolchain ) );
+ String javaVersion = JdkToolchainUtil.getJavaVersion( toolchain );
+ if ( reproducible )
+ {
+ javaVersion = extractJavaMajorVersion( javaVersion );
+ }
+ p.println( "mvn.toolchain.jdk=" + javaVersion );
}
if ( !mono && ( aggregate != null ) )
@@ -98,6 +116,15 @@
p.println( "# " + ( mono ? "" : "aggregated " ) + "output" );
}
+ private static String extractJavaMajorVersion( String javaVersion )
+ {
+ if ( javaVersion.startsWith( "1." ) )
+ {
+ javaVersion = javaVersion.substring( 2 );
+ }
+ return javaVersion.substring( 0, javaVersion.indexOf( '.' ) );
+ }
+
private void printSourceInformation( MavenProject project )
{
boolean sourceAvailable = false;
diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildinfoMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildinfoMojo.java
index e532c22..cb407e0 100644
--- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildinfoMojo.java
+++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildinfoMojo.java
@@ -137,6 +137,13 @@
private boolean detectSkip;
/**
+ * Makes the generated {@code .buildinfo} file reproducible, by dropping detailed environment recording: OS will be
+ * recorded as "Windows" or "Unix", JVM version only as major version.
+ */
+ @Parameter( property = "buildinfo.reproducible", defaultValue = "false" )
+ private boolean reproducible;
+
+ /**
* Used for attaching the buildinfo file in the project.
*/
@Component
@@ -274,7 +281,7 @@
bi.setIgnore( ignore );
bi.setToolchain( getToolchain() );
- bi.printHeader( root, mono ? null : project );
+ bi.printHeader( root, mono ? null : project, reproducible );
// artifact(s) fingerprints
if ( mono )