Hi,

You actually can bind the assembly plugin to two different phases of the lifecycle, or even twice to the same phase. The key is to use the <plugin><executions /> block, rather than re-declare the plugin again. Below, you have two executions declared...you just need to put them in the same plugin section, and move the <configuration /> blocks into their corresponding <execution /> section.

One thing I will say, though, is that it may make more sense to wrtie a custom plugin that would use Maven to resolve the dependencies and inject them into your plugin, then iterate through them, grabbing any embedded resources that you need along the way. Then, when you've got all of the resources aggregated and ready to go, you can use the assembly plugin to package it all up. FWIW, I've been thinking for awhile now about creating some formal extension points in the assembly plugin, that would allow you to do this sort of aggregation during the normal course of the assembly process. Unfortunately, it's not in place yet. :-(


HTH,

-john



On Jun 4, 2007, at 5:53 AM, James Abley wrote:

On 04/06/07, James Abley <[EMAIL PROTECTED]> wrote:
Hi,

I am trying to create an assembly that I can deploy to our internal repository.

The envisaged steps in this process are:

1) Get all of the dependencies.
2) Do some final packaging; e.g. consolidate all SQL creation scripts
into a single script.
3) Create a zip file ready for deployment.

I'm trying to work out the best way of structuring the module
responsible for doing this.

Can I do it all in a single module, by binding different plugins to
the appropriately sequenced phase?

e.g.

1) Use maven-assembly-plugin bound to compile to create a temporary
working directory of all of the dependencies.
2) Use maven-antrun-plugin bound to test to do the final packaging.
3) Use the maven-assembly-plugin bound to package to create a zip file.

Does this sound reasonable / feasible, should I be looking at multiple
modules straight away or some other approach?

It doesn't look like I can do this in one step. I can't declare the
maven-assembly-plugin twice in the same pom - it doesn't see the
second assembly descriptor.

   <build>
       <plugins>
           <!-- Get all of the dependencies for the installer -->
           <plugin>
               <artifactId>maven-assembly-plugin</artifactId>
               <configuration>
                   <appendAssemblyId>false</appendAssemblyId>
                   <descriptors>
                       <descriptor>
                           src/main/assembly/dep.xml
                       </descriptor>
                   </descriptors>
               </configuration>
               <executions>
                   <execution>
                       <id>create-directories</id>
                       <phase>compile</phase>
                       <goals>
                           <goal>directory-inline</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
           <plugin>
               <!-- Do any final packaging tasks. -->
               <artifactId>maven-antrun-plugin</artifactId>
               <executions>
                   <execution>
                       <!--
                           this needs to get executed before the
final assembly plugin.
                       -->
                       <phase>test</phase>
                       <goals>
                           <goal>run</goal>
                       </goals>
                       <configuration>
                           <tasks>
                               <!-- Create single DDL file for each
database vendor -->
                               <ant
antfile="${basedir}/src/main/ant/ ddl.xml"
                                   inheritRefs="true">
                                   <property
name="mpinstall.dependencies.dir"

value="${project.build.directory}/${project.build.finalName}.dir" />
                               </ant>
                           </tasks>
                       </configuration>
                   </execution>
               </executions>
               <dependencies>
                   <dependency>
                       <!-- Include for <echoproperties/> -->
                       <groupId>org.apache.ant</groupId>
                       <artifactId>ant-nodeps</artifactId>
                       <version>1.7.0</version>
                   </dependency>
               </dependencies>
           </plugin>
           <plugin>
               <artifactId>maven-assembly-plugin</artifactId>
               <configuration>
                   <descriptor>
                       src/main/assembly/package.xml
                   </descriptor>
               </configuration>
               <executions>
                   <execution>
                       <id>make-assembly</id>
                       <!--
append to the packaging phase. This will let us deploy the zip file to the internal repository
                           sites.
                       -->
                       <phase>package</phase>
                       <goals>
                           <goal>attached</goal>
                       </goals>
                   </execution>
               </executions>
           </plugin>
       </plugins>
   </build>


The second use of the maven-assembly-plugin shows that it is using the
descriptor src/main/assembly/dep.xml again, which isn't what I want.
That means that it misses out the changes done in the ANT target which
is the point of splitting out the process into more steps.

If I don't declare the plugin twice and instead specify two
descriptors in the single maven-assembly-plugin declaration, how do I
ensure that the correct descriptor is used at the correct time?



So I tried the other way of splitting it out into multiple modules:

I have one module that draws in all the dependencies and does the
inline-directory thing prior to using ANT to do some other stuff, and
then have a second module which uses a fileset to reference the
artifacts generated by the first assembly plugin / ANT combination.

This seems to do more or less what I want, but the baseDirectory of
the resulting zip is not what is required.

e.g.

MyProject module containing MyProject-dependencies and
MyProject-packaging modules.

ls  MyProject-dependencies/target/MyProject-dependencies-finalName

wars
db
docs

(Looks good.)

unzip -l MyProjectp-packaging/target/MyProject-packaging-finalName.zip
../MyProject-dependencies/target/MyProject-dependencies-finalName/wars
./MyProject-dependencies/target/MyProject-dependencies-finalName/db
./MyProject-dependencies/target/MyProject-dependencies-finalName/docs

(I don't want that MyProject-dependencies/target prefix here!)

How best to get rid of the ../MyProject-dependencies/target directory?
My initial reaction is to use another ANT task before the final zip to
copy the content into MyProject-packaging, maybe do the zip in ANT if
I need that level of control and use a <files/> element in the
assembly descriptor.

That would seem like not the Maven way. Any other suggestions?

Cheers,

James


Cheers,

James


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---
John Casey
Committer and PMC Member, Apache Maven
mail: jdcasey at commonjava dot org
blog: http://www.ejlife.net/blogs/john


Reply via email to