[ https://issues.apache.org/jira/browse/MSOURCES-95?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Karl Heinz Marbaise closed MSOURCES-95. --------------------------------------- Resolution: Implemented Based on the closed issue linked https://github.com/codehaus-plexus/plexus-archiver/issues/24 I will close this issue. > When one of the source folders is empty the source jar is recreated even when > sources not changed > ------------------------------------------------------------------------------------------------- > > Key: MSOURCES-95 > URL: https://issues.apache.org/jira/browse/MSOURCES-95 > Project: Maven Source Plugin > Issue Type: Bug > Reporter: Plamen Totev > Priority: Minor > Attachments: reproduce-project.zip > > > There is issue opened in Plexus Archive project - > https://github.com/codehaus-plexus/plexus-archiver/issues/24 > In short if you download the attached zip and build it several times you'll > see that the source jar is build every time no matter that the source are not > changed. That's because {{target/generated-sources/annotations}} is empty. I > think the reason for this behavior is that the default inclusion pattern in > {{AbstractSourceJarMojo}} is {{\*\*/\*}}. If it's {{\*\*/\*\*}} then the jar > will not be rebuilded. Is there any reason why it's {{\*\*/\*}} and not > {{\*\*/\*\*}} ? > In the next paragraphs I'll try to explain why the second patter work and the > first not. > Let's say we have the following directory: > {code} > + src > +--+ main > +--+ java > +--+ app > | +--+ App.java > | > +--+ empty_dir > {code} > when added to {{JarArchiver}} with prefix "" (empty string) this is how > Plexus Archiver "sees" them: > {code} > src/main/java -> "" (empty string) > src/main/java/app -> "app" > src/main/java/app/App.java -> "app/App.java" > src/main/java/empty_dir -> "empty_dir" > {code} > To decide which entries to add Plexus Archives applies inclusion and > exclusion patterns. Internally it uses > {{org.codehaus.plexus.util.DirectoryScanner}} > (https://github.com/codehaus-plexus/plexus-utils/blob/master/src/main/java/org/codehaus/plexus/util/DirectoryScanner.java). > The JavaDoc contains nice explanation how the patterns are applied but in > the next paragraph I'll try to explain in short what happens. > When the pattern is set to {{\*\*/\*}} it will match all but /src/main/java > ("app", "app/App.java", "empty_dir"). This is because the pattern matches > zero or more path segments, followed by any path segment. src/main/java is > mapped to "" so the pattern will not match it (it's empty path segment > followed by nothing). So far so good. But what if the source directory is > empty(src/main/java). Then nothing will be matched and we'll end with empty > resource collection to add to the archive. And because it's empty there is no > way to know when it was last modified so Plexus Archiver will do the safe > thing and recreate the archive. After all when the archive was created the > pattern may have matched something and the archive is not empty so it's > outdated. > What if the pattern is set to {{\*\*/\*\*}} it will match "", "app", > "app/App.java" and "empty_dir". That's because it matches zero or more path > segments, followed by zero or more path segments - in other words everything > (my understanding is that it's the same as {{\*\*}} - match everything). So > if /src/main/java is empty we'll end up with collection containing only "" - > file resource with empty name. Because of the empty name it won't be added to > the archive(and that's exactly what we want) but there is at least one > resource with last modification date so now Plexus Archiver knows if the > archive is up to date or not. If there were files in the directory and now > there is none then the directory last modification date will be newer than > the one of the archive. -- This message was sent by Atlassian JIRA (v7.6.3#76005)