Thanks again for all your help, although I've come up with a slightly
different solution.   Was not comfortable splitting the config + jars up,
especially as I am going to have a minimum of 20 odd modules in this project
(its fairly large / diverse).

So if anyone is interested / has this problem this is what I did:

I used the src/main/resources folder of each module. In there I have created
3 folders mpApp-root, myApp-config, myApp-otherConfig (well, not those exact
names). Each module / artifact is a jar. with that inside, e.g:

Parent
--ModuleA
----src/main/java
----src/main/resources
------src/main/resources/myApp-config
------src/main/resources/myApp-otherConfig
------src/main/resources/myApp-root
--ModuleB
----src/main/java
----src/main/resources
------src/main/resources/myApp-config
------src/main/resources/myApp-otherConfig
------src/main/resources/myApp-root

I created another module (myApp-dist) and made it depend on all other
modules I want to distribute in my test build (eventually this will probably
be a separate project). Its the pom in this module I define my overall
build.

The build defines 3 custom assemblies:

1. uses dependencySet with exclude "myApp-*/**" to jar up all dependencies
into a monster jar.  i.e. I get just a jar of all classes without special
resource folders.
2. uses dependencySet with include "myApp-*/**" to just includes the myApp-*
special folders, this assemble outputs to format "dir".
3. Defines filesets to include in a tar.gz. So the main dist jar created by
the 1st assembler and then all the special folders.  The cool thing is you
can define the output directory so myApp-root contents goes to ./,
myApp-config goes ./config etc.

The result is along the lines of a tar.gz with contents:

./myApp-version/config
./myApp-version/otherConfig
./myApp-version/artifact-version-dist.jar
./some.properties
./readme.txt

Sucks a little creating special folders that do magic things in the build
but its not too bad.  One odd little side effect is putting a - in the
resource folder name means it cant be used as a java package... handy to
ensure some random java package does not clash with a special folder and
accidentally get its .class excluded from the dist jar.

Also to get this building and packaging locally, mvn install is quite a
useful command :P

Tried gradle, think it had the potential to suit my build better but
ultimately using it with eclipse, defining new modules etc, it was clunky. 

Cheers,
Jon


Jon Paynter wrote:
> 
> On Tue, Nov 9, 2010 at 8:34 AM, jon.mithe <jon.mi...@gmail.com> wrote:
> 
>>
>> Interesting.  I think I have found some unpacking elements in the
>> assembly
>> plugin when I write my own descriptor.  So it may be possible... needs
>> more
>> research.
>>
>> I think I understand what you are saying about separating the config from
>> the binaries.  But I'm not sold on the idea of creating it in a different
>> project.  The way I'm trying to do it, the code + the config is
>> completely
>> separate, i.e. its not jar'ed with the classes and I do not have any
>> issues
>> with duplication.  The code and the config is a tightly linked enitity so
>> I
>> feel uneasy about splitting them into 2 separate projects (albeit linked
>> by
>> a dependency).
>>
>> What concerns me most is I feel that doing it this way would be a work
>> around for the way maven builds, i.e. I'm starting to think my project
>> does
>> not seem to fit nicely with maven way of doing things :/
>>
>> Thanks again for all you help, I'm not giving up on maven yet but I think
>> I
>> need to take a more in depth look at gradle and see if it fits this any
>> better.
>>
> I recently finished solving a very simmilar problem. with trying to
> package
> things.  Before conversion to maven, the structure looked like this (yes
> its
> using ant)
> Parent Project
> --Common configs
> --Module A
> ---- moduleA.jar
> ---- moduleA.ear
> ---- moduleA.war
> ---- src/config
> ---- build.xml
> --Module B
> ---- moduleB.jar
> ---- moduleB.ear
> ---- moduleB.war
> ---- src/config
> ---- build.xml
> /dist/ModuleA/ModuleA.ear
> /dist/ModuleA/config/
> /dist/ModuleB/ModuleB.ear
> /dist/ModuleB/config/
> 
> Once all the dust settled, I ended up with a structure like this:
> Parent Project
> --Common Configs
> ----src/main/other_resource_directory
> 
> --Module A
> ----src/main/config
> ----ModuleA_jar
> -------src/main/java
> ----ModuleA_war
> -------src/main/webapp
> ----ModuleA_ear
> -------src/main/META-INF
> ----ModuleA_Package
> -------src/main/assembly
> -------target/ModuleA.zip
> 
> --Module B
> ----src/main/config
> ----ModuleB_jar
> -------src/main/java
> ----ModuleB_war
> -------src/main/webapp
> ----ModuleB_ear
> -------src/main/META-INF
> ----ModuleB_Package
> -------src/main/assembly
> -------target/ModuleB.zip
> 
> Packaging_project
> ---target/dist/ModuleA/ModuleA.ear
> ---target/dist/ModuleA/config/
> ---target/dist/ModuleB/ModuleB.ear
> ---target/dist/ModuleB/config/
> 
> The key here was first to seperate things out so each project produces
> exactly one _binary_ artifact.  Then to seperate the packaging/assembly
> from
> the compiling.
> 
> In moduleA_package and moduleB_package, the resulting zip file is marked
> as
> attached, so it gets stored in the repository.
> the packaging_project then depends on only whats needed to distribute -
> which is just the zip file.  The zip file is unpacked into its proper
> directory.
> 
> the moduleA_package and moduleB_package are assemblies that do filtering
> and
> copying of the config files.  its not a very elagant solution to the
> common
> configs, but it does work.
> 
> 

-- 
View this message in context: 
http://maven.40175.n5.nabble.com/Custom-assembly-of-multi-module-project-tp3256773p3262443.html
Sent from the Maven - Users mailing list archive at Nabble.com.

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@maven.apache.org
For additional commands, e-mail: users-h...@maven.apache.org

Reply via email to