diff --git a/src/it/MSOURCES-121/invoker.properties b/src/it/MSOURCES-121/invoker.properties
index 2668a60..c43b263 100644
--- a/src/it/MSOURCES-121/invoker.properties
+++ b/src/it/MSOURCES-121/invoker.properties
@@ -14,4 +14,4 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-invoker.buildResult = failure
+invoker.buildResult = success
diff --git a/src/it/MSOURCES-121/pom.xml b/src/it/MSOURCES-121/pom.xml
index f1274f9..26c61ac 100644
--- a/src/it/MSOURCES-121/pom.xml
+++ b/src/it/MSOURCES-121/pom.xml
@@ -29,9 +29,10 @@
 
   <name>Test for multiple attachments of files</name>
 	<description>This build should fail based on the duplicate
-   execution with  the same configuration. This will errornously
-   add the classifier/file twice times.
+   execution with the same configuration. This will erroneously
+   add the classifier/file twice.
    MSOURCES-121.
+   update with MSOURCES-141: do not fail but detect and not add twice
   </description>
 
   <properties>
diff --git a/src/main/java/org/apache/maven/plugins/source/AbstractSourceJarMojo.java b/src/main/java/org/apache/maven/plugins/source/AbstractSourceJarMojo.java
index b3ead72..54d11a5 100644
--- a/src/main/java/org/apache/maven/plugins/source/AbstractSourceJarMojo.java
+++ b/src/main/java/org/apache/maven/plugins/source/AbstractSourceJarMojo.java
@@ -24,6 +24,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.maven.archiver.MavenArchiveConfiguration;
 import org.apache.maven.archiver.MavenArchiver;
@@ -303,15 +304,24 @@
             }
 
             if (attach) {
+                boolean requiresAttach = true;
                 for (Artifact attachedArtifact : project.getAttachedArtifacts()) {
-                    if (isAlreadyAttached(attachedArtifact, project, getClassifier())) {
-                        getLog().error("We have duplicated artifacts attached.");
-                        throw new MojoExecutionException("Presumably you have configured maven-source-plugin "
-                                + "to execute twice in your build. You have to configure a classifier "
-                                + "for at least one of them.");
+                    Artifact previouslyAttached = getPreviouslyAttached(attachedArtifact, project, getClassifier());
+                    if (previouslyAttached != null) {
+                        if (!outputFile.equals(previouslyAttached.getFile())) {
+                            getLog().error("Artifact already attached to a file " + previouslyAttached.getFile()
+                                    + ": attach to " + outputFile + " should be done with another classifier");
+                            throw new MojoExecutionException("Presumably you have configured maven-source-plugin "
+                                    + "to execute twice in your build to different output files. "
+                                    + "You have to configure a classifier for at least one of them.");
+                        }
+                        requiresAttach = false;
+                        getLog().info("Artifact already attached: ignoring re-attach");
                     }
                 }
-                projectHelper.attachArtifact(project, getType(), getClassifier(), outputFile);
+                if (requiresAttach) {
+                    projectHelper.attachArtifact(project, getType(), getClassifier(), outputFile);
+                }
             } else {
                 getLog().info("NOT adding java-sources to attached artifacts list.");
             }
@@ -320,12 +330,14 @@
         }
     }
 
-    private boolean isAlreadyAttached(Artifact artifact, MavenProject checkProject, String classifier) {
+    private Artifact getPreviouslyAttached(Artifact artifact, MavenProject checkProject, String classifier) {
         return artifact.getType().equals(getType())
-                && artifact.getGroupId().equals(checkProject.getGroupId())
-                && artifact.getArtifactId().equals(checkProject.getArtifactId())
-                && artifact.getVersion().equals(checkProject.getVersion())
-                && (artifact.getClassifier() != null ? artifact.getClassifier().equals(classifier) : false);
+                        && artifact.getGroupId().equals(checkProject.getGroupId())
+                        && artifact.getArtifactId().equals(checkProject.getArtifactId())
+                        && artifact.getVersion().equals(checkProject.getVersion())
+                        && Objects.equals(artifact.getClassifier(), classifier)
+                ? artifact
+                : null;
     }
 
     /**
