blob: e592eb04123f3a1384b1cd7fd3865921f5c6da3e [file] [log] [blame]
-----
Archetypeng - Archetype handcraft
-----
The Maven Team
-----
Handcrafting archetype
* Archetype
An archetype is a kind of Maven 2 project which defines its packaging to
maven-plugin and which follow a particular directory convention.
+--
|-- pom.xml
`-- src
`-- main
`-- resources
|-- META-INF
| `-- maven
| `-- archetype.xml
`-- archetype-resources
|-- pom.xml
`-- src ...
+--
There is two kind of archetypes: partial or complete. Complete archetypes
are used to generate new Maven 2 project, a class library for example.
Partial archetypes are used to add a new functionality to a project's build,
the use of the modello plugin for example.
An archetype defines at least 3 files in its tree.
* The archetype pom is located at the root of the project.
It defines the archetype's groupId, artifactId, version and name.
The name and version of the archetype are used during the selection step
of the generation.
Here is an example of archetype pom.
+--
<?xml version="1.0" encoding="UTF-8"?>
<project>
<groupId>org.codehaus.mojo.archetypeng.test</groupId>
<artifactId>test-start-archetype</artifactId>
<packaging>maven-plugin</packaging>
<version>1.0-SNAPSHOT</version>
</project>
+--
* The archetype descriptor is located in the src/main/resources/META-INF/maven
directory and named archetype.xml.
The descriptor defines the kind of archetype (complete or partial),
the archetype properties and the templates.
Here is an example of archetype descriptor.
+--
<?xml version="1.0" encoding="UTF-8"?>
<archetype>
<name>test-start-archetype</name>
<site-group />
<required-properties>
<required-property>
<key>aProperty</key>
<default-value>String searched in the sources</default-value>
</required-property>
</required-properties>
<sources-groups>
<sources-group>
<language>java</language>
<templates>
<template>App.java</template>
</templates>
</sources-group>
</sources-groups>
<test-sources-groups>
<test-sources-group>
<language>java</language>
<templates>
<template>AppTest.java</template>
</templates>
</test-sources-group>
</test-sources-groups>
</archetype>
+--
* The templates are located in the src/main/resources/archetype-resources
directory which is the templates root directory.
There must be at least one template named pom.xml located at the root of
the template directory. This is the generated project's pom.
The other templates are the sources, resources and site templates.
* The descriptor explained
The archetype descriptor leads the project generation by defining each of
the properties used for the template merge. It also defines each of the
templates which will be merged with the configured properties to generate
the sources of the generated project.
The archetype.xml file contains the following elements :
* name: The name of the archetype.
+--
<archetype>
...
<name>test-start-archetype</name>
...
</archetype>
+--
* partial: If the archetype is complete or partial. It is set to true if the
archetype is partial. It can be omited and defaults to a complete archetype.
+--
<archetype>
...
<partial>true</partial>
...
</archetype>
+--
* required-properties: The list of the required properties.
Here is a required property named propertyWithDefaultValue defining a
default value containing "the default value". During generation of the
archetype, when a template contains this property, it will be replaced by
the default value unless it is overrided.
+--
<archetype>
...
<required-properties>
...
<required-property>
<key>propertyWithDefaultValue</key>
<default-value>the default value</default-value>
</required-property>
...
</required-properties>
...
</archetype>
+--
The default-value element can be omited and that property must be set
during the configuration step of the generation.
The required-properties can be omited if the archetype defines no required
properties.
Archetypes always define four common required properties without defaut
values. These common properties are: groupId, artifactId, version and
package. The groupId, artifactId and version will be the ones of the
generated project. The package will be used in the sources templates.
All the properties (common and archetype specific) are velocity
properties. The properties must be named without a dot, because velocity
uses the dot for getting inner properties. See in the
{{{http://velocity.apache.org/engine/releases/velocity-1.5/vtl-reference-guide.html}VTL}}
guide for more information.
* sources-groups: The list of the sources templates grouped by language.
The sources-groups can be omited if the archetype don't have sources.
Here the extract of the descriptor for a sources group for the c language.
The templates of this group uses the ISO-8859-1 encoding. And it also
contains one template file named App.c.
+--
<archetype>
...
<sources-groups>
...
<sources-group>
<language>c</language>
<encoding>ISO-8859-1</encoding>
<templates>
...
<template>App.c</template>
...
</templates>
</sources-group>
...
</sources-groups>
...
</archetype>
+--
A sources-group must define at least one template.
The language can be omited to default to java.
The encoding can be omited to default to UTF-8.
The sources templates files must be located in the directory
src/main/{language} from the templates directory.
A template can be defined in a subdirectory like subfolder/AlternateApp.c.
The sources files are generated in the with the same name of the template
file name. They are generated from the generated project's root directory
in the directory src/main/{language}/{package as subdirectories}/{template defined sudirectory}.
Having the same name as templates, allow to have some xml or properties
files generated using the package as subdirectory replacement.
* test-sources-groups: The list of the test sources templates grouped by
language.
Test sources groups works the same as the sources groups but differ in
that the templates must be located in src/test/{language} from the
templates directory and the project's files are generated to
src/test/{language}/{package as subdirectories}/{template defined sudirectory}.
+--
<archetype>
...
<test-sources-groups>
...
<test-sources-group>
<templates>
...
<template>AppTest.java</template>
...
</templates>
</test-sources-group>
...
</test-sources-groups>
...
</archetype>
+--
* resources-groups: The list of resources templates grouped by directory.
The resources-groups can be omited if the archetype don't have resources.
Here the extract of the descriptor for a resources group for the mdo
directory.
The templates of this group uses the default UTF-8 encoding.
+--
<archetype>
...
<resources-groups>
...
<resources-group>
<directory>mdo</directory>
<templates>
...
<template>App.mdo</template>
...
</templates>
</resources-group>
...
</resources-groups>
...
</archetype>
+--
A resources-group must define at least one template.
The directory can be omited to default to <resources>.
The encoding can be omited to default to UTF-8.
The resources templates files must be located in the directory
src/main/{directory} from the templates directory.
A template can be defined in a subdirectory like subfolder/logging.properties.
The resources files are generated in the with the same name of the template
file name. They are generated from the generated project's root directory
in the directory src/main/{directory}/{template defined sudirectory}.
* test-resources-groups: The list of the test resources templates grouped by
directory.
Test resources groups works the same as the resources groups but differ in
that the templates must be located in src/test/{directory} from the
templates directory and the project's files are generated to
src/test/{directory}/{template defined sudirectory}.
+--
<archetype>
...
<test-resources-groups>
...
<test-resources-group>
<templates>
...
<template>AppTest.properties</template>
...
</templates>
</test-resources-group>
...
</test-resources-groups>
...
</archetype>
+--
* site-group: The list of site templates.
Site group works the same as the resources groups but differ in that the
templates must be located in src/site from the templates directory, that
they dont have a directory and the project's files are generated to
src/site/{template defined sudirectory}.
+--
<archetype>
...
<site-group>
<templates>
...
<template>site.xml</template>
<template>apt/test.apt</template>
...
</templates>
</site-group>
...
</archetype>
+--