source: trunk/abcl/contrib/abcl-asdf/maven-embedder.lisp @ 13364

Last change on this file since 13364 was 13364, checked in by Mark Evenson, 10 years ago

Use java.util.regex to deal with versions more cleanly.

File size: 6.7 KB
Line 
1;;; Use the Aether system in a default maven distribution to download
2;;; and install dependencies.
3;;;
4;;; https://docs.sonatype.org/display/AETHER/Home
5;;;
6
7(in-package :abcl-asdf)
8
9(require :abcl-contrib)
10(require :jss)
11
12#|
13Test:
14
15(resolve "org.slf4j" "slf4j-api" "1.6.1")
16|#
17
18(defvar *mavens* '("/opt/local/bin/mvn3" "mvn3" "mvn"))
19
20(defun find-mvn () 
21  (dolist (mvn-path *mavens*)
22    (let ((mvn 
23           (handler-case 
24               (truename (read-line (sys::process-output 
25                                     (sys::run-program "which" `(,mvn-path)))))
26             (end-of-file () nil))))
27      (when mvn
28        (return-from find-mvn mvn)))))
29
30(defun find-mvn-libs ()
31  (let ((mvn (find-mvn)))
32    (unless mvn
33      (warn "Failed to find Maven3 libraries.")
34      (return-from find-mvn-libs))
35    (truename (make-pathname 
36               :defaults (merge-pathnames "../lib/" mvn)
37               :name nil :type nil))))
38
39(defparameter *mvn-libs-directory*
40  nil
41  "Location of 'maven-core-3.<m>.<p>.jar', 'maven-embedder-3.<m>.<p>.jar' etc.")
42
43(defun mvn-version ()
44  (let* ((line
45         (read-line (sys::process-output 
46                     (sys::run-program 
47                      (namestring (find-mvn)) '("-version")))))
48         (pattern (#"compile" 
49                   'regex.Pattern
50                   "Apache Maven ([0-9]+)\\.([0-9]+)\\.([0-9]+)"))
51         (matcher (#"matcher" pattern line))
52         (found (#"find" matcher)))
53    (unless found 
54      (return-from mvn-version nil))
55    (mapcar #'parse-integer
56            `(,(#"group" matcher 1)
57              ,(#"group" matcher 2)
58              ,(#"group" matcher 3)))))
59
60(defun ensure-mvn-version ()
61  "Return t if Maven version is 3.0.3 or greater."
62  (let* ((version (mvn-version))
63         (major (first version))
64         (minor (second version))
65         (patch (third version)))
66    (or 
67     (and (>= major 3)
68          (>= minor 1))
69     (and (>= major 3)
70          (>= major 0)
71          (>= patch 3)))))
72
73(defparameter *init* nil)
74
75(defun init ()
76  (unless *mvn-libs-directory*
77    (setf *mvn-libs-directory* (find-mvn-libs)))
78  (unless (probe-file *mvn-libs-directory*)
79    (error "You must download maven-3.0.3 from http://maven.apache.org/download.html, then set ABCL-ASDF:*MVN-DIRECTORY* appropiately."))
80  (unless (ensure-mvn-version)
81    (error "We need maven-3.0.3 or later."))
82  (jss:add-directory-jars-to-class-path *mvn-libs-directory* nil)
83  (setf *init* t))
84
85(defun repository-system ()
86  (unless *init* (init))
87  (let ((locator 
88         (java:jnew "org.apache.maven.repository.internal.DefaultServiceLocator"))
89        (wagon-class 
90         (java:jclass "org.sonatype.aether.connector.wagon.WagonProvider"))
91        (wagon-provider 
92         (jss:find-java-class "LightweightHttpWagon"))
93        (repository-connector-factory-class
94         (java:jclass "org.sonatype.aether.connector.wagon.WagonRepositoryConnector"))
95        (wagon-repository-connector-factory-class
96         (java:jclass "org.sonatype.aether.connector.wagon.WagonRepositoryConnectorFactory"))
97        (repository-system-class
98         (java:jclass "org.sonatype.aether.RepositorySystem")))
99    (#"setService" locator wagon-class wagon-provider)
100    (#"addService" locator 
101                   repository-connector-factory-class
102                   wagon-repository-connector-factory-class)
103    (#"getService" locator repository-system-class)))
104
105#|
106private static RepositorySystem newRepositorySystem()
107{
108  DefaultServiceLocator locator = new DefaultServiceLocator();
109  locator.setServices( WagonProvider.class, new ManualWagonProvider() );
110  locator.addService( RepositoryConnectorFactory.class, WagonRepositoryConnectorFactory.class );
111
112  return locator.getService( RepositorySystem.class );
113}
114|#
115
116(defun new-session (repository-system)
117  (let ((session 
118         (java:jnew (jss:find-java-class "MavenRepositorySystemSession")))
119        (local-repository 
120         (java:jnew (jss:find-java-class "LocalRepository")
121                  (namestring (merge-pathnames ".m2/repository/"
122                                               (user-homedir-pathname))))))
123    (#"setLocalRepositoryManager" 
124     session
125     (#"newLocalRepositoryManager" repository-system local-repository))))
126
127#|
128private static RepositorySystemSession newSession( RepositorySystem system )
129{
130  MavenRepositorySystemSession session = new MavenRepositorySystemSession();
131
132  LocalRepository localRepo = new LocalRepository( "target/local-repo" );
133  session.setLocalRepositoryManager( system.newLocalRepositoryManager( localRepo ) );
134 
135  return session;
136}
137|#
138
139(defun resolve (group-id artifact-id version)
140  (unless *init* (init))
141  (let* ((system 
142          (repository-system))
143         (session 
144          (new-session system))
145         (artifact
146          (java:jnew (jss:find-java-class "aether.util.artifact.DefaultArtifact")
147                     (format nil "~A:~A:~A"
148                             group-id artifact-id version)))
149         (dependency 
150          (java:jnew (jss:find-java-class "aether.graph.Dependency")
151                     artifact "compile"))
152         (central
153          (java:jnew (jss:find-java-class "RemoteRepository")
154                     "central" "default" 
155                     "http://repo1.maven.org/maven2/"))
156         (collect-request (java:jnew (jss:find-java-class "CollectRequest"))))
157    (#"setRoot" collect-request dependency)
158    (#"addRepository" collect-request central)
159    (let* ((node 
160            (#"getRoot" (#"collectDependencies" system session collect-request)))
161           (dependency-request 
162            (java:jnew (jss:find-java-class "DependencyRequest")
163                       node java:+null+))
164           (nlg 
165            (java:jnew (jss:find-java-class "PreorderNodeListGenerator"))))
166      (#"resolveDependencies" system session dependency-request)
167      (#"accept" node nlg)
168      (#"getClassPath" nlg))))
169
170#|
171public static void main( String[] args )
172  throws Exception
173{
174  RepositorySystem repoSystem = newRepositorySystem();
175
176  RepositorySystemSession session = newSession( repoSystem );
177
178  Dependency dependency =
179    new Dependency( new DefaultArtifact( "org.apache.maven:maven-profile:2.2.1" ), "compile" );
180  RemoteRepository central = new RemoteRepository( "central", "default", "http://repo1.maven.org/maven2/" );
181
182  CollectRequest collectRequest = new CollectRequest();
183  collectRequest.setRoot( dependency );
184  collectRequest.addRepository( central );
185  DependencyNode node = repoSystem.collectDependencies( session, collectRequest ).getRoot();
186
187  DependencyRequest dependencyRequest = new DependencyRequest( node, null );
188
189  repoSystem.resolveDependencies( session, dependencyRequest  );
190
191  PreorderNodeListGenerator nlg = new PreorderNodeListGenerator();
192  node.accept( nlg );
193  System.out.println( nlg.getClassPath() );
194}
195|#
196
Note: See TracBrowser for help on using the repository browser.