diff --git a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/VaultMojo.java b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/VaultMojo.java
index 55d37e6..7c57a14 100644
--- a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/VaultMojo.java
+++ b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/mojo/VaultMojo.java
@@ -516,48 +516,22 @@
             }
             // find the source directory
             final File jcrSourceDirectory = getJcrSourceDirectory();
-            // include content from build only if it exists
-            if (jcrSourceDirectory != null && jcrSourceDirectory.exists()) {
-                if (jcrSourceDirectory.getAbsoluteFile().toPath().normalize().startsWith(workDirectory.getAbsoluteFile().toPath().normalize())) {
-                    throw new MojoFailureException("jcrSourceDirectory ("+jcrSourceDirectory+") must be outside of workDirectory ("+ workDirectory + ")!");
-                }
-                getLog().info("Packaging content from " + getProjectRelativeFilePath(jcrSourceDirectory));
-                Map<File, File> overwrittenFiles = addSourceDirectory(mavenResourcesExecution, contentPackageArchiver, jcrSourceDirectory, filters, embeddedFiles);
-                duplicateFiles.putAll(overwrittenFiles);
+            addSourceDirectory(mavenResourcesExecution, contentPackageArchiver, jcrSourceDirectory, filters, embeddedFiles);
 
-                if (!duplicateFiles.isEmpty()) {
-                    for (Entry<File, File> entry : duplicateFiles.entrySet()) {
-                        String message = "Found duplicate file '" + entry.getKey() + "' from sources " + getProjectRelativeFilePath(protectedFiles.get(entry.getKey()))
-                                + " and " + getProjectRelativeFilePath(entry.getValue()) + ".";
-                        if (failOnDuplicateEntries) {
-                            getLog().error(message);
-                        } else {
-                            getLog().warn(message);
-                        }
-                    }
+
+            if (!duplicateFiles.isEmpty()) {
+                for (Entry<File, File> entry : duplicateFiles.entrySet()) {
+                    String message = "Found duplicate file '" + entry.getKey() + "' from sources " + getProjectRelativeFilePath(protectedFiles.get(entry.getKey()))
+                            + " and " + getProjectRelativeFilePath(entry.getValue()) + ".";
                     if (failOnDuplicateEntries) {
-                        throw new MojoFailureException(
-                                "Found " + duplicateFiles.size() + " duplicate file(s) in content package, see above errors for details.");
+                        getLog().error(message);
+                    } else {
+                        getLog().warn(message);
                     }
                 }
-
-                // check for uncovered files (i.e. files from the source which are not even added to the content package)
-                Collection<File> uncoveredFiles = getUncoveredFiles(jcrSourceDirectory, excludes, prefix,
-                        contentPackageArchiver.getFiles().keySet());
-                if (!uncoveredFiles.isEmpty()) {
-                    for (File uncoveredFile : uncoveredFiles) {
-                        String message = "File " + getProjectRelativeFilePath(uncoveredFile)
-                                + " not covered by a filter rule and therefore not contained in the resulting package";
-                        if (failOnUncoveredSourceFiles) {
-                            getLog().error(message);
-                        } else {
-                            getLog().warn(message);
-                        }
-                    }
-                    if (failOnUncoveredSourceFiles) {
-                        throw new MojoFailureException("The following files are not covered by a filter rule: \n"
-                                + StringUtils.join(uncoveredFiles.iterator(), ",\n"));
-                    }
+                if (failOnDuplicateEntries) {
+                    throw new MojoFailureException(
+                            "Found " + duplicateFiles.size() + " duplicate file(s) in content package, see above errors for details.");
                 }
             }
 
@@ -602,8 +576,17 @@
     }
 
     private Map<File, File> addSourceDirectory(MavenResourcesExecution mavenResourcesExecution, ContentPackageArchiver contentPackageArchiver, File jcrSourceDirectory, Filters filters,
-            Map<String, File> embeddedFiles) throws MavenFilteringException {
+            Map<String, File> embeddedFiles) throws MavenFilteringException, MojoFailureException {
         Map<File, File> duplicateFiles = new HashMap<>();
+        
+        if (jcrSourceDirectory == null || !jcrSourceDirectory.exists()) {
+            return Collections.emptyMap();
+            
+        }
+        if (jcrSourceDirectory.getAbsoluteFile().toPath().normalize().startsWith(getWorkDirectory(false).getAbsoluteFile().toPath().normalize())) {
+            throw new MojoFailureException("jcrSourceDirectory ("+jcrSourceDirectory+") must be outside of workDirectory ("+ workDirectory + ")!");
+        }
+        getLog().info("Packaging content from " + getProjectRelativeFilePath(jcrSourceDirectory));
         // See GRANITE-16348
         // we want to build a list of all the root directories in the order they were specified in the filter
         // but ignore the roots that don't point to a directory
@@ -654,6 +637,24 @@
                 
             }
         }
+        // check for uncovered files (i.e. files from the source which are not even added to the content package)
+        Collection<File> uncoveredFiles = getUncoveredFiles(jcrSourceDirectory, excludes, prefix,
+                contentPackageArchiver.getFiles().keySet());
+        if (!uncoveredFiles.isEmpty()) {
+            for (File uncoveredFile : uncoveredFiles) {
+                String message = "File " + getProjectRelativeFilePath(uncoveredFile)
+                        + " not covered by a filter rule and therefore not contained in the resulting package";
+                if (failOnUncoveredSourceFiles) {
+                    getLog().error(message);
+                } else {
+                    getLog().warn(message);
+                }
+            }
+            if (failOnUncoveredSourceFiles) {
+                throw new MojoFailureException("The following files are not covered by a filter rule: \n"
+                        + StringUtils.join(uncoveredFiles.iterator(), ",\n"));
+            }
+        }
         return duplicateFiles;
     }
 
