Aaaaah, nice! I did not know that. Great stuff :) Regards, Jakob
2011/10/23 Mark Struberg <strub...@yahoo.de>: >> With this approach each MyFaces >> subproject would be able to pick out only the stuff it really needs. > > This is not needed if we use the maven-shade-plugin <minimizeJar> option [1] ! > > With <minimizeJar> enabled the dependency classes are analyzed and only the > classes which really got used will get shaded into the destination jar. The > only limitation is when some classes get loaded via Class.forName() or > similar. But as long as there is a bytecode invocation it will work smoothly. > > Thus I really see no reason why we cannot use maven-shared these days! > > Thus also a formal +1 from me. > > LieGrue, > strub > > > > [1] > http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#minimizeJar > > > ----- Original Message ----- >> From: Jakob Korherr <jakob.korh...@gmail.com> >> To: MyFaces Development <dev@myfaces.apache.org>; Mark Struberg >> <strub...@yahoo.de> >> Cc: >> Sent: Sunday, October 23, 2011 12:00 PM >> Subject: Re: [DISCUSS] how to get rid of tons of duplicated code >> >> Hi Mark, >> >> +1 - that's exactly what I have been trying to accomplish some time >> ago (introducing common-shades [1]). Unfortunately, I was not >> successful back then. >> >> However, there is a slight problem with moving all this stuff into >> MyFaces shared, which I want to point out: code size. If we really put >> all the code that is shared across any MyFaces subproject into shared, >> it will get fat and ugly (even more than it is right now). In >> addition, if we continue including the whole shared project into >> MyFaces core, MyFaces core impl will get bigger and bigger. >> >> Thus I'd like to suggest something similar which I wanted to >> accomplish with common-shades: Introduce a new shared module, which >> consists of many submodules that each handle a specific functionality >> instead of being one fat module. With this approach each MyFaces >> subproject would be able to pick out only the stuff it really needs. >> Furthermore we would see more easily which code in shared is not used >> anymore (I guess at the moment there is a lot of it), just by checking >> which modules are still used in our poms. >> >> Regards, >> Jakob >> >> [1] https://svn.apache.org/repos/asf/myfaces/common-shades/ >> >> 2011/10/23 Mark Struberg <strub...@yahoo.de>: >>> Hi! >>> While working on the mafyces-commons cleanup I figured that we have tons of >>> duplicated code spread over MyFaces. >>> >>> >>> As an example I like to mention myfaces-commons-resourcehandler. There are >>> 43 classes in total, and 35 of them are just 1:1 copied from other projects >>> to provide resource management, zip, etc. For me this is an absolute no-go. >>> Those classes have neither tests nor any documentation where they got >> forked >>> from. Nor will any bug which gets fixed in another module make it's way >> over >>> to all the other projects containing that very forked code. That's just >> ... >>> unbelievable unmaintainable. >>> >>> There are 2 different ways to solve this (depending on the problem): >>> >>> A.) drop the functionality and provide a generalized solution. The GZIP of >>> myfaces-commons-resourcehandleris an obvious example: >>> We now copy this code over the 4th time or even more. Instead of doing >> this, >>> we should rather do it in the classic unix fashion: do one thing, but do it >>> well. >>> Which means I'd rather see all the GZIP stuff factored out into an own >>> mf-commons module as a Servlet Filter. This can then get applied to what >>> ever other mechanism you like. This could also (commonly) cover cases like >>> detecting http UserAgents which are not able to handle zipped resources, >>> etc. That way we could provide this logic ONCE and have complete freedom >>> over the configuration. >>> >>> B.) code reusable components once and use them in other projects (ev via >>> shading it in). >>> ClassLoaderResourceLoader would be a perfect candidate! I grepped through >>> only the few pits which I have checked out locally and found this class 7 >>> SEVEN times! I just can't believe that we can't move this stuff to >> a shared >>> modul... >>> >>> Same for FacesServletMapping. 6 times copied around, >>> WebConfigProviderFactory 5 times, ... >>> There are whole packages with 10++ classes which got copied 1:1! >>> >>> I really could cry seeing this :( >>> >>> >>> What can we do to solve this? >>> >>> Theoretically myfaces-shared should contain this stuff. This is exactly >> what >>> it is for! >>> Historically there have been some hand forged tweeks and ugly hacks, but >>> nowadays we have the maven-shade-plugin to make our live easier. >>> >>> So the suggestion is: >>> >>> 1.) cleanup myfaces-shared. mf-shared has almost no checkstyle rules >>> applied. >>> 2.) add unit tests for myfaces-shared. Currently there are not many... >>> 3.) move the shared code parts back to myfaces-shared and add unit tests. >>> 4.) import myfaces-shared via maven dependency and use <minimizeJar> >> and >>> <relocations> to package the stuff >>> >>> [+1] fine go ahead (ideally: yes, what parts can I help with?) >>> [0] dont care >>> [-1] wont work because ... >>> >>> >>> I've attached a file which contains all Classes which name exists >> multiple >>> times in MyFaces. The number is the cound how often they exist in MyFaces. >> I >>> excluded current20. >>> Please note that classes with the same name do not necessarily have the >> same >>> content - but quite a lot actually do have! (scroll to the bottom of the >>> file ...) >>> >>> LieGrue, >>> strub >>> >> >> >> >> -- >> Jakob Korherr >> >> blog: http://www.jakobk.com >> twitter: http://twitter.com/jakobkorherr >> work: http://www.irian.at >> > -- Jakob Korherr blog: http://www.jakobk.com twitter: http://twitter.com/jakobkorherr work: http://www.irian.at