Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I convert an artifactId to a classname prefix in my maven archetype?

I'm creating a maven archetype and in the projects generated a want a class that is named after the artifact id of the generated project.

The artifact id will be formatted like: the-project-name and the class should be named TheProjectNameMain.

I've tried to do this in my archetype-metadata.xml but I can't get it right.

<archetype-descriptor>
    <requiredProperties>
        <requiredProperty key="classNamePrefix">
            <defaultValue>${WordUtils.capitalize(artifactId.replaceAll("-", " ")).replaceAll(" ", "")}</defaultValue>
        </requiredProperty>        
    </requiredProperties>
</archetype-descriptor>

As you can see i tried to use WordUtils (from apache-commons) but i'm guessing this is not available because i'm getting an error. Error merging velocity templates:.... . I also tried different combinations of .replaceAll but i couldn't get the right format.

Does anyone know of a way to go from a-hypenated-string to a CamelCaseClassName in this case?

like image 334
Bob Brinks Avatar asked Apr 24 '14 10:04

Bob Brinks


1 Answers

There is no access to arbitrary java classes from Velocity, but you can call methods of existing objects. In the context of Maven archetype you can use methods from java.lang.String and a Velocity loop to get the job done.

#macro( ccase $str )
#foreach( $word in $str.split('-') )$word.substring(0,1).toUpperCase()$word.substring(1)#end
#end
#set( $classNamePrefix = "#ccase( $artifactId )" )

public class ${classNamePrefix}Application {
    // ...
}

If you are using a fileSet tag, add filtered="true" property to make sure source files are processed with Velocity.

See also:

  • http://velocity.apache.org/engine/1.4/user-guide.html#Loops

There's updated documentation for version 2.0: http://velocity.apache.org/engine/2.0/user-guide.html#loops

like image 97
anttix Avatar answered Sep 29 '22 17:09

anttix