blob: fb8c2ec298a3b53277245b92ebb08cb109d33607 [file] [log] [blame]
------
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>>>.
[]