1 | (in-package :abcl-asdf) |
---|
2 | |
---|
3 | ;;; <https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html> |
---|
4 | ;;; If a artifact is root then its optional dependencies are |
---|
5 | ;; collected. If the same artifact is not root, then the optional |
---|
6 | ;;; dependencies are not collected. We don't need optionals since from |
---|
7 | ;;; our point of view we are the top pom and everything specified are |
---|
8 | ;;; dependencies |
---|
9 | ;;; Used by asdf-mvn-module. |
---|
10 | (defun resolve-multiple-maven-dependencies |
---|
11 | (dependencies &optional managed-dependencies exclusions (first-is-root nil)) |
---|
12 | "Return a list of jar file paths that satisfy dependencies |
---|
13 | |
---|
14 | dependencies: a list of maven artifacts. color or slash separated |
---|
15 | components groupid:artifactid:versionid |
---|
16 | |
---|
17 | managed-dependencies: a list of maven artifacts. If an dependency |
---|
18 | with same groupid and artifactid are encountered, the version |
---|
19 | specified here overrides. |
---|
20 | |
---|
21 | exclusions: a list of partial maven artifacts |
---|
22 | groupid:artifactid. Dependencies with same groupid and artifactid are |
---|
23 | exluded |
---|
24 | |
---|
25 | first-is-root: If the first dependency should include optional |
---|
26 | dependencies, set this to t. Usually not. |
---|
27 | " |
---|
28 | (with-aether (nil) |
---|
29 | (let ((collect-request (java:jnew (jss:find-java-class "CollectRequest"))) |
---|
30 | (exclusions-collection (jss:new 'java.util.HashSet)) |
---|
31 | (compile-scope (java:jfield (jss:find-java-class "JavaScopes") "COMPILE"))) |
---|
32 | (#"addRepository" collect-request (ensure-remote-repository)) |
---|
33 | (loop for e in exclusions |
---|
34 | for (groupid artifactid) = (abcl-build:split-string e #\:) |
---|
35 | ;; If i have scope be compile-scope it doesn't get excluded!! |
---|
36 | for exclusion = (jss:new 'aether.graph.Exclusion groupid artifactid "" "jar") |
---|
37 | do (#"add" exclusions-collection exclusion)) |
---|
38 | (loop for a in dependencies |
---|
39 | for artifact = (make-artifact (#"replaceAll" a "/" ":")) |
---|
40 | for dependency = (jss:new 'aether.graph.Dependency artifact compile-scope) |
---|
41 | do |
---|
42 | ;; setExclusions returns a new dependency. We have to use |
---|
43 | ;; that. That passed dependency i not modified! |
---|
44 | ;; http://grepcode.com/file/repo1.maven.org/maven2/org.eclipse.aether/aether-api/1.0.2.v0150114/org/eclipse/aether/graph/Dependency.java#Dependency.getOptional%28%29 |
---|
45 | ;; Nice of them to clearly document that :-/ |
---|
46 | (setq dependency (#"setExclusions" dependency exclusions-collection)) |
---|
47 | (if first-is-root |
---|
48 | (#"setRoot" collect-request dependency) |
---|
49 | (#"addDependency" collect-request dependency)) |
---|
50 | (setq first-is-root nil)) |
---|
51 | (loop for a in managed-dependencies |
---|
52 | for artifact = (make-artifact (#"replaceAll" a "/" ":")) |
---|
53 | for dependency = (jss:new 'aether.graph.Dependency artifact compile-scope) |
---|
54 | do (setq dependency (#"setExclusions" dependency exclusions-collection)) |
---|
55 | (#"addManagedDependency" collect-request dependency)) |
---|
56 | (let ((dependencies (#"collectDependencies" (ensure-repository-system) (ensure-session) collect-request)) |
---|
57 | (nodelist-generator (jss:new 'PreorderNodeListGenerator)) |
---|
58 | (dependency-request (jss:new 'DependencyRequest))) |
---|
59 | (#"setRoot" dependency-request (#"getRoot" dependencies)) |
---|
60 | (#"resolveDependencies" (ensure-repository-system) (ensure-session) dependency-request) |
---|
61 | (#"accept" (#"getRoot" dependencies) nodelist-generator) |
---|
62 | (abcl-build:split-string (#"getClassPath" nodelist-generator) #\:))))) |
---|
63 | |
---|