I also forgot one comparison.

>From my understaning, please correct me if I'm wrong:
- maven plugins are bound to phases, lifecycles specify the order of the phases
- easyant plugins are bound to extension points, the order derives
from dependencies between the extension points
- maven solves (plugin) dependencies through a chain of inheritance
- maven fills by default the lifecycle with goals depending on the
module packaging
- easyant can fill the lifecycle with build-type plugins (to make things easier)

Now Jean-Louis said:
>>> >>>> Some plugins relies on abstract ones.
>>> >>>> Exemple:
>>> >>>> package-jar depends on abstract-package, abstract-package depends on
>>> >>>> abstract-compile, but compile-java plugin also depends on
>>> >>> abstract-compile.
>>> >>>> Which versi of abstract-compile will be taken in case both plugins load
>>> >>>> different version ? The answer is the first one !
>>> >>>> This becomes more problematic on buildtypes, as buildtypes loads a set 
>>> >>>> of
>>> >>>> plugins (including themself others abstract-plugins).

What bugs me, is the fact that changing package-jar's version could
change my compile-java's version. This is just a caricature, but for
me the former creates a zip while the latter invokes javac ; they
should be unrelated. If both package-jar and compile-java with
diverging versions conflict on a dependency, they should each get the
one they need. I take the plexus-utils dependency as an example,
because a lot of maven plugins use it. So when I change my
maven-package-plugin version, it has no effect AFAIK on my
maven-compiler-plugin. Maven makes it hard to customize the lifecycle,
so I've never met someone willing to do so.

My point of view in a nutshell:
- "build-type" plugins help define easily the lifecycle
- "regular" plugins should not drag other plugins

Now what happens when you have several build-types (eg. a polyglot project) ?
I'd tend to think that a build-type should override previous
build-types (eg. package-jar needed by both java and scala builds).

Best Regards,
Dridi

On Tue, Aug 27, 2013 at 8:22 AM, Dridi Boukelmoune
<dridi.boukelmo...@zenika.com> wrote:
> Hi Martin,
>
> I believe one of my comments must have offended you and maybe others.
> This was a reference to the shitty-maven-plugin, which made me laugh
> the first time I saw it. For anything other than Maven I would have
> said something along "and does a poor job". I should have written
> "shitty[x]" and put my reference to make it obvious, I suppose only
> plugin writers tend to know this one.
>
> On Tue, Aug 27, 2013 at 12:04 AM, Martin Gainty <mgai...@hotmail.com> wrote:
>> you never looked at plugin-management
>
> Yes I know, use and encourage others to use it at work.
>
>> understanding what you're criticising before you write a commentary will 
>> lend veracity to your statements
>
> You are right about understanding, this is why I said "I think I've
> observed". However I use plugin-management to make modules
> dependencies converge (in a multi-module project or let's say
> company-wide with a common parent pom). So that for instance all my
> jar modules use the same version/configuration of the *implicitly
> declared* compiler plugin.
>
> But in my comment I'm not talking about plugin-management, I'm talking
> about plugin dependencies.
>
> From the first few seconds of a "mvn -X clean verify" build:
> [DEBUG] Populating class realm
> plugin>org.apache.maven.plugins:maven-clean-plugin:2.4.1
> [DEBUG]   Included: org.apache.maven.plugins:maven-clean-plugin:jar:2.4.1
> [DEBUG]   Included: org.codehaus.plexus:plexus-utils:jar:2.0.5
> [DEBUG]   Excluded: org.apache.maven:maven-plugin-api:jar:2.0.6
> [DEBUG] Configuring mojo
> org.apache.maven.plugins:maven-clean-plugin:2.4.1:clean from plugin
> realm ClassRealm[plugin>org.apache.maven.plugins:maven-clean-plugin:2.4.1,
> parent: sun.misc.Launcher$AppClassLoader@e1641c0]
>
> [DEBUG] Populating class realm
> plugin>org.apache.maven.plugins:maven-surefire-plugin:2.12
> [DEBUG]   Included: org.apache.maven.plugins:maven-surefire-plugin:jar:2.12
> [DEBUG]   Included: org.apache.maven.surefire:surefire-booter:jar:2.12
> [DEBUG]   Included: org.apache.maven.surefire:surefire-api:jar:2.12
> [DEBUG]   Included: org.apache.maven.surefire:maven-surefire-common:jar:2.12
> [DEBUG]   Included:
> org.apache.maven.shared:maven-common-artifact-filters:jar:1.3
> [DEBUG]   Included: org.codehaus.plexus:plexus-utils:jar:3.0
> [DEBUG]   Included: org.apache.maven.reporting:maven-reporting-api:jar:2.0.9
> [DEBUG] Configuring mojo
> org.apache.maven.plugins:maven-surefire-plugin:2.12:test from plugin
> realm ClassRealm[plugin>org.apache.maven.plugins:maven-surefire-plugin:2.12,
> parent: sun.misc.Launcher$AppClassLoader@e1641c0]
>
> [DEBUG]   Included: org.codehaus.mojo:clirr-maven-plugin:jar:2.5
> [DEBUG]   Included: net.sf.clirr:clirr-core:jar:0.6
> [DEBUG]   Included: org.apache.bcel:bcel:jar:5.2
> [DEBUG]   Included: jakarta-regexp:jakarta-regexp:jar:1.4
> [DEBUG]   Included: org.apache.maven.doxia:doxia-decoration-model:jar:1.0
> [DEBUG]   Included: org.apache.maven.doxia:doxia-module-xhtml:jar:1.0
> [DEBUG]   Included: org.apache.maven.doxia:doxia-core:jar:1.0
> [DEBUG]   Included: org.apache.maven.doxia:doxia-sink-api:jar:1.0
> [DEBUG]   Included: org.apache.maven.doxia:doxia-site-renderer:jar:1.0
> [DEBUG]   Included: org.codehaus.plexus:plexus-velocity:jar:1.1.7
> [DEBUG]   Included: org.apache.velocity:velocity:jar:1.5
> [DEBUG]   Included: commons-lang:commons-lang:jar:2.1
> [DEBUG]   Included: oro:oro:jar:2.0.8
> [DEBUG]   Included: commons-collections:commons-collections:jar:3.2
> [DEBUG]   Included: org.apache.maven.doxia:doxia-module-apt:jar:1.0
> [DEBUG]   Included: org.apache.maven.doxia:doxia-module-fml:jar:1.0
> [DEBUG]   Included: org.apache.maven.doxia:doxia-module-xdoc:jar:1.0
> [DEBUG]   Included: org.apache.maven.reporting:maven-reporting-api:jar:2.0.6
> [DEBUG]   Included: org.codehaus.plexus:plexus-i18n:jar:1.0-beta-6
> [DEBUG]   Included: org.codehaus.plexus:plexus-utils:jar:3.0.7
> [DEBUG] Configuring mojo
> org.codehaus.mojo:clirr-maven-plugin:2.5:check from plugin realm
> ClassRealm[plugin>org.codehaus.mojo:clirr-maven-plugin:2.5, parent:
> sun.misc.Launcher$AppClassLoader@e1641c0]
>
> I'm omitting logs starting with Excluded (no plexus-utils in those).
> In a single build, I get three plugins using three different versions
> of plexus-utils (2.0.5, 3.0, 3.0.7). So this is what I meant: is it a
> problem for plugins to depend on different versions of other stuff
> (plugins or modules) ?
>
>>
>> http://maven.apache.org/pom.html#Plugin_Management
>> Martin Gainty
>
> I hope I've convinced you I'm not freely flaming on Maven but really
> trying to contribute to the thread.
>
> Best Regards,
> Dridi
>
>> ______________________________________________
>> Verzicht und Vertraulichkeitanmerkung/Note de déni et de confidentialité
>>
>> Diese Nachricht ist vertraulich. Sollten Sie nicht der vorgesehene 
>> Empfaenger sein, so bitten wir hoeflich um eine Mitteilung. Jede unbefugte 
>> Weiterleitung oder Fertigung einer Kopife ist unzulaessig. Diese Nachricht 
>> dient lediglich dem Austausch von Informationen und entfaltet keine 
>> rechtliche Bindungswirkung. Aufgrund der leichten Manipulierbarkeit von 
>> E-Mails koennen wir keine Haftung fuer den Inhalt uebernehmen.
>>
>> Ce message est confidentiel et peut être privilégié. Si vous n'êtes pas le 
>> destinataire prévu, nous te demandons avec bonté que pour satisfaire 
>> informez l'expéditeur. N'importe quelle diffusion non autorisée ou la copie 
>> de ceci est interdite. Ce message sert à l'information seulement et n'aura 
>> pas n'importe quel effet légalement obligatoire. Étant donné que les email 
>> peuvent facilement être sujets à la manipulation, nous ne pouvons accepter 
>> aucune responsabilité pour le contenu fourni.
>>
>>
>>
>>
>>> From: dridi.boukelmo...@zenika.com
>>> Date: Mon, 26 Aug 2013 20:31:32 +0200
>>> Subject: Re: Easyant - Plugin conflict management
>>> To: dev@ant.apache.org
>>>
>>> Hi,
>>>
>>> This is my first post on this mailing list, I used to lurk in the
>>> previous easant ML and even answer sometimes.
>>>
>>> In this thread I see several points and one of them looks like a
>>> non-issue to me. Please forgive my heresy when I use maven as an
>>> example.
>>>
>>> On Tue, Aug 20, 2013 at 6:50 PM, Nicolas Lalevée
>>> <nicolas.lale...@hibnet.org> wrote:
>>> >
>>> > Le 20 août 2013 à 14:22, Jean-Louis Boudart <jeanlouis.boud...@gmail.com> 
>>> > a écrit :
>>> >
>>> >> I've commited changes on trunk with some unit tests if you want to have a
>>> >> look.
>>> >>
>>> >> Known limitation :
>>> >> * system plugins doesn't participate *yet* to global plugin resolution
>>> >> * plugins classpath created dinamically will all contains the whole
>>> >> resolution graph (not really a problem)
>>> >>
>>> >> Point 1 : this can even affect performance. Invoking resolve process one
>>> >> time seems much more speed that invoking plugins individually.
>>> >
>>> > This seems strange to me. Do you have an idea why ?
>>>
>>> I believe he meant this could *improve* performances by sharing a
>>> single global resolve between all plugins (or something like that).
>>>
>>> >> Point 2 : Even if there is no much activity, i suggest to keep backward
>>> >> compatibility
>>> >
>>> > fine for me.
>>>
>>> Not necessary from my point of view. My only advice is to avoid legacy
>>> (or technical debt ;) at such early time.
>>>
>>> >> Point 3 : By two steps i meant running a global resolve (for all plugins
>>> >> and buildtypes including transitive ones). And then have a second class
>>> >> invoked to perform individual import of ant build file by picking them 
>>> >> from
>>> >> the ResolveReport.
>>> >
>>> > ok I see. This make totally sense.
>>>
>>> This is where I'm lost. Actually the whole issue of dependencies
>>> conflicts between plugins.
>>>
>>> Here is the behavior I think I've observed with Maven:
>>> - maven resolves project dependencies and does a shitty job at
>>> conflicts resolution
>>> - maven resolves plugins dependencies one by one and downloads them lazily
>>> - each plugin is executed with its own classloader, and doesn't care
>>> about other plugins dependencies
>>> - I can get a dozen versions of the infamous[1] plexus-utils in a single 
>>> build
>>>
>>> My point is, given proper isolation, is it a real issue to have
>>> different plugins depending on different versions of the same modules
>>> ?
>>>
>>> At the very least, I like the idea of a single global resolve. Even
>>> though I understand the benefits of a lazy resolution/download, I
>>> don't see this as a problem with today's average bandwidth and disk
>>> space to get every thing needed by a build in a single go. I tend to
>>> work offline and I hate when I discover in the train that I'm missing
>>> a dependency :)
>>>
>>> >> You can check ResolvePlugins and ImportDeferred class in trunk if you 
>>> >> want
>>> >> to see concrete stuff.
>>> >
>>> > I usually do a very quick review of the code to keep me informed of what 
>>> > is going on and see if nothing bug me, and as always, it seems great. But 
>>> > I need to get into this more deeply to see how it really works.
>>> >
>>> > Nicolas
>>> >
>>>
>>> Best Regards,
>>> Dridi
>>>
>>> [1] it's just that I don't like it :p
>>>
>>> >>
>>> >>
>>> >>
>>> >>
>>> >> 2013/8/17 Nicolas Lalevée <nicolas.lale...@hibnet.org>
>>> >>
>>> >>> Long overdue response.
>>> >>>
>>> >>> Le 3 août 2013 à 13:33, Jean-Louis Boudart <jeanlouis.boud...@gmail.com>
>>> >>> a écrit :
>>> >>>
>>> >>>> Hi there,
>>> >>>>
>>> >>>> It becomes necesssary to manage conflicts between plugins.
>>> >>>> This issues has been raised many time and is referenced on jira[1].
>>> >>>>
>>> >>>> Currently easyant offers import task taking some specific attributes to
>>> >>>> resolve a plugin (mainly organisation, module name and revision).
>>> >>>> <ea:import org="mycompany" module="myplugin" revision="x.x"/>
>>> >>>>
>>> >>>> This task will :
>>> >>>> * resolve the given plugin or buildtypr
>>> >>>> * create a dynamic classpath for this plugin
>>> >>>> * expose location of others extra files through properties (ex
>>> >>>> checkstyle.xml containing checkstyle rules, this files is shipped in 
>>> >>>> the
>>> >>>> plugin). Thoses properties will then be reused by the plugin itself
>>> >>>> * import the real ant file (invoke the importTask from ant core under 
>>> >>>> the
>>> >>>> hood)
>>> >>>>
>>> >>>> This task is currently used :
>>> >>>> * dynamically by easyant to load system plugins (skeletons for example)
>>> >>>> * dynamically by easyant when you specify <ea:build> or <ea:plugin> 
>>> >>>> tags
>>> >>>> in module.ivy files
>>> >>>> * invoked in plugin ant file itselfs
>>> >>>> * invoked in module.ant if users has complex needs
>>> >>>>
>>> >>>> Additionnal there is two "alliases" for this task to import plugins and
>>> >>>> buildtype.
>>> >>>> <ea:plugin module="compile-java" revision="0.9"/>
>>> >>>> <ea:plugin module="build-std-java" revision="0.9"/>
>>> >>>> If organisation attribute is not specified on aliases default one will
>>> >>> be
>>> >>>> used.
>>> >>>>
>>> >>>> It does the job but it doesn't handle conflict between plugins.
>>> >>>>
>>> >>>> Some plugins relies on abstract ones.
>>> >>>> Exemple:
>>> >>>> package-jar depends on abstract-package, abstract-package depends on
>>> >>>> abstract-compile, but compile-java plugin also depends on
>>> >>> abstract-compile.
>>> >>>> Which versi of abstract-compile will be taken in case both plugins load
>>> >>>> different version ? The answer is the first one !
>>> >>>> This becomes more problematic on buildtypes, as buildtypes loads a set 
>>> >>>> of
>>> >>>> plugins (including themself others abstract-plugins).
>>> >>>>
>>> >>>> Ok so now you should have a quick picture of the problem.
>>> >>>>
>>> >>>> What could be done ?
>>> >>>>
>>> >>>> We can rely on ivy to describe dependency on plugins. But then how 
>>> >>>> could
>>> >>> we
>>> >>>> know in which order plugins should be loaded ?
>>> >>>>
>>> >>>> I suggest to introduce a deferred import mechanism.
>>> >>>>
>>> >>>> We should split responsibility in two distinct steps.
>>> >>>> 1 - resolve (based on ivy) the whole graph of plugins and store the
>>> >>> resolve
>>> >>>> report somewhere as a reusable reference in ant project
>>> >>>> 2 - invoke a new import task should import already resolved plugins 
>>> >>>> (the
>>> >>>> task could rely on the report stored as a reference in ant project)
>>> >>>>
>>> >>>> Exemple :
>>> >>>> compile java will have an ivy dependency on abstract-compile
>>> >>>> <dependency org="org.apache.easyant.plugins" module="abstract-compile"
>>> >>>> revision="1.0"/>
>>> >>>>
>>> >>>> The compile java ant script will import the resolved plugin
>>> >>>> <ea:import-deferred org="org.apache.easyant.plugins"
>>> >>>> module="abstract-compile"/>
>>> >>>>
>>> >>>> Note that i'm not fixed yet with the task name. Any suggestion (even 
>>> >>>> for
>>> >>>> alliases are welcome).
>>> >>>>
>>> >>>> To maintain backward compatibility i'm in favor of creating new aliases
>>> >>>> "import-plugin" and "import-buildtype" instead of reusing existing 
>>> >>>> ones.
>>> >>>>
>>> >>>> People would be able to continue using existing task with known the
>>> >>>> limitation (no conflict management on plugins).
>>> >>>> This can help if someone wants to load plugins in module.ant after
>>> >>> setting
>>> >>>> a few properties.
>>> >>>>
>>> >>>> I also recommend adding a warning on existing task to recommend people
>>> >>>> using the new import mechanism.
>>> >>>>
>>> >>>> What do you think ?
>>> >>>
>>> >>> I see 3 points here.
>>> >>>
>>> >>> First, managing plugin dependencies: with Ivy, of course, we couldn't
>>> >>> agree more :)
>>> >>>
>>> >>> Then about creating new tasks to keep backward compatibility. I think we
>>> >>> can break backward compatibility. Easyant is not yet 1.0 and I do not 
>>> >>> see
>>> >>> much activity on the user list. I would prefer bugging the current users
>>> >>> than having an error-prone and deprecated task around.
>>> >>>
>>> >>> Third there is the resolve in two steps. I really like the idea. I am 
>>> >>> not
>>> >>> sure though if we need this in order to bring conflict management in 
>>> >>> plugin
>>> >>> dependencies. And I am not sure how far you are willing to go.
>>> >>> Actually this is a larger topic which has bugging me recently. The way 
>>> >>> we
>>> >>> use the ivy.xml is generally either to tight or insecure. For instance 
>>> >>> when
>>> >>> using version ranges in an ivy.xml, since the content of the repository 
>>> >>> is
>>> >>> expected to change over time, then the resolve may change over time 
>>> >>> since
>>> >>> new versions might fit the range. Range makes things unreliable over 
>>> >>> time,
>>> >>> so often I restrict myself to not use any range. But it's kind of a 
>>> >>> shame
>>> >>> to not use ranges in a dependency manager.
>>> >>> I continued experimenting with the OSGi mapping in Ivy. And the OSGi
>>> >>> version semantics are very loose. It is because it represents what 
>>> >>> versions
>>> >>> of software it is compatible with, not the versions we will be using in
>>> >>> your specific unit test or application. So relying on OSGi manifest to
>>> >>> resolve dependencies is not safe at all. That's why I implemented the
>>> >>> fixdeps [1] task. From a very loose specification of the dependencies, 
>>> >>> it
>>> >>> will produce an ivy.xml which is very tight and secure.
>>> >>> Then, when adding dependencies to a project, we edit the
>>> >>> ivy-specification.xml and run fixdeps. The build then relies on the
>>> >>> produced ivy.xml. A nice side effect is that since there is only non
>>> >>> transitive fixed dependencies to resolve, resolve is fast: either the
>>> >>> module is here either it's not. And with proper caching, everything 
>>> >>> works
>>> >>> with the filesystem.
>>> >>> But, as wrote above, I'm not sure if that's why you suggested the two
>>> >>> steps resolve.
>>> >>>
>>> >>> Nicolas
>>> >>>
>>> >>> [1] http://ant.apache.org/ivy/history/trunk/use/fixdeps.html
>>> >>>
>>> >>>
>>> >>> ---------------------------------------------------------------------
>>> >>> To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
>>> >>> For additional commands, e-mail: dev-h...@ant.apache.org
>>> >>>
>>> >>>
>>> >>
>>> >>
>>> >> --
>>> >> Jean Louis Boudart
>>> >> Independent consultant
>>> >> Apache EasyAnt commiter http://ant.apache.org/easyant/
>>> >
>>> >
>>> > ---------------------------------------------------------------------
>>> > To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
>>> > For additional commands, e-mail: dev-h...@ant.apache.org
>>> >
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
>>> For additional commands, e-mail: dev-h...@ant.apache.org
>>>
>>

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

Reply via email to