Maven
  1. Maven
  2. MNG-5000

[regression] child distributionManagment.site.url not correct in a flat directory layout when child's artifactId doesn't match its module name

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 3.0.2
    • Fix Version/s: 3.0.3
    • Component/s: None
    • Labels:
      None
    • Environment:
      windows

      Description

      There is a multimodule flat project structure:
      root
      module1
      module2

      module1 has an artifactID of 'module1' (same as directory name)
      modulu2 has an artifactID of 'module-2' (different to directory name)

      After a 'mvn site-deploy' the generated report has the folder structure:
      /root
      /root/module-2
      /module1

      So based on the artifactID the submodules are created as a child of the root - or not.
      This is at least inconsistent and should be changed to be handled always the same - independent of the artifactID.

      This is also important for other plugins (i.e. the dashboard plugin).
      They seem to have some hardcoded directory structure (preferring submodules as childs of the root report).
      Due to this bug (see http://jira.codehaus.org/browse/MOJO-1630) the links between reports there still don't work as long as artifactID=module's directory.

      Attached you will find a testcase (based on maven3, but can also be used with maven2 when the version of the site-plugin is changed).

        Issue Links

          Activity

          Hide
          Lukas Theussl added a comment -

          There are several issues here. First I cannot quite reproduce your problem (running maven 2.2.1, site-plugin-2.3-SNAPSHOT): the deployed directory structure is

          root
          module1
          module-2

          (ie modules get deployed to the same level) while it should actually be

          root
          root/module1
          root/module-2

          However, this is apparently not a site-plugin issue, running help:effective-pom in one of the modules shows that the effective distributionManagement.site.url of the module is actually /tmp/module1, this is what the site plugin uses.

          Anyway, for such non-standard project layouts I would recommend to specify the distMngmnt sections for each module explicitly, doing so the deployed site is ok AFAICS.

          Show
          Lukas Theussl added a comment - There are several issues here. First I cannot quite reproduce your problem (running maven 2.2.1, site-plugin-2.3-SNAPSHOT): the deployed directory structure is root module1 module-2 (ie modules get deployed to the same level) while it should actually be root root/module1 root/module-2 However, this is apparently not a site-plugin issue, running help:effective-pom in one of the modules shows that the effective distributionManagement.site.url of the module is actually /tmp/module1, this is what the site plugin uses. Anyway, for such non-standard project layouts I would recommend to specify the distMngmnt sections for each module explicitly, doing so the deployed site is ok AFAICS.
          Hide
          Stefan Hansel added a comment -

          Ok, checked again - it indeed only happens with maven3.0.1 + 3.0.2 .
          Who whould be responsible for such a bug-report? Is this the core of Maven http://jira.codehaus.org/browse/MNG ?

          As you say 'non-standard project layout' - I thought that a flat multimodule project is completely valid (at least officially documented in the sonartype docs) and the best way to cope with eclipse, as it only knows a flat project structure anyway?

          One other question: I already tried to manipulate/tweak the distributionManagement.site.url (but of course don't want to use absolute paths there).

          I hoped that

            <distributionManagement>
              <site>
                <url>${project.parent.distributionManagement.site.url}/subdir</url>
              </site>
            </distributionManagement>
          

          would help in the submodule, but I only get errors and it looks like the variable is not resolved.
          Any suggestions?

          Show
          Stefan Hansel added a comment - Ok, checked again - it indeed only happens with maven3.0.1 + 3.0.2 . Who whould be responsible for such a bug-report? Is this the core of Maven http://jira.codehaus.org/browse/MNG ? As you say 'non-standard project layout' - I thought that a flat multimodule project is completely valid (at least officially documented in the sonartype docs) and the best way to cope with eclipse, as it only knows a flat project structure anyway? One other question: I already tried to manipulate/tweak the distributionManagement.site.url (but of course don't want to use absolute paths there). I hoped that <distributionManagement> <site> <url>${project.parent.distributionManagement.site.url}/subdir</url> </site> </distributionManagement> would help in the submodule, but I only get errors and it looks like the variable is not resolved. Any suggestions?
          Hide
          Benjamin Bentmann added a comment -

          (ie modules get deployed to the same level)

          Which is the expected behavior as per MNG-3134 and the structure of the example project.

          [...] running help:effective-pom in one of the modules shows that the effective distributionManagement.site.url of the module is actually /tmp/module1, this is what the site plugin uses.

          This is what I see with Maven 3.0.x

          <distributionManagement>
            <site>
              <id>MSITE-227</id>
              <url>file:///tmp/module1/</url>
            </site>
          </distributionManagement>
          

          and with Maven 2.2.1:

          <distributionManagement>
            <site>
              <id>MSITE-227</id>
              <url>file:///tmp/module1</url>
            </site>
          </distributionManagement>
          

          which apart from the trailing slash from the parent's URL being preserved by Maven 3.x, is identical. So I don't see how this is a core issue.

          Show
          Benjamin Bentmann added a comment - (ie modules get deployed to the same level) Which is the expected behavior as per MNG-3134 and the structure of the example project. [...] running help:effective-pom in one of the modules shows that the effective distributionManagement.site.url of the module is actually /tmp/module1, this is what the site plugin uses. This is what I see with Maven 3.0.x <distributionManagement> <site> <id> MSITE-227 </id> <url> file:///tmp/module1/ </url> </site> </distributionManagement> and with Maven 2.2.1: <distributionManagement> <site> <id> MSITE-227 </id> <url> file:///tmp/module1 </url> </site> </distributionManagement> which apart from the trailing slash from the parent's URL being preserved by Maven 3.x, is identical. So I don't see how this is a core issue.
          Hide
          Stefan Hansel added a comment -

          Please don't just close this bug.

          There is an issue with the site-plugin under Maven3 creating different pathes based on the artifact-ID of a module.
          The site-plugin developers claim this is a core issue.

          As someone from the outside I cannot decide if this is a site-plugin problem (where I originally filed the bug) or a core issue. But seeing this bug moved from one project to the other and then seeing it closed is no solution.

          Regardless of who's right or wrong regarding the expected final directory layout: one of both modules is behaving wrong under Maven3.

          Please compare the distribution.url (copied from help:effective-pom) of module1 and module2 with Maven3.

              <distributionManagement>
                <site>
                  <id>MSITE-227</id>
                  <url>file:///tmp/module1/</url>
                </site>
              </distributionManagement>
          
              <distributionManagement>
                <site>
                  <id>MSITE-227</id>
                  <url>file:///tmp/MSITE-227/module-2/</url>
                </site>
              </distributionManagement>
          

          Here module1 adheres to the flat layout, while module2 uses a nested layout.
          So if flat-layout is the expected one, then module2 is behaving wrong!

          Please reconsider closing this bug (or at least move it back to the site-plugin of you don't think it's a core issue).

          Show
          Stefan Hansel added a comment - Please don't just close this bug. There is an issue with the site-plugin under Maven3 creating different pathes based on the artifact-ID of a module. The site-plugin developers claim this is a core issue. As someone from the outside I cannot decide if this is a site-plugin problem (where I originally filed the bug) or a core issue. But seeing this bug moved from one project to the other and then seeing it closed is no solution. Regardless of who's right or wrong regarding the expected final directory layout: one of both modules is behaving wrong under Maven3. Please compare the distribution.url (copied from help:effective-pom) of module1 and module2 with Maven3. <distributionManagement> <site> <id>MSITE-227</id> <url>file: ///tmp/module1/</url> </site> </distributionManagement> <distributionManagement> <site> <id>MSITE-227</id> <url>file: ///tmp/MSITE-227/module-2/</url> </site> </distributionManagement> Here module1 adheres to the flat layout, while module2 uses a nested layout. So if flat-layout is the expected one, then module2 is behaving wrong! Please reconsider closing this bug (or at least move it back to the site-plugin of you don't think it's a core issue).
          Hide
          Stefan Hansel added a comment -

          see last comment

          Show
          Stefan Hansel added a comment - see last comment
          Hide
          Lukas Theussl added a comment -

          I agree with Stefan that there is an issue somewhere and since it can be demonstrated by just help:effective-pom, it's not site-plugin specific. However, I am confused about what the actual expected behavior is, MNG-3134 sounds just wrong to me as it supposes the module structure matches the inheritance structure IIUC. I will try to construct a clearer test case for demonstration.

          Show
          Lukas Theussl added a comment - I agree with Stefan that there is an issue somewhere and since it can be demonstrated by just help:effective-pom, it's not site-plugin specific. However, I am confused about what the actual expected behavior is, MNG-3134 sounds just wrong to me as it supposes the module structure matches the inheritance structure IIUC. I will try to construct a clearer test case for demonstration.
          Hide
          Benjamin Bentmann added a comment -

          You're right about this being a core issue, I missed to recognize the discrepancy in the module-2 project, fixed in r1072613.

          The cause of the issue was that module-2 has a different artifactId than its module name. Let me stress that such a layout is a recipe for trouble as it results in effective URLs that depend on the source of the POM (project vs repo), i.e. if somebody (e.g. a plugin) was to construct the POM of this project from the repository, it would see different URLs than those used when building the project. The same problem would also arise during local project building when URLs are inherited from a grand-parent via one or more intermediate parents and any of those parents is resolved from the repo. For this reason, it's highly recommended to synchronize the module name with the artifactId.

          Show
          Benjamin Bentmann added a comment - You're right about this being a core issue, I missed to recognize the discrepancy in the module-2 project, fixed in r1072613 . The cause of the issue was that module-2 has a different artifactId than its module name. Let me stress that such a layout is a recipe for trouble as it results in effective URLs that depend on the source of the POM (project vs repo), i.e. if somebody (e.g. a plugin) was to construct the POM of this project from the repository, it would see different URLs than those used when building the project. The same problem would also arise during local project building when URLs are inherited from a grand-parent via one or more intermediate parents and any of those parents is resolved from the repo. For this reason, it's highly recommended to synchronize the module name with the artifactId.
          Hide
          Lukas Theussl added a comment -

          such a layout is a recipe for trouble as it results in effective URLs that depend on the source of the POM (project vs repo)

          If this is true then there must be something wrong with Maven...

          it would see different URLs than those used when building the project

          I don't understand why this should be the case, are there any docs or examples you could point me to? The state of a pom should be uniquely specified by its maven coordinates and those of its parent, not by the module structure of the build. In other words, why shouldn't it be possible to move a module into a different directory, without changing the module's identity?

          Show
          Lukas Theussl added a comment - such a layout is a recipe for trouble as it results in effective URLs that depend on the source of the POM (project vs repo) If this is true then there must be something wrong with Maven... it would see different URLs than those used when building the project I don't understand why this should be the case, are there any docs or examples you could point me to? The state of a pom should be uniquely specified by its maven coordinates and those of its parent, not by the module structure of the build. In other words, why shouldn't it be possible to move a module into a different directory, without changing the module's identity?
          Hide
          Benjamin Bentmann added a comment -

          I don't understand why this should be the case, are there any docs or examples you could point me to?

          http://svn.apache.org/repos/asf/maven/maven-2/tags/maven-2.2.1/maven-project/src/main/java/org/apache/maven/project/MavenProject.java, getModulePathAdjustment() starts with two nice FIXME comments that outline the design flaw.

          The state of a pom should be uniquely specified by its maven coordinates and those of its parent, not by the module structure of the build

          Yes this would be the ideal but the bug raised here demands to consider the directory name in the local project structure which is lost once the POMs got installed/deployed to a repo. When I investigated the bug, I was originally tempted to close it as won't fix because of the irreproducibility it drags in but then again, this entire URL inheritance/adjustment feature is broken itself so I stopped bothering and just restored the status quo as in 2.x.

          Show
          Benjamin Bentmann added a comment - I don't understand why this should be the case, are there any docs or examples you could point me to? http://svn.apache.org/repos/asf/maven/maven-2/tags/maven-2.2.1/maven-project/src/main/java/org/apache/maven/project/MavenProject.java , getModulePathAdjustment() starts with two nice FIXME comments that outline the design flaw. The state of a pom should be uniquely specified by its maven coordinates and those of its parent, not by the module structure of the build Yes this would be the ideal but the bug raised here demands to consider the directory name in the local project structure which is lost once the POMs got installed/deployed to a repo. When I investigated the bug, I was originally tempted to close it as won't fix because of the irreproducibility it drags in but then again, this entire URL inheritance/adjustment feature is broken itself so I stopped bothering and just restored the status quo as in 2.x.
          Hide
          Lukas Theussl added a comment -

          I'm still confused about this... Benjamin: what's the actual algorithm to calculate the effective url if it gets inherited? The current site docs say:

          If subprojects inherit the site URL from a parent POM, they will automatically append their <artifactId> to form their effective deployment location.
          

          This is what I always had in mind but it is obviously not correct for the attached test project (the modules get deployed into the same directory as root, instead of having their artifactId appended). At least the behavior is consistent now AFAIS so I guess the docs need to be adjusted.

          Show
          Lukas Theussl added a comment - I'm still confused about this... Benjamin: what's the actual algorithm to calculate the effective url if it gets inherited? The current site docs say: If subprojects inherit the site URL from a parent POM, they will automatically append their <artifactId> to form their effective deployment location. This is what I always had in mind but it is obviously not correct for the attached test project (the modules get deployed into the same directory as root, instead of having their artifactId appended). At least the behavior is consistent now AFAIS so I guess the docs need to be adjusted.
          Hide
          Benjamin Bentmann added a comment -

          I already mentioned getModulePathAdjustment().

          Show
          Benjamin Bentmann added a comment - I already mentioned getModulePathAdjustment() .

            People

            • Assignee:
              Benjamin Bentmann
              Reporter:
              Stefan Hansel
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development