Opened 8 years ago
Last modified 17 months ago
#436 accepted enhancement
feature request maven exclude dependency
Reported by: | aruttenberg | Owned by: | Mark Evenson |
---|---|---|---|
Priority: | major | Milestone: | 1.9.3 |
Component: | other | Version: | 1.6.0-dev |
Keywords: | aether abcl-asdf contrib | Cc: | |
Parent Tickets: |
Description
To prevent dependencies from one maven artifact from stepping on another. Which they are doing. (each loads a different version)
Change History (21)
comment:1 Changed 8 years ago by
comment:2 Changed 8 years ago by
Priority: | major → blocker |
---|
comment:3 Changed 8 years ago by
Owner: | set to Mark Evenson |
---|---|
Status: | new → accepted |
Not sure as to which syntax to specify exclusion.
(:mvn "net.sourceforge.owlapi/owlapi-distribution/4.2.6" :exclude (":org.protege.editor.owl:" ..))
What is syntax of the strings being passed to the :exclude
clause here? Wouldn't it be simpler if they were regular mvn objects, i.e.
(:mvn "net.sourceforge.owlapi/owlapi-distribution/4.2.6" :exclude ((:mvn "group/artifact/version")))
Of course we would probably prevent artifacts listed in an :exclude
clause from having its own :exclude
clause…
comment:4 Changed 8 years ago by
Component: | (A)MOP → java |
---|
comment:5 follow-up: 6 Changed 8 years ago by
I think it should be as I wrote, a list of strings. The strings are groupid:artifactid:version as with the ones inside a (:mvn) component, but with any of the three components blank, meaning match anything.
Or, could take a lambda with args (groupid artifactid version why) of the dependency that might be loaded and if it returns nil it means skip it. The variable "why" is the path of dependencies that led to this one. The elements could be (:mvn blah) - that works here.
I just got bit by this again.
comment:6 Changed 8 years ago by
Replying to aruttenberg:
I just got bit by this again.
I'll take a stab at this for abcl-1.5.0 after I rewrite the Aether adapter to have more meaningful failures.
Note that the naive implementation of dependency inclusions will not prevent incompatibilities between and within DEFSYSTEM forms, i.e. for a fragment like
(:mvn "net.sourceforge.owlapi/owlapi-distribution/4.2.6" :exclude (":log4j:1.2.14" )) (:mvn "org.apache/tomcat" :exclude (":log4j:1.2.13" ))
it is undefined which log4j will be picked up.
It might be possible to do something intelligent with specialized class loaders, but given the impacts that Java 9 will have on locating and utilizing JVM artifacts, I'd rather do the simple implementation for exclusion to at least have some ability to get around bugs, and then revisit JVM artifacts when we have a reasonable abstraction which works on Java [678] as well as Java 9.
comment:7 Changed 8 years ago by
ME: We should probably split into a subticket for the near term work of the current patch by Alan, but we document here the steps to longer term solution that involves re-using ASDF abstractions in a more concise way.
After conversation on asdf-devel, Faré has outlined a plan of attack around :before methods for the planning phase.
We need to code our generalization solution against https://gitlab.common-lisp.net/asdf/asdf/tree/plan
comment:8 Changed 8 years ago by
Text of Faré's proposal https://mailman.common-lisp.net/pipermail/asdf-devel/2017-May/005775.html
0- Aim for a single coherent set of jars within a given build, because otherwise lies madness. 1- Within a given plan-then-perform phase, collect the set of jars and their version intervals in a :before method on perform-plan that talks to maven and uses some heuristic to resolve versions. 2- Across plan-then-perform phases of a same build session, record which versions were loaded, and issue an error if it's incompatible. 3- Across build sessions, remember what version was previously loaded, and unload/shadow it if it is incompatible (or throw an error if you can't), and decide whether to keep or upgrade (if possible) if it's compatible. As to writing a system that solves issues across phases, in your worst case, your toplevel system would :defsystem-depends-on a system that loads all the proper versions of all the jar files (or at least the problematic ones), and then whichever phase causes some version to be loaded will have been preempted by that first defsystem-depends-on system.
comment:9 Changed 7 years ago by
Component: | java → other |
---|---|
Keywords: | aether abcl-asdf contrib added |
Milestone: | → 1.6.0 |
Version: | → 1.6.0-dev |
Interim solution: abcl-1.5.0 ships with the ASDF:MVN-MODULE component which allows one to prune the subtree via white and black listing of the transitive dependencies via explicit exclusions and inclusions.
TODO: "port" asdf-3.3, then push dependency resolution to its layer via suitable abstractions.
comment:10 Changed 5 years ago by
Priority: | blocker → major |
---|
comment:13 Changed 4 years ago by
Milestone: | 1.6.2 → 1.7.0 |
---|
comment:18 Changed 3 years ago by
Milestone: | 1.8.1 → 1.9.0 |
---|
comment:19 Changed 21 months ago by
Milestone: | 1.9.0 → 1.9.1 |
---|
comment:20 Changed 21 months ago by
Milestone: | 1.9.1 → 1.9.2 |
---|
comment:21 Changed 17 months ago by
Milestone: | 1.9.2 → 1.9.3 |
---|
Here's a snippet that poc shows how one can do this at the direct dependent level.
For deeper dependents I think you need to use pass a
DependencyFilter
in the constructor of theDependencyRequest
. SeePatternExclusionsDependencyFilter
andOrDependencyFilter
For syntax I might suggest using the syntax that
PatternExclusionsDependencyFilter
uses, so it would be:(:mvn "net.sourceforge.owlapi/owlapi-distribution/4.2.6" :exclude (":org.protege.editor.owl:" ..)) for my example case of exclusion by artifactID
The patterns apparently support version ranges.
The MVN URL Scheme doesn't seem to provide for exclusions. If you used them then they would be the form for both the dependency and the exclusions - you still need to specify the exclusions separately.
https://ops4j1.jira.com/wiki/display/paxurl/Mvn+Protocol
I vote for the pattern over the URL