| ------ |
| Create an archetype with a property file |
| ------ |
| Raphaël Piéroni |
| ------ |
| 2011-09-30 |
| ------ |
| |
| ~~ Licensed to the Apache Software Foundation (ASF) under one |
| ~~ or more contributor license agreements. See the NOTICE file |
| ~~ distributed with this work for additional information |
| ~~ regarding copyright ownership. The ASF licenses this file |
| ~~ to you under the Apache License, Version 2.0 (the |
| ~~ "License"); you may not use this file except in compliance |
| ~~ with the License. You may obtain a copy of the License at |
| ~~ |
| ~~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~~ |
| ~~ Unless required by applicable law or agreed to in writing, |
| ~~ software distributed under the License is distributed on an |
| ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| ~~ KIND, either express or implied. See the License for the |
| ~~ specific language governing permissions and limitations |
| ~~ under the License. |
| |
| ~~ NOTE: For help with the syntax of this file, see: |
| ~~ http://maven.apache.org/doxia/references/apt-format.html |
| |
| Create an archetype with a property file |
| |
| Creating an archetype using a property file is possible by defining a text |
| file containing the properties that will lead the archetype creation, and by |
| calling the Archetype Plugin with the command line property |
| <<<archetype.properties>>> giving it the path to the property file. |
| |
| The directory above the would be archetype project: |
| |
| +-- |
| $ tree |
| . |
| |____archetype.properties |
| |____some-project |
| | |____pom.xml |
| | |____src |
| | | |____main |
| | | | |____groovy |
| | | | | |____com |
| | | | | | |____company |
| | | | | | | |____App.groovy |
| | | | |____java |
| | | | | |____com |
| | | | | | |____company |
| | | | | | | |____App.java |
| | | |____test |
| | | | |____java |
| | | | | |____com |
| | | | | | |____company |
| | | | | | | |____AppTest.java |
| | | | |____resources |
| | | | | |____App.properties |
| +-- |
| |
| The content of the property file: |
| |
| +-- |
| $ cat archetype.properties |
| archetype.groupId=my.group.id |
| archetype.artifactId=archetype-with-properties |
| archetype.version=2.0 |
| |
| archetype.filteredExtensions=java |
| archetype.languages=groovy |
| |
| an_additional_property=my specific value |
| +-- |
| |
| Creating the archetype: |
| |
| +-- |
| $ cd some-project |
| $ mvn archetype:create-from-project -Darchetype.properties=../archetype.properties |
| [INFO] Scanning for projects... |
| [INFO] Searching repository for plugin with prefix: 'archetype'. |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] Building some-project |
| [INFO] task-segment: [archetype:create-from-project] (aggregator-style) |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] Preparing archetype:create-from-project |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] Building some-project |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] No goals needed for project - skipping |
| [INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'. |
| [INFO] Setting property: velocimacro.messages.on => 'false'. |
| [INFO] Setting property: resource.loader => 'classpath'. |
| [INFO] Setting property: resource.manager.logwhenfound => 'false'. |
| [INFO] [archetype:create-from-project] |
| [INFO] Setting default groupId: com.company |
| [INFO] Setting default artifactId: some-project |
| [INFO] Setting default version: 1.0-SNAPSHOT |
| [INFO] Setting default package: com.company |
| [INFO] Archetype created in target/generated-sources/archetype |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] BUILD SUCCESSFUL |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] Total time: 2 seconds |
| [INFO] Finished at: Tue Sep 16 19:42:06 CEST 2008 |
| [INFO] Final Memory: 8M/15M |
| [INFO] ------------------------------------------------------------------------ |
| |
| $ cd target/generated-sources/archetype/ |
| $ mvn install |
| [INFO] Scanning for projects... |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] Building archetype-with-properties |
| [INFO] task-segment: [install] |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] [resources:resources] |
| [INFO] Using default encoding to copy filtered resources. |
| [INFO] [resources:testResources] |
| [INFO] Using default encoding to copy filtered resources. |
| [INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'. |
| [INFO] Setting property: velocimacro.messages.on => 'false'. |
| [INFO] Setting property: resource.loader => 'classpath'. |
| [INFO] Setting property: resource.manager.logwhenfound => 'false'. |
| [INFO] [archetype:jar] |
| [INFO] [archetype:add-archetype-metadata] |
| [INFO] [archetype:integration-test] |
| [INFO] [install:install] |
| [INFO] Installing /private/tmp/archetypes/some-project/target/generated-sources/archetype/target/archetype-with-properties-2.0.jar to /Users/raphaelpieroni/.m2/repository/my/group/id/archetype-with-properties/2.0/archetype-with-properties-2.0.jar |
| [INFO] [archetype:update-local-catalog] |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] BUILD SUCCESSFUL |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] Total time: 5 seconds |
| [INFO] Finished at: Tue Sep 16 19:43:57 CEST 2008 |
| [INFO] Final Memory: 10M/20M |
| [INFO] ------------------------------------------------------------------------ |
| +-- |
| |
| Using that archetype: |
| |
| +-- |
| $ mvn archetype:generate -DarchetypeCatalog=local |
| $ mvn archetype:generate -DarchetypeCatalog=local |
| [INFO] Scanning for projects... |
| [INFO] Searching repository for plugin with prefix: 'archetype'. |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] Building Maven Default Project |
| [INFO] task-segment: [archetype:generate] (aggregator-style) |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] Preparing archetype:generate |
| [INFO] No goals needed for project - skipping |
| [INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'. |
| [INFO] Setting property: velocimacro.messages.on => 'false'. |
| [INFO] Setting property: resource.loader => 'classpath'. |
| [INFO] Setting property: resource.manager.logwhenfound => 'false'. |
| [INFO] [archetype:generate] |
| [INFO] Generating project in Interactive mode |
| [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0) |
| Choose archetype: |
| 1: local -> archetype-with-properties (archetype-with-properties) |
| Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1 |
| Define value for groupId: : foo |
| Define value for artifactId: : bar |
| Define value for version: 1.0-SNAPSHOT: : |
| Define value for package: foo: : |
| Confirm properties configuration: |
| an_additional_property: my specific value |
| groupId: foo |
| artifactId: bar |
| version: 1.0-SNAPSHOT |
| package: foo |
| Y: : N |
| Define value for an_additional_property: my specific value: : my new value |
| Define value for groupId: : my.new.group |
| Define value for artifactId: : my-new-artifact |
| Define value for version: 1.0-SNAPSHOT: : |
| Define value for package: my.new.group: : |
| Confirm properties configuration: |
| an_additional_property: my new value |
| groupId: my.new.group |
| artifactId: my-new-artifact |
| version: 1.0-SNAPSHOT |
| package: my.new.group |
| Y: : |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] BUILD SUCCESSFUL |
| [INFO] ------------------------------------------------------------------------ |
| [INFO] Total time: 58 seconds |
| [INFO] Finished at: Tue Sep 16 19:51:09 CEST 2008 |
| [INFO] Final Memory: 8M/15M |
| [INFO] ------------------------------------------------------------------------ |
| +-- |
| |
| As you can see, the additional property is provided by default. As one want |
| to override the value, one just have to answer <<<N>>> to the first |
| confirmation, then the whole bunch of properties is proposed. |
| |
| The tree of the generated project show that the only language recognized as |
| such is groovy. The property <<<archetype.languages>>> gives the list of the |
| languages. The languages are the directories in <<<src/main>>> and |
| <<<src/test>>> that have the capacity to contain a "packaged" directory |
| tree. This means that the <<<package>>> value is used to generate the new |
| directory for that language. |
| |
| +-- |
| $ cd my-new-artifact/ |
| tree |
| . |
| |____pom.xml |
| |____src |
| | |____main |
| | | |____groovy |
| | | | |____my |
| | | | | |____new |
| | | | | | |____group |
| | | | | | | |____App.groovy |
| | | |____java |
| | | | |____com |
| | | | | |____company |
| | | | | | |____App.java |
| | |____test |
| | | |____java |
| | | | |____com |
| | | | | |____company |
| | | | | | |____AppTest.java |
| | | |____resources |
| | | | |____App.properties |
| +-- |
| |
| The contents of both App.groovy and App.java shows that the only filtered |
| files are java files. The property <<<archetype.filteredExtensions>>> gives |
| the list of file extensions that permit the filtering. In the example, only |
| the files whose names ending with <<<.java>>> are filtered. |
| |
| +-- |
| $ cat src/main/groovy/my/new/group/App.groovy |
| package com.company |
| |
| class App |
| { |
| def value = 'my specific value' |
| } |
| |
| $ cat src/main/java/com/company/App.java |
| package my.new.group; |
| |
| /** |
| * Hello world! |
| * |
| */ |
| public class App |
| { |
| String value = "my new value"; |
| public static void main( String[] args ) |
| { |
| System.out.println( "Hello World!" ); |
| } |
| } |
| +-- |
| |
| The languages and the filtered extensions are used even if that don't make |
| any sense. All the properties defined in the property file can be used |
| as command line properties. |
| |
| When undefined, the <<<archetype.languages>>> and <<<archetype.filteredExtensions>>> |
| properties are given sensible default values: |
| |
| * <<<archetype.languages>>> have: <<<java, xml, txt, groovy, cs, mdo, aj, |
| jsp, gsp, vm, html, xhtml, properties, .classpath, .project>>>. Notice |
| the dotted filtered extensions that contains the complete file names. |
| |
| * <<<archetype.filteredExtensions>>> have: <<<java, groovy, csharp, aspectj>>>. |
| |
| [] |