You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2020/05/13 01:19:15 UTC

[maven-shade-plugin] branch MSHADE-363 updated (1242255 -> df7c802)

This is an automated email from the ASF dual-hosted git repository.

hboutemy pushed a change to branch MSHADE-363
in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git.


    omit 1242255  [MSHADE-363] IT to check new Reproducible transformer with old plugin
    omit 3d0af77  [MSHADE-363] add ReproducibleResourceTransformer to keep compatibility
     new b623b29  [MSHADE-363] add ReproducibleResourceTransformer to keep compatibility
     new df7c802  [MSHADE-363] IT to check new Reproducible transformer with old plugin

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (1242255)
            \
             N -- N -- N   refs/heads/MSHADE-363 (df7c802)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../shade/resource/ReproducibleResourceTransformer.java    | 14 +++++++++++++-
 .../shade/resource/ReproducibleResourceTransformer.java    | 14 +-------------
 2 files changed, 14 insertions(+), 14 deletions(-)


[maven-shade-plugin] 02/02: [MSHADE-363] IT to check new Reproducible transformer with old plugin

Posted by hb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hboutemy pushed a commit to branch MSHADE-363
in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git

commit df7c8023a9c006599f0a8b67b84d1117aa209ecc
Author: Hervé Boutemy <hb...@apache.org>
AuthorDate: Sun May 3 16:15:33 2020 +0200

    [MSHADE-363] IT to check new Reproducible transformer with old plugin
---
 pom.xml                                            |  3 +
 src/it/projects/MSHADE-363_old-plugin/pom.xml      | 65 ++++++++++++++++++
 .../src/main/resources/Message.properties          | 18 +++++
 .../CustomReproducibleResourceTransformer.java     | 78 ++++++++++++++++++++++
 .../resource/ReproducibleResourceTransformer.java  | 37 ++++++++++
 5 files changed, 201 insertions(+)

diff --git a/pom.xml b/pom.xml
index 4dfbad4..b2e5a68 100644
--- a/pom.xml
+++ b/pom.xml
@@ -288,6 +288,9 @@
               </goals>
               <projectsDirectory>src/it/projects</projectsDirectory>
               <settingsFile>src/it/mrm/settings.xml</settingsFile>
+              <extraArtifacts>
+                <extraArtifact>org.apache.maven.plugins:maven-shade-plugin:${project.version}:test-jar</extraArtifact>
+              </extraArtifacts>
             </configuration>
           </plugin>
           <plugin>
diff --git a/src/it/projects/MSHADE-363_old-plugin/pom.xml b/src/it/projects/MSHADE-363_old-plugin/pom.xml
new file mode 100644
index 0000000..bf78267
--- /dev/null
+++ b/src/it/projects/MSHADE-363_old-plugin/pom.xml
@@ -0,0 +1,65 @@
+<?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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.shade.pp</groupId>
+  <artifactId>mshade-363-use-custom</artifactId>
+  <version>1.0-SNAPSHOT</version>
+
+  <name>check new ReproducibleResourceTransformer API can be used with older shade plugin</name>
+  <description>if new extensions cannot be used with older shade plugin, it will add user-visible constraints...</description>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>3.2.2</version><!-- last version of maven-shade-plugin without the new ReproducibleResourceTransformer interface -->
+        <dependencies>
+          <dependency><!-- tests.jar adds an extra ResourceTransformer released a few years ago, with the missing ReproducibleResourceTransformer interface -->
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-shade-plugin</artifactId>
+            <version>@project.version@</version>
+            <classifier>tests</classifier>
+          </dependency>
+        </dependencies>
+        <executions>
+          <execution>
+            <id>use-extra-resource-transformer</id>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <transformers><!-- use the extra transformer that implements ReproducibleResourceTransformer -->
+                <transformer implementation="org.apache.maven.plugins.shade.custom.CustomReproducibleResourceTransformer" />
+              </transformers>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/src/it/projects/MSHADE-363_old-plugin/src/main/resources/Message.properties b/src/it/projects/MSHADE-363_old-plugin/src/main/resources/Message.properties
new file mode 100644
index 0000000..f94d1d0
--- /dev/null
+++ b/src/it/projects/MSHADE-363_old-plugin/src/main/resources/Message.properties
@@ -0,0 +1,18 @@
+# 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.
+
+one = one
diff --git a/src/test/java/org/apache/maven/plugins/shade/custom/CustomReproducibleResourceTransformer.java b/src/test/java/org/apache/maven/plugins/shade/custom/CustomReproducibleResourceTransformer.java
new file mode 100644
index 0000000..eef5744
--- /dev/null
+++ b/src/test/java/org/apache/maven/plugins/shade/custom/CustomReproducibleResourceTransformer.java
@@ -0,0 +1,78 @@
+package org.apache.maven.plugins.shade.custom;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.jar.JarOutputStream;
+
+import org.apache.maven.plugins.shade.relocation.Relocator;
+import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer;
+
+/**
+ * Custom ReproducibleResourceTransformer for MSHADE-363_old-plugin IT, to check that it can be run with
+ * an older maven-shade-plugin that does not contain the ReproducibleResourceTransformer interface.
+ */
+public class CustomReproducibleResourceTransformer
+    implements ReproducibleResourceTransformer
+{
+    @Override
+    public boolean canTransformResource( final String resource )
+    {
+        return true;
+    }
+
+    /**
+     * old non-reproducible RessourceTransformer API that will be used by maven-shade-plugin up to 3.2.2.
+     */
+    @Override
+    public final void processResource( final String resource, final InputStream is, final List<Relocator> relocators )
+        throws IOException
+    {
+        System.out.println( "Custom ResourceTransformer called through old API" );
+        // call new ReproducibleRessourceTransformer API using a conventional timestamp
+        processResource( resource, is, relocators, 0 );
+    }
+
+    /**
+     * new reproducible API
+     */
+    @Override
+    public void processResource( final String resource, final InputStream is, final List<Relocator> relocators,
+                                 long time )
+        throws IOException
+    {
+        System.out.println( "Custom ResourceTransformer called through new Reprodcible API" );
+    }
+
+    @Override
+    public boolean hasTransformedResource()
+    {
+        return true;
+    }
+
+    @Override
+    public void modifyOutputStream( JarOutputStream os )
+        throws IOException
+    {
+        // do-op for this test
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/org/apache/maven/plugins/shade/resource/ReproducibleResourceTransformer.java b/src/test/java/org/apache/maven/plugins/shade/resource/ReproducibleResourceTransformer.java
new file mode 100644
index 0000000..f6a87f2
--- /dev/null
+++ b/src/test/java/org/apache/maven/plugins/shade/resource/ReproducibleResourceTransformer.java
@@ -0,0 +1,37 @@
+package org.apache.maven.plugins.shade.resource;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.plugins.shade.relocation.Relocator;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+/**
+ * Copy of original interface necessary to MSHADE-363_old-plugin IT.
+ * @since 3.2.4
+ */
+public interface ReproducibleResourceTransformer
+    extends ResourceTransformer
+{
+    void processResource( String resource, InputStream is, List<Relocator> relocators, long time )
+        throws IOException;
+}


[maven-shade-plugin] 01/02: [MSHADE-363] add ReproducibleResourceTransformer to keep compatibility

Posted by hb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hboutemy pushed a commit to branch MSHADE-363
in repository https://gitbox.apache.org/repos/asf/maven-shade-plugin.git

commit b623b290254ffd90369a0298bae1cfc8013373ea
Author: Hervé Boutemy <hb...@apache.org>
AuthorDate: Sun May 3 13:52:21 2020 +0200

    [MSHADE-363] add ReproducibleResourceTransformer to keep compatibility
---
 .../apache/maven/plugins/shade/DefaultShader.java  | 28 ++++++++++++--------
 ....java => AbstractCompatibilityTransformer.java} | 30 ++++++++--------------
 .../resource/ApacheLicenseResourceTransformer.java |  2 +-
 .../resource/ApacheNoticeResourceTransformer.java  |  2 +-
 .../shade/resource/AppendingTransformer.java       |  2 +-
 .../resource/ComponentsXmlResourceTransformer.java |  2 +-
 .../resource/DontIncludeResourceTransformer.java   |  2 +-
 .../shade/resource/GroovyResourceTransformer.java  |  2 +-
 .../shade/resource/IncludeResourceTransformer.java |  2 +-
 .../resource/ManifestResourceTransformer.java      |  2 +-
 .../resource/PluginXmlResourceTransformer.java     |  2 +-
 ...r.java => ReproducibleResourceTransformer.java} | 20 +++++++--------
 .../ResourceBundleAppendingTransformer.java        |  2 +-
 .../shade/resource/ResourceTransformer.java        |  4 +--
 .../resource/ServicesResourceTransformer.java      |  2 +-
 .../shade/resource/XmlAppendingTransformer.java    |  2 +-
 .../resource/properties/PropertiesTransformer.java | 11 ++++++--
 .../shade/resource/rule/TransformerTesterRule.java | 23 +++++++++--------
 18 files changed, 74 insertions(+), 66 deletions(-)

diff --git a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
index f5897c3..4fac59d 100644
--- a/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
+++ b/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java
@@ -49,6 +49,7 @@ import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.shade.filter.Filter;
 import org.apache.maven.plugins.shade.relocation.Relocator;
 import org.apache.maven.plugins.shade.resource.ManifestResourceTransformer;
+import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer;
 import org.apache.maven.plugins.shade.resource.ResourceTransformer;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
@@ -76,7 +77,7 @@ public class DefaultShader
     {
         Set<String> resources = new HashSet<>();
 
-        ResourceTransformer manifestTransformer = null;
+        ManifestResourceTransformer manifestTransformer = null;
         List<ResourceTransformer> transformers =
             new ArrayList<>( shadeRequest.getResourceTransformers() );
         for ( Iterator<ResourceTransformer> it = transformers.iterator(); it.hasNext(); )
@@ -84,7 +85,7 @@ public class DefaultShader
             ResourceTransformer transformer = it.next();
             if ( transformer instanceof ManifestResourceTransformer )
             {
-                manifestTransformer = transformer;
+                manifestTransformer = (ManifestResourceTransformer) transformer;
                 it.remove();
             }
         }
@@ -261,11 +262,11 @@ public class DefaultShader
     }
 
     private void goThroughAllJarEntriesForManifestTransformer( ShadeRequest shadeRequest, Set<String> resources,
-                                                               ResourceTransformer resourceTransformer,
+                                                               ManifestResourceTransformer manifestTransformer,
                                                                JarOutputStream jos )
         throws IOException
     {
-        if ( resourceTransformer != null )
+        if ( manifestTransformer != null )
         {
             for ( File jar : shadeRequest.getJars() )
             {
@@ -275,22 +276,22 @@ public class DefaultShader
                     {
                         JarEntry entry = en.nextElement();
                         String resource = entry.getName();
-                        if ( resourceTransformer.canTransformResource( resource ) )
+                        if ( manifestTransformer.canTransformResource( resource ) )
                         {
                             resources.add( resource );
                             try ( InputStream inputStream = jarFile.getInputStream( entry ) )
                             {
-                                resourceTransformer.processResource( resource, inputStream,
-                                        shadeRequest.getRelocators(), entry.getTime() );
+                                manifestTransformer.processResource( resource, inputStream,
+                                                                     shadeRequest.getRelocators(), entry.getTime() );
                             }
                             break;
                         }
                     }
                 }
             }
-            if ( resourceTransformer.hasTransformedResource() )
+            if ( manifestTransformer.hasTransformedResource() )
             {
-                resourceTransformer.modifyOutputStream( jos );
+                manifestTransformer.modifyOutputStream( jos );
             }
         }
     }
@@ -526,7 +527,14 @@ public class DefaultShader
             {
                 getLogger().debug( "Transforming " + name + " using " + transformer.getClass().getName() );
 
-                transformer.processResource( name, is, relocators, time );
+                if ( transformer instanceof ReproducibleResourceTransformer )
+                {
+                    ( (ReproducibleResourceTransformer) transformer ).processResource( name, is, relocators, time );
+                }
+                else
+                {
+                    transformer.processResource( name, is, relocators );
+                }
 
                 resourceTransformed = true;
 
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/AbstractCompatibilityTransformer.java
similarity index 57%
copy from src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java
copy to src/main/java/org/apache/maven/plugins/shade/resource/AbstractCompatibilityTransformer.java
index bb4400a..392ddb9 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/AbstractCompatibilityTransformer.java
@@ -24,26 +24,16 @@ import org.apache.maven.plugins.shade.relocation.Relocator;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
-import java.util.jar.JarOutputStream;
 
-/** @author Jason van Zyl */
-public interface ResourceTransformer
+/**
+ * An abstract class to implement once the old non-reproducible ResourceTransformer API.
+ */
+abstract class AbstractCompatibilityTransformer
+    implements ReproducibleResourceTransformer
 {
-    boolean canTransformResource( String resource );
-
-    /**
-     * Transform an individual resource
-     * @param resource The resource name
-     * @param is An input stream for the resource, the implementation should *not* close this stream
-     * @param relocators  A list of relocators
-     * @param time the time of the resource to process
-     * @throws IOException When the IO blows up
-     */
-    void processResource( String resource, InputStream is, List<Relocator> relocators, long time )
-        throws IOException;
-
-    boolean hasTransformedResource();
-
-    void modifyOutputStream( JarOutputStream os )
-        throws IOException;
+    public final void processResource( String resource, InputStream is, List<Relocator> relocators )
+        throws IOException
+    {
+        processResource( resource, is, relocators, 0 );
+    }
 }
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ApacheLicenseResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ApacheLicenseResourceTransformer.java
index 6fd7931..524ffdd 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ApacheLicenseResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ApacheLicenseResourceTransformer.java
@@ -30,7 +30,7 @@ import org.apache.maven.plugins.shade.relocation.Relocator;
  * Prevents duplicate copies of the license
  */
 public class ApacheLicenseResourceTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     private static final String LICENSE_PATH = "META-INF/LICENSE";
 
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java
index 173d1d9..e75062b 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java
@@ -43,7 +43,7 @@ import java.util.jar.JarOutputStream;
  * Merges <code>META-INF/NOTICE.TXT</code> files.
  */
 public class ApacheNoticeResourceTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     Set<String> entries = new LinkedHashSet<>();
 
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/AppendingTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/AppendingTransformer.java
index 61556eb..c3cc937 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/AppendingTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/AppendingTransformer.java
@@ -33,7 +33,7 @@ import java.util.jar.JarOutputStream;
  * A resource processor that appends content for a resource, separated by a newline.
  */
 public class AppendingTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     String resource;
 
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ComponentsXmlResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ComponentsXmlResourceTransformer.java
index b82b0d7..9f83618 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ComponentsXmlResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ComponentsXmlResourceTransformer.java
@@ -42,7 +42,7 @@ import java.util.jar.JarOutputStream;
  * A resource processor that aggregates plexus <code>components.xml</code> files.
  */
 public class ComponentsXmlResourceTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     private Map<String, Xpp3Dom> components = new LinkedHashMap<>();
 
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/DontIncludeResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/DontIncludeResourceTransformer.java
index bfd1f0e..e1b7bc2 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/DontIncludeResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/DontIncludeResourceTransformer.java
@@ -32,7 +32,7 @@ import java.util.jar.JarOutputStream;
  * resource into the shaded JAR.
  */
 public class DontIncludeResourceTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     String resource;
     
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/GroovyResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/GroovyResourceTransformer.java
index f54c0cb..1a8d61d 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/GroovyResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/GroovyResourceTransformer.java
@@ -36,7 +36,7 @@ import java.util.jar.JarOutputStream;
  * Aggregate Apache Groovy extension modules descriptors
  */
 public class GroovyResourceTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
 
     static final String EXT_MODULE_NAME_LEGACY = "META-INF/services/org.codehaus.groovy.runtime.ExtensionModule";
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/IncludeResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/IncludeResourceTransformer.java
index ab360d1..dfe3326 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/IncludeResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/IncludeResourceTransformer.java
@@ -35,7 +35,7 @@ import java.util.jar.JarOutputStream;
  * content into the shaded JAR.
  */
 public class IncludeResourceTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     File file;
 
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformer.java
index 6bf711b..b66c73a 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ManifestResourceTransformer.java
@@ -41,7 +41,7 @@ import org.apache.maven.plugins.shade.relocation.Relocator;
  * @since 1.2
  */
 public class ManifestResourceTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     private final List<String> defaultAttributes = Arrays.asList( "Export-Package",
                                                                   "Import-Package",
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/PluginXmlResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/PluginXmlResourceTransformer.java
index 9392b53..0cbb3fa 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/PluginXmlResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/PluginXmlResourceTransformer.java
@@ -44,7 +44,7 @@ import org.codehaus.plexus.util.xml.Xpp3DomWriter;
  * @since 3.0
  */
 public class PluginXmlResourceTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     private List<Xpp3Dom> mojos = new ArrayList<>();
 
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ReproducibleResourceTransformer.java
similarity index 81%
copy from src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java
copy to src/main/java/org/apache/maven/plugins/shade/resource/ReproducibleResourceTransformer.java
index bb4400a..eb66032 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ReproducibleResourceTransformer.java
@@ -24,13 +24,18 @@ import org.apache.maven.plugins.shade.relocation.Relocator;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
-import java.util.jar.JarOutputStream;
 
-/** @author Jason van Zyl */
-public interface ResourceTransformer
+/**
+ * Transform resource ensuring reproducible output: that requires to get the timestamp of
+ * the initial resources to define in a reproducible way the timestamp of the transformed
+ * resource.
+ *
+ * @author Hervé Boutemy
+ * @since 3.2.4
+ */
+public interface ReproducibleResourceTransformer
+    extends ResourceTransformer
 {
-    boolean canTransformResource( String resource );
-
     /**
      * Transform an individual resource
      * @param resource The resource name
@@ -41,9 +46,4 @@ public interface ResourceTransformer
      */
     void processResource( String resource, InputStream is, List<Relocator> relocators, long time )
         throws IOException;
-
-    boolean hasTransformedResource();
-
-    void modifyOutputStream( JarOutputStream os )
-        throws IOException;
 }
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ResourceBundleAppendingTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ResourceBundleAppendingTransformer.java
index 77223ee..5ea56cf 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ResourceBundleAppendingTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ResourceBundleAppendingTransformer.java
@@ -39,7 +39,7 @@ import org.codehaus.plexus.util.IOUtil;
  * @since 3.0.0
  */
 public class ResourceBundleAppendingTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     private Map<String, ByteArrayOutputStream>  dataMap = new HashMap<>();
     
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java
index bb4400a..7b76666 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ResourceTransformer.java
@@ -36,10 +36,10 @@ public interface ResourceTransformer
      * @param resource The resource name
      * @param is An input stream for the resource, the implementation should *not* close this stream
      * @param relocators  A list of relocators
-     * @param time the time of the resource to process
      * @throws IOException When the IO blows up
+     * @deprecated prefer ReproducibleResourceTransformer
      */
-    void processResource( String resource, InputStream is, List<Relocator> relocators, long time )
+    void processResource( String resource, InputStream is, List<Relocator> relocators )
         throws IOException;
 
     boolean hasTransformedResource();
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java
index 929c5fa..b2f5dd6 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/ServicesResourceTransformer.java
@@ -46,7 +46,7 @@ import org.apache.maven.plugins.shade.relocation.Relocator;
  * shading process.
  */
 public class ServicesResourceTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
 
     private static final String SERVICES_PATH = "META-INF/services";
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/XmlAppendingTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/XmlAppendingTransformer.java
index 608c1a2..f5f6ac8 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/XmlAppendingTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/XmlAppendingTransformer.java
@@ -44,7 +44,7 @@ import org.xml.sax.SAXException;
  * Appends multiple occurrences of some XML file.
  */
 public class XmlAppendingTransformer
-    implements ResourceTransformer
+    extends AbstractCompatibilityTransformer
 {
     public static final String XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
 
diff --git a/src/main/java/org/apache/maven/plugins/shade/resource/properties/PropertiesTransformer.java b/src/main/java/org/apache/maven/plugins/shade/resource/properties/PropertiesTransformer.java
index 8040923..9b92797 100644
--- a/src/main/java/org/apache/maven/plugins/shade/resource/properties/PropertiesTransformer.java
+++ b/src/main/java/org/apache/maven/plugins/shade/resource/properties/PropertiesTransformer.java
@@ -32,7 +32,7 @@ import java.util.jar.JarEntry;
 import java.util.jar.JarOutputStream;
 
 import org.apache.maven.plugins.shade.relocation.Relocator;
-import org.apache.maven.plugins.shade.resource.ResourceTransformer;
+import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer;
 import org.apache.maven.plugins.shade.resource.properties.io.NoCloseOutputStream;
 import org.apache.maven.plugins.shade.resource.properties.io.SkipPropertiesDateLineWriter;
 
@@ -42,7 +42,7 @@ import org.apache.maven.plugins.shade.resource.properties.io.SkipPropertiesDateL
  * @since 3.2.2
  */
 public class PropertiesTransformer
-    implements ResourceTransformer
+    implements ReproducibleResourceTransformer
 {
     private String resource;
     private String alreadyMergedKey;
@@ -74,6 +74,13 @@ public class PropertiesTransformer
     }
 
     @Override
+    public final void processResource( String resource, InputStream is, List<Relocator> relocators )
+        throws IOException
+    {
+        processResource( resource, is, relocators, 0 );
+    }
+
+    @Override
     public void processResource( final String resource, final InputStream is, final List<Relocator> relocators,
                                  long time )
             throws IOException
diff --git a/src/test/java/org/apache/maven/plugins/shade/resource/rule/TransformerTesterRule.java b/src/test/java/org/apache/maven/plugins/shade/resource/rule/TransformerTesterRule.java
index 1eaf2b1..c159841 100644
--- a/src/test/java/org/apache/maven/plugins/shade/resource/rule/TransformerTesterRule.java
+++ b/src/test/java/org/apache/maven/plugins/shade/resource/rule/TransformerTesterRule.java
@@ -39,7 +39,7 @@ import java.util.jar.JarInputStream;
 import java.util.jar.JarOutputStream;
 
 import org.apache.maven.plugins.shade.relocation.Relocator;
-import org.apache.maven.plugins.shade.resource.ResourceTransformer;
+import org.apache.maven.plugins.shade.resource.ReproducibleResourceTransformer;
 import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
 import org.codehaus.plexus.component.configurator.converters.ConfigurationConverter;
 import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup;
@@ -51,7 +51,8 @@ import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
 
-public class TransformerTesterRule implements TestRule
+public class TransformerTesterRule
+    implements TestRule
 {
     @Override
     public Statement apply( final Statement base, final Description description )
@@ -71,9 +72,9 @@ public class TransformerTesterRule implements TestRule
                 final Map<String, String> jar;
                 try
                 {
-                    final ResourceTransformer transformer = createTransformer(spec);
-                    visit(spec, transformer);
-                    jar = captureOutput(transformer);
+                    final ReproducibleResourceTransformer transformer = createTransformer( spec );
+                    visit( spec, transformer );
+                    jar = captureOutput( transformer );
                 }
                 catch ( final Exception ex )
                 {
@@ -110,7 +111,8 @@ public class TransformerTesterRule implements TestRule
         }
     }
 
-    private Map<String, String> captureOutput(final ResourceTransformer transformer ) throws IOException
+    private Map<String, String> captureOutput( final ReproducibleResourceTransformer transformer )
+        throws IOException
     {
         final ByteArrayOutputStream out = new ByteArrayOutputStream();
         try ( final JarOutputStream jar = new JarOutputStream( out ) )
@@ -130,11 +132,12 @@ public class TransformerTesterRule implements TestRule
         return created;
     }
 
-    private void visit( final TransformerTest spec, final ResourceTransformer transformer ) throws IOException
+    private void visit( final TransformerTest spec, final ReproducibleResourceTransformer transformer )
+        throws IOException
     {
         for ( final Resource resource : spec.visited() )
         {
-            if ( transformer.canTransformResource( resource.path() ))
+            if ( transformer.canTransformResource( resource.path() ) )
             {
                 transformer.processResource(
                         resource.path(),
@@ -156,7 +159,7 @@ public class TransformerTesterRule implements TestRule
         return builder.toString();
     }
 
-    private ResourceTransformer createTransformer(final TransformerTest spec)
+    private ReproducibleResourceTransformer createTransformer(final TransformerTest spec)
     {
         final ConverterLookup lookup = new DefaultConverterLookup();
         try
@@ -167,7 +170,7 @@ public class TransformerTesterRule implements TestRule
             {
                 configuration.addChild( property.name(), property.value() );
             }
-            return ResourceTransformer.class.cast(
+            return ReproducibleResourceTransformer.class.cast(
                     converter.fromConfiguration( lookup, configuration,  spec.transformer(), spec.transformer(),
                         Thread.currentThread().getContextClassLoader(),
                         new DefaultExpressionEvaluator() ) );