 -----
 Archetypeng - Creation
 -----
 The Maven Team
 -----

Creation

    Creating an archetype from a project involves two steps:

    * the configuration of the archetype

    * and the effective creation based on the collected information.

    []

    At the end of these steps, you have a Maven 2 archetype created in the
    target/generated-sources/archetypeng directory.

    It is possible to use the generation plugin in {{{#Batch}batch}} mode.

* Archetype configuration

    During this step, you are successivly prompted to:

    * define the archetype's groupId, artifactId and version,

    * define the common properties' values (used for reverse templating),

    * define the archetype's properties and values (used for reverse templating),

    * confirm the configuration.

    []

    A properety file containing the archetype definition and the archetype's
    properties is written at the end of this step.

    The packageName property provides a default value of the guessed package of
    the project based on the packages of the project's sources.

* Archetype creation

    During this step, the plugin creates a Maven 2 archetype based on the
    project's sources and pom and on the configuration collected.


* Example of use

    To create an archetype, call <mvn archetypeng:create-from-project>.


+--
[rafale@fixe test-start]$ tree
.
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- org
    |           `-- codehaus
    |               `-- mojo
    |                   `-- archetypeng
    |                       `-- test
    |                           `-- start
    |                               `-- App.java
    `-- test
        `-- java
            `-- org
                `-- codehaus
                    `-- mojo
                        `-- archetypeng
                            `-- test
                                `-- start
                                    `-- AppTest.java

17 directories, 3 files
+--

    Here is a sample project (the one generated by the
    {{{generation.html}generation}} :-)).

+--
[rafale@fixe test-start]$ mvn archetypeng:create-from-project
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetypeng'.
[INFO] artifact org.codehaus.mojo:maven-archetypeng-plugin: checking for updates from central
[INFO] ----------------------------------------------------------------------------
[INFO] Building test-start
[INFO]    task-segment: [archetypeng:create-from-project]
[INFO] ----------------------------------------------------------------------------
[INFO] Preparing archetypeng:create-from-project
+--

    The first step of the creation: <configure-creation>

+--
[INFO] [archetypeng:configure-creation]
Define value for archetype.groupId:  org.codehaus.mojo.archetypeng.test: :
Define value for archetype.artifactId:  test-start-archetype: :
Define value for archetype.version:  1.0-SNAPSHOT: :
Define value for groupId:  org.codehaus.mojo.archetypeng.test: :
Define value for artifactId:  test-start: :
Define value for version:  1.0-SNAPSHOT: :
+--

    Archetype definition (archetype.*) and common properties are defined using
    the proposed default values.

+--
Add a new custom property Y: : Y
Define property key: aProperty
Define value for aProperty: : String searched in the sources
Add a new custom property Y: : N
+--

    A custom property is added to the project creation.

+--
Confirm archetype configuration:
archetype.groupId: org.codehaus.mojo.archetypeng.test
archetype.artifactId: test-start-archetype
archetype.version: 1.0-SNAPSHOT
package: org.codehaus.mojo.archetypeng.test.start
version: 1.0-SNAPSHOT
groupId: org.codehaus.mojo.archetypeng.test
aProperty: String searched in the sources
artifactId: test-start
 Y: : Y
+--

    The archetype configuration is confirmed.

+--
[INFO] [archetypeng:create-archetype]
+--

    The second step do the work without any comment.

+--
[INFO] [archetypeng:create-from-project]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 29 seconds
[INFO] Finished at: Mon Mar 12 19:09:52 CET 2007
[INFO] Final Memory: 10M/24M
[INFO] ------------------------------------------------------------------------
+--

    The resuting project is created in the target directory.

+--
[rafale@fixe test-start]$ tree target/generated-sources/archetypeng
target/generated-sources/archetypeng
|-- pom.xml
`-- src
    `-- main
        `-- resources
            |-- META-INF
            |   `-- maven
            |       `-- archetype.xml
            `-- archetype-resources
                |-- pom.xml
                `-- src
                    |-- main
                    |   `-- java
                    |       `-- App.java
                    `-- test
                        `-- java
                            `-- AppTest.java

11 directories, 5 files
+--

* {Batch} mode

    To enable the batch mode and remove the prompts, just run
    <mvn archetypeng:create-from-project -B>.

    The batch mode wiil need the same answers as the interactive mode. These
    answers are provided in a property file named archetype.properties in the
    execution directory or set using the command line property
    <-Darchetype.properties=path/to/archetype.properties>.

    Here is an example of archetype.properties file (the one generated by the
    interactive creation :-)).

+--
[rafale@fixe test-start]$ cat archetype.properties
#
#Mon Mar 12 19:09:51 CET 2007
version=1.0-SNAPSHOT
package=org.codehaus.mojo.archetypeng.test.start
archetype.groupId=org.codehaus.mojo.archetypeng.test
archetype.artifactId=test-start-archetype
groupId=org.codehaus.mojo.archetypeng.test
artifactId=test-start
archetype.version=1.0-SNAPSHOT
+--

    Here is the plugin execution.

+--
[rafale@fixe test-start]$ tree
.
|-- archetype.properties
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- org
    |           `-- codehaus
    |               `-- mojo
    |                   `-- archetypeng
    |                       `-- test
    |                           `-- start
    |                               `-- App.java
    `-- test
        `-- java
            `-- org
                `-- codehaus
                    `-- mojo
                        `-- archetypeng
                            `-- test
                                `-- start
                                    `-- AppTest.java

17 directories, 4 files
+--

    Ensure the property file exists.

+--
[rafale@fixe test-start]$ mvn archetypeng:create-from-project -B
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetypeng'.
[INFO] artifact org.codehaus.mojo:maven-archetypeng-plugin: checking for updates from central
[INFO] ----------------------------------------------------------------------------
[INFO] Building test-start
[INFO]    task-segment: [archetypeng:create-from-project]
[INFO] ----------------------------------------------------------------------------
[INFO] Preparing archetypeng:create-from-project
[INFO] [archetypeng:configure-creation]
[INFO] [archetypeng:create-archetype]
[INFO] [archetypeng:create-from-project]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16 seconds
[INFO] Finished at: Mon Mar 12 19:13:22 CET 2007
[INFO] Final Memory: 10M/24M
[INFO] ------------------------------------------------------------------------
+--

    The project tree is the same as in the interactive mode.
