Search code examples
maven-2maven-archetype

How do I create dynamically named folders with Maven Archetype?


I'm trying to build an archetype structure like this, a webapp with some custom folders for our web framework. Especially some dynamic folders which also will contain some files brought by the archetype.

└───src
    └───main
        └───webapp
            └───WEB-INF
                ├───cfg
                │   ├───log4j
                │   └───resources
                │       └───extensions
                │           ├───${shortName}-business
                │           └───${shortName}-layout
                └───lib

I added a required property to my archetype-metadata.xml to have an short name for the project, which is used among other things for generating unique folders.

<requiredProperties>
  <requiredProperty key="shortName" />
</requiredProperties>

The property shortName I use in a fileSet:

<fileSet>
  <directory>[..]/resources/extensions/${shortName}-business</directory>
</fileSet>

<fileSet>
  <directory>[..]/resources/extensions/${shortName}-layout</directory>
</fileSet>

The command to generate the archetype:

mvn archetype:generate -B \
       -DgroupId=com.stackoverflow \
       -DartifactId=stackoverflow-question -DarchetypeGroupId=com.stackoverflow \
       -DarchetypeArtifactId=stackoverflow-archetype -DarchetypeVersion=1.0 \
       -DshortName=soq

I assume to get the following folder structure:

..\
   ├───soq-business
   └───soq-layout

But I get this name ${shortName}-business as folder, without it being replaced with the property.

..\
   ├───${shortName}-business
   └───${shortName}-layout

How can I achieve this? How can I place files below soq-business without knowing the folder name at this time?


Solution

  • I figured the exact same problem today...

    I found some blog entry by Adam Leggett which describes using placeholders in paths: have a look at https://mikeciblogs.wordpress.com/2010/01/14/working-with-custom-maven-archetypes-part-1/ (Step 4).

    The trick seems to be to use doubled underscores instead of the curly braces syntax, so ${shortName} becomes __shortName__.

    However, I haven't tried the solution yet. If you do so, please let us know if it works. Thanks!

    HTH!