You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by "Davy Toch (JIRA)" <ji...@codehaus.org> on 2005/07/31 16:33:57 UTC

[jira] Created: (MPMULTIPROJECT-55) Example more generic usage multiproject goals.

Example more generic usage multiproject goals.
----------------------------------------------

         Key: MPMULTIPROJECT-55
         URL: http://jira.codehaus.org/browse/MPMULTIPROJECT-55
     Project: maven-multiproject-plugin
        Type: Improvement
    Versions: 1.4.1    
 Environment: Not of importance.
 Reporter: Davy Toch
 Assigned to: Brett Porter 


One of the problems I have with Maven 1 (currently using maven-1.1-beta-1) is knowing which goals can be executed on a certain project depends on the project type. For example if the project is of type 'jar', then jar:install should be called, while for a project of type 'ejb', ejb:install should be called. To avoid that the developer needs to know this, it is possible to create a custom maven.xml file. This could then include a goal 'install' that calls 'jar:install' for projects of type 'jar' and 'ejb:install' for projects of type 'ejb'. This way the developer could always call 'install', independent of the current project type. This is also more consistent with the approach of most IDE's (Eclipse, JBuilder, ...) where independent of project type, the tasks to call are build, rebuild, clean, ....

However, the above approach would need a custom maven.xml file. In order to avoid this, I had a look at the multiproject plugin that already has generic goals (e.g. multiproject:artifact, multiproject:install, ...).

On the website of the multiproject plugin they propose e.g.
A. create a kind of 'master' project from which subprojects can inherit the POM configuration

This master project has the following properties:

maven.multiproject.basedir=..
maven.multiproject.includes=*/project.xml
maven.multiproject.excludes=master/project.xml

Remark that with the above configuration the 'master' project has to be present in a folder 'master' that is on the same level as its subprojects. This flat project structure approach is chosen to avoid problems with the Eclipse IDE.

B. different subprojects are defined on the same level as the 'master' project with the following property:

maven.multiproject.type=jar (or ejb, war, ear, ...)

This way you can e.g. call multiproject:artifact in the master project that will automatically call the necessary goal in the subprojects (jar:jar, ejb:ejb). However, if you only want to create the artifact for one subproject, you should go to the subproject and call jar:jar, ejb:ejb, .... Therefore the name of the goal to call is again different.

A solution for this I have thought of is : define each Maven project as a multiproject, meaning that for the subprojects in B., the following properties are also defined (but with different values then in A.):

maven.multiproject.basedir=${basedir}
maven.multiproject.includes=project.xml
maven.multiproject.excludes=

On the other hand it is also useful to define the following in the master project:

maven.multiproject.type=master

With the above configuration you can:
- call multiproject:artifact in the 'master' project : will generate all artifacts of the subprojects
- call multiproject:artifact in a subproject : will generate the artifact for the subproject
- ...

Unfortunately, on http://maven.apache.org/reference/plugins/multiproject/properties.html the following is stated about the property maven.multiproject.includes:

"The 'top-level' project that you use to run maven multiproject  must not be included in the set of projects to be processed."

Question : why this restriction?

Remarks : 
1. My multiproject approach has the following restrictions/problems:
- only subprojects of the 'master' project should create artifacts, not the 'master' project itself (the master project is only used to avoid POM configuration duplication)
- the master project can't inherit from another project itself
- the subprojects are the base leaves in the inheritance tree, meaning that no other projects can inherit from the subprojects
- reactor is always called
- not fully tested when calling the goals to create the website
- other problems?

2. Having maven.multiproject.type=master defined in the 'master' project is e.g. useful when working in Eclipse, because calling the generic goal multiproject:goal on the master project only calls the goal on the subprojects. However, if you want to work with your projects in Eclipse, you should also be able to generate the Eclipse project files (.classpath, ...) for the master project because otherwise you won't be able to call Maven goals on the master project from the Eclipse IDE. With maven.multiproject.type=master, you can have a custom goal 'generate-eclipse-files' (or similar) in a script maven.xml:

  <goal name="generate-eclipse-files">

    <j:set var="type"
      value="${context.getVariable('maven.multiproject.type')}"/>

    <attainGoal name="eclipse"/>

    <!--
      If the current project type is 'master', then the eclipse goal should
      also be called on the subprojects.
    -->
    <j:if test="${type == 'master'}">
      <attainGoal name="multiproject:goal">
        <j:set var="goal" value="eclipse"/>
      </attainGoal>
    </j:if>
  </goal>

This goal is generic and can thus be put in 'master' projects or subprojects, so my intent is satisfied: minimize custom scripting in maven.xml and if scripting is really necessary, make it as generic as possible. On the other hand, I think it would be easy to create a goal multiproject:run-goal-on-all in the maven multiproject plugin that is similar to multiproject:goal but that can run the goal on the parent project as well. This would avoid having to write a custom script maven.xml.

Regards,
Davy Toch

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


[jira] Updated: (MPMULTIPROJECT-55) Example more generic usage multiproject goals.

Posted by "Brett Porter (JIRA)" <ji...@codehaus.org>.
     [ http://jira.codehaus.org/browse/MPMULTIPROJECT-55?page=all ]

Brett Porter updated MPMULTIPROJECT-55:
---------------------------------------

    Assign To:     (was: Brett Porter)

> Example more generic usage multiproject goals.
> ----------------------------------------------
>
>          Key: MPMULTIPROJECT-55
>          URL: http://jira.codehaus.org/browse/MPMULTIPROJECT-55
>      Project: maven-multiproject-plugin
>         Type: Improvement
>     Versions: 1.4.1
>  Environment: Not of importance.
>     Reporter: Davy Toch

>
>
> One of the problems I have with Maven 1 (currently using maven-1.1-beta-1) is knowing which goals can be executed on a certain project depends on the project type. For example if the project is of type 'jar', then jar:install should be called, while for a project of type 'ejb', ejb:install should be called. To avoid that the developer needs to know this, it is possible to create a custom maven.xml file. This could then include a goal 'install' that calls 'jar:install' for projects of type 'jar' and 'ejb:install' for projects of type 'ejb'. This way the developer could always call 'install', independent of the current project type. This is also more consistent with the approach of most IDE's (Eclipse, JBuilder, ...) where independent of project type, the tasks to call are build, rebuild, clean, ....
> However, the above approach would need a custom maven.xml file. In order to avoid this, I had a look at the multiproject plugin that already has generic goals (e.g. multiproject:artifact, multiproject:install, ...).
> On the website of the multiproject plugin they propose e.g.
> A. create a kind of 'master' project from which subprojects can inherit the POM configuration
> This master project has the following properties:
> maven.multiproject.basedir=..
> maven.multiproject.includes=*/project.xml
> maven.multiproject.excludes=master/project.xml
> Remark that with the above configuration the 'master' project has to be present in a folder 'master' that is on the same level as its subprojects. This flat project structure approach is chosen to avoid problems with the Eclipse IDE.
> B. different subprojects are defined on the same level as the 'master' project with the following property:
> maven.multiproject.type=jar (or ejb, war, ear, ...)
> This way you can e.g. call multiproject:artifact in the master project that will automatically call the necessary goal in the subprojects (jar:jar, ejb:ejb). However, if you only want to create the artifact for one subproject, you should go to the subproject and call jar:jar, ejb:ejb, .... Therefore the name of the goal to call is again different.
> A solution for this I have thought of is : define each Maven project as a multiproject, meaning that for the subprojects in B., the following properties are also defined (but with different values then in A.):
> maven.multiproject.basedir=${basedir}
> maven.multiproject.includes=project.xml
> maven.multiproject.excludes=
> On the other hand it is also useful to define the following in the master project:
> maven.multiproject.type=master
> With the above configuration you can:
> - call multiproject:artifact in the 'master' project : will generate all artifacts of the subprojects
> - call multiproject:artifact in a subproject : will generate the artifact for the subproject
> - ...
> Unfortunately, on http://maven.apache.org/reference/plugins/multiproject/properties.html the following is stated about the property maven.multiproject.includes:
> "The 'top-level' project that you use to run maven multiproject  must not be included in the set of projects to be processed."
> Question : why this restriction?
> Remarks : 
> 1. My multiproject approach has the following restrictions/problems:
> - only subprojects of the 'master' project should create artifacts, not the 'master' project itself (the master project is only used to avoid POM configuration duplication)
> - the master project can't inherit from another project itself
> - the subprojects are the base leaves in the inheritance tree, meaning that no other projects can inherit from the subprojects
> - reactor is always called
> - not fully tested when calling the goals to create the website
> - other problems?
> 2. Having maven.multiproject.type=master defined in the 'master' project is e.g. useful when working in Eclipse, because calling the generic goal multiproject:goal on the master project only calls the goal on the subprojects. However, if you want to work with your projects in Eclipse, you should also be able to generate the Eclipse project files (.classpath, ...) for the master project because otherwise you won't be able to call Maven goals on the master project from the Eclipse IDE. With maven.multiproject.type=master, you can have a custom goal 'generate-eclipse-files' (or similar) in a script maven.xml:
>   <goal name="generate-eclipse-files">
>     <j:set var="type"
>       value="${context.getVariable('maven.multiproject.type')}"/>
>     <attainGoal name="eclipse"/>
>     <!--
>       If the current project type is 'master', then the eclipse goal should
>       also be called on the subprojects.
>     -->
>     <j:if test="${type == 'master'}">
>       <attainGoal name="multiproject:goal">
>         <j:set var="goal" value="eclipse"/>
>       </attainGoal>
>     </j:if>
>   </goal>
> This goal is generic and can thus be put in 'master' projects or subprojects, so my intent is satisfied: minimize custom scripting in maven.xml and if scripting is really necessary, make it as generic as possible. On the other hand, I think it would be easy to create a goal multiproject:run-goal-on-all in the maven multiproject plugin that is similar to multiproject:goal but that can run the goal on the parent project as well. This would avoid having to write a custom script maven.xml.
> Regards,
> Davy Toch

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org