maven site descriptor interpolation and inheritance on multi-module project

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

maven site descriptor interpolation and inheritance on multi-module project

Nikola Ruzic
Hi!

I'm having trouble to understand how maven site descriptor interpolation
is designed to work in multi-module sites using inheritance as described
here
(https://maven.apache.org/plugins/maven-site-plugin/examples/multimodule.html).

Here (https://maven.apache.org/plugins/maven-site-plugin/migrate.html)
it is stated that interpolation is now done after inheritance and new
early interpolation feature has been added to preserve backward
compatible behavior.

Here
(https://maven.apache.org/doxia/doxia-sitetools/doxia-integration-tools/index.html)
it is stated that interpolation can be late or early. I'm not sure if
this mean that late and early are mutually exclusive or not.

As far as I can discern from source code of DefaultSiteTool class in
doxia-site-tools-1.8.1
(https://github.com/apache/maven-doxia-sitetools/blob/947289e162a08c1002e304193c448f8d4b229285/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java#L473),
implementation intention is to first do early interpolation and then
"classical" late interpolation after inheritance is done.

I have written following master pom and site descriptor to test this
behavior
https://repo1.maven.org/maven2/com/github/nruzic/commons/master/nruzic-commons-master/3.0.0-RC14/

My site descriptor contains following section to test various
interpolation options:

<breadcrumbs>
<item name="Project Site" href="${this.foo}/${foo}/${FOO}/${project.name}"/>
</breadcrumbs>

Now, try to write following child pom and run "mvn site" command on it.

<?xml version="1.0" encoding="UTF-8"?>
<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>

     <parent>
<groupId>com.github.nruzic.commons.master</groupId>
         <artifactId>nruzic-commons-master</artifactId>
         <version>3.0.0-RC14</version>
         <relativePath />
     </parent>

<artifactId>site-descriptor-interpolation-test</artifactId>
     <packaging>pom</packaging>
     <name>Site Descriptor Interpolation Test</name>

     <properties>
         <foo>foo-from-child-project</foo>
     </properties>

</project>

I'm getting following error:

[ERROR] Failed to execute goal
org.apache.maven.plugins:maven-site-plugin:3.7.1:site (default-site) on
project site-descriptor-interpolation-test: Execution default-site of
goal org.apache.maven.plugins:maven-site-plugin:3.7.1:site failed:
site.xml late interpolation ${project.*} expression found in link:
'foo-from-parent-using-this/${foo}/${FOO}/${project.name}'. Use early
interpolation ${this.*} -> [Help 1]

Maven version is:

mvn -v
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3;
2018-10-24T20:41:47+02:00)
Maven home: /opt/maven
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime:
/usr/lib/jvm/java-8-oracle/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-43-generic", arch: "amd64", family:
"unix"

I'm not sure why forbid "project." references in parent site descriptor?
Maybe one (like me) needs them to be be used with late interpolation.

If I remove "project." reference the problem only gets worse. Try
replace parent version in test pom with 3.0.0-RC13 version. Details
about RC13 version can be found here
https://repo1.maven.org/maven2/com/github/nruzic/commons/master/nruzic-commons-master/3.0.0-RC13/

Now I'm getting following error running "maven site" command:

[ERROR] Failed to execute goal
org.apache.maven.plugins:maven-site-plugin:3.7.1:site (default-site) on
project site-descriptor-interpolation-test: Execution default-site of
goal org.apache.maven.plugins:maven-site-plugin:3.7.1:site failed:
Illegal character in path at index 28:
foo-from-parent-using-this/${foo}/${FOO}/ -> [Help 1]

Now maven fails before late interpolation is done.

I have done following change in source code of doxia-decoration-model
(basically, skip rebase if link contains unresolved placeholders):

git diff
diff --git
a/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
b/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
index fd511ae..20bf1db 100644
---
a/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
+++
b/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
@@ -450,7 +450,7 @@ public class DefaultDecorationModelInheritanceAssembler
           */
          public String rebaseLink( final String link )
          {
-            if ( link == null || getOldPath() == null )
+            if ( link == null || getOldPath() == null || link.contains(
"${" ) )
              {
                  return link;
              }

Now interpolation works as have have expected, all placeholders in
parent site descriptor are replaced.

Can someone comment given analysis please. Is this a bug in
doxia-sitetools or what?

Kind regards,

Nikola


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: maven site descriptor interpolation and inheritance on multi-module project

Nikola Ruzic
One more thing,

in addition to given patch, one needs FOO environment variable set in
its environment for test to pass:

export FOO=foo-from-evnironment

/N

On 30. 01. 2019. 15:22, Nikola Ruzic wrote:

> Hi!
>
> I'm having trouble to understand how maven site descriptor
> interpolation is designed to work in multi-module sites using
> inheritance as described here
> (https://maven.apache.org/plugins/maven-site-plugin/examples/multimodule.html).
>
> Here (https://maven.apache.org/plugins/maven-site-plugin/migrate.html)
> it is stated that interpolation is now done after inheritance and new
> early interpolation feature has been added to preserve backward
> compatible behavior.
>
> Here
> (https://maven.apache.org/doxia/doxia-sitetools/doxia-integration-tools/index.html)
> it is stated that interpolation can be late or early. I'm not sure if
> this mean that late and early are mutually exclusive or not.
>
> As far as I can discern from source code of DefaultSiteTool class in
> doxia-site-tools-1.8.1
> (https://github.com/apache/maven-doxia-sitetools/blob/947289e162a08c1002e304193c448f8d4b229285/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java#L473),
> implementation intention is to first do early interpolation and then
> "classical" late interpolation after inheritance is done.
>
> I have written following master pom and site descriptor to test this
> behavior
> https://repo1.maven.org/maven2/com/github/nruzic/commons/master/nruzic-commons-master/3.0.0-RC14/
>
> My site descriptor contains following section to test various
> interpolation options:
>
> <breadcrumbs>
> <item name="Project Site"
> href="${this.foo}/${foo}/${FOO}/${project.name}"/>
> </breadcrumbs>
>
> Now, try to write following child pom and run "mvn site" command on it.
>
> <?xml version="1.0" encoding="UTF-8"?>
> <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>
>
>     <parent>
> <groupId>com.github.nruzic.commons.master</groupId>
>         <artifactId>nruzic-commons-master</artifactId>
>         <version>3.0.0-RC14</version>
>         <relativePath />
>     </parent>
>
> <artifactId>site-descriptor-interpolation-test</artifactId>
>     <packaging>pom</packaging>
>     <name>Site Descriptor Interpolation Test</name>
>
>     <properties>
>         <foo>foo-from-child-project</foo>
>     </properties>
>
> </project>
>
> I'm getting following error:
>
> [ERROR] Failed to execute goal
> org.apache.maven.plugins:maven-site-plugin:3.7.1:site (default-site)
> on project site-descriptor-interpolation-test: Execution default-site
> of goal org.apache.maven.plugins:maven-site-plugin:3.7.1:site failed:
> site.xml late interpolation ${project.*} expression found in link:
> 'foo-from-parent-using-this/${foo}/${FOO}/${project.name}'. Use early
> interpolation ${this.*} -> [Help 1]
>
> Maven version is:
>
> mvn -v
> Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3;
> 2018-10-24T20:41:47+02:00)
> Maven home: /opt/maven
> Java version: 1.8.0_191, vendor: Oracle Corporation, runtime:
> /usr/lib/jvm/java-8-oracle/jre
> Default locale: en_US, platform encoding: UTF-8
> OS name: "linux", version: "4.15.0-43-generic", arch: "amd64", family:
> "unix"
>
> I'm not sure why forbid "project." references in parent site
> descriptor? Maybe one (like me) needs them to be be used with late
> interpolation.
>
> If I remove "project." reference the problem only gets worse. Try
> replace parent version in test pom with 3.0.0-RC13 version. Details
> about RC13 version can be found here
> https://repo1.maven.org/maven2/com/github/nruzic/commons/master/nruzic-commons-master/3.0.0-RC13/
>
> Now I'm getting following error running "maven site" command:
>
> [ERROR] Failed to execute goal
> org.apache.maven.plugins:maven-site-plugin:3.7.1:site (default-site)
> on project site-descriptor-interpolation-test: Execution default-site
> of goal org.apache.maven.plugins:maven-site-plugin:3.7.1:site failed:
> Illegal character in path at index 28:
> foo-from-parent-using-this/${foo}/${FOO}/ -> [Help 1]
>
> Now maven fails before late interpolation is done.
>
> I have done following change in source code of doxia-decoration-model
> (basically, skip rebase if link contains unresolved placeholders):
>
> git diff
> diff --git
> a/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
> b/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
>
> index fd511ae..20bf1db 100644
> ---
> a/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
> +++
> b/doxia-decoration-model/src/main/java/org/apache/maven/doxia/site/decoration/inheritance/DefaultDecorationModelInheritanceAssembler.java
> @@ -450,7 +450,7 @@ public class
> DefaultDecorationModelInheritanceAssembler
>           */
>          public String rebaseLink( final String link )
>          {
> -            if ( link == null || getOldPath() == null )
> +            if ( link == null || getOldPath() == null ||
> link.contains( "${" ) )
>              {
>                  return link;
>              }
>
> Now interpolation works as have have expected, all placeholders in
> parent site descriptor are replaced.
>
> Can someone comment given analysis please. Is this a bug in
> doxia-sitetools or what?
>
> Kind regards,
>
> Nikola
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]