1 package org
.argeo
.slc
.maven
;
6 import java
.util
.Vector
;
8 import org
.apache
.commons
.logging
.Log
;
9 import org
.apache
.commons
.logging
.LogFactory
;
10 import org
.apache
.maven
.artifact
.Artifact
;
11 import org
.apache
.maven
.artifact
.factory
.ArtifactFactory
;
12 import org
.apache
.maven
.artifact
.metadata
.ArtifactMetadataSource
;
13 import org
.apache
.maven
.artifact
.repository
.ArtifactRepository
;
14 import org
.apache
.maven
.artifact
.resolver
.ArtifactNotFoundException
;
15 import org
.apache
.maven
.artifact
.resolver
.ArtifactResolutionException
;
16 import org
.apache
.maven
.artifact
.resolver
.ArtifactResolutionResult
;
17 import org
.apache
.maven
.artifact
.resolver
.ArtifactResolver
;
18 import org
.apache
.maven
.embedder
.MavenEmbedderException
;
19 import org
.apache
.maven
.project
.MavenProject
;
20 import org
.apache
.maven
.project
.artifact
.InvalidDependencyVersionException
;
21 import org
.argeo
.slc
.SlcException
;
22 import org
.codehaus
.plexus
.component
.repository
.exception
.ComponentLookupException
;
23 import org
.codehaus
.plexus
.embed
.Embedder
;
25 public class MavenManager
{
27 private final Log log
= LogFactory
.getLog(getClass());
29 private String localRepositoryPath
= System
.getProperty("user.home")
30 + File
.separator
+ ".m2" + File
.separator
+ "repository";
32 private ArtifactRepository localRepository
;
33 private List
<ArtifactRepository
> remoteRepositoriesInternal
;
34 private List
<RemoteRepository
> remoteRepositories
= new Vector
<RemoteRepository
>();
36 private SlcMavenEmbedder mavenEmbedder
;
37 private ClassLoader classLoader
;
38 private Boolean offline
= false;
42 mavenEmbedder
= new SlcMavenEmbedder();
43 mavenEmbedder
.setOffline(offline
);
44 //mavenEmbedder.setAlignWithUserInstallation(true);
45 if (classLoader
!= null)
46 mavenEmbedder
.setClassLoader(classLoader
);
48 mavenEmbedder
.setClassLoader(getClass().getClassLoader());
50 // mavenEmbedder.setClassLoader(Thread.currentThread()
51 // .getContextClassLoader());
52 mavenEmbedder
.start();
54 mavenEmbedder
.setLocalRepositoryDirectory(new File(
55 localRepositoryPath
));
57 localRepository
= mavenEmbedder
.getLocalRepository();
59 remoteRepositoriesInternal
= new Vector
<ArtifactRepository
>();
60 for (RemoteRepository remoteRepository
: remoteRepositories
) {
62 ArtifactRepository repository
= mavenEmbedder
.createRepository(
63 remoteRepository
.getUrl(), remoteRepository
.getId());
64 remoteRepositoriesInternal
.add(repository
);
67 MavenFile mavenFile
= new MavenFile();
68 mavenFile
.setGroupId("org.argeo.slc.dist");
69 mavenFile
.setArtifactId("org.argeo.slc.sdk");
70 mavenFile
.setVersion("0.12.2-SNAPSHOT");
71 mavenFile
.setType("pom");
72 Artifact artifact
= resolve(mavenFile
);
73 log
.debug("Location of " + artifact
+ " : " + artifact
.getFile());
74 // log.debug("Dependencies of " + artifact);
75 // for (Object obj : artifact.getDependencyTrail()) {
76 // log.debug(" " + obj);
79 MavenProject project
= mavenEmbedder
80 .readProjectWithDependencies(new File(
81 "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/pom.xml"));
82 // MavenProject project = mavenEmbedder
83 // .readProjectWithDependencies(artifact.getFile());
85 log
.debug("Dependencies of " + artifact
);
86 for (Object obj
: getTransitiveProjectDependencies(project
,
87 remoteRepositoriesInternal
, localRepository
)) {
91 } catch (Exception e
) {
92 throw new SlcException("Cannot initialize Maven manager", e
);
96 public Set
getTransitiveProjectDependencies(MavenProject project
,
97 List remoteRepos
, ArtifactRepository local
) {
98 Embedder embedder
= mavenEmbedder
.getEmbedder();
100 ArtifactFactory artifactFactory
= (ArtifactFactory
) embedder
101 .lookup(ArtifactFactory
.ROLE
);
103 ArtifactResolver artifactResolver
= (ArtifactResolver
) embedder
104 .lookup(ArtifactResolver
.ROLE
);
106 ArtifactMetadataSource artifactMetadataSource
= (ArtifactMetadataSource
) embedder
107 .lookup(ArtifactMetadataSource
.ROLE
);
109 Set artifacts
= project
110 .createArtifacts(artifactFactory
, null, null);
112 ArtifactResolutionResult arr
= artifactResolver
113 .resolveTransitively(artifacts
, project
.getArtifact(),
114 local
, remoteRepos
, artifactMetadataSource
, null);
116 return arr
.getArtifacts();
117 } catch (Exception e
) {
118 throw new SlcException("Cannot resolve dependency for " + project
,
121 // Order, just for display
122 // Set dependencies = new TreeSet(new ArtifactComparator());
123 // dependencies.addAll(arr.getArtifacts());
124 // return dependencies;
127 private Artifact
resolve(MavenFile mavenDistribution
) {
130 if (mavenDistribution
.getClassifier() == null) {
131 artifact
= mavenEmbedder
.createArtifact(mavenDistribution
132 .getGroupId(), mavenDistribution
.getArtifactId(),
133 mavenDistribution
.getVersion(),
134 Artifact
.SCOPE_PROVIDED
, mavenDistribution
.getType());
136 artifact
= mavenEmbedder
.createArtifactWithClassifier(
137 mavenDistribution
.getGroupId(), mavenDistribution
138 .getArtifactId(), mavenDistribution
139 .getVersion(), mavenDistribution
.getType(),
140 mavenDistribution
.getClassifier());
143 mavenEmbedder
.resolve(artifact
, remoteRepositoriesInternal
,
147 } catch (Exception e
) {
148 throw new SlcException("Cannot resolve artifact.", e
);
152 public File
getPackageLocation(MavenFile mavenDistribution
) {
153 return resolve(mavenDistribution
).getFile();
156 public void destroy() {
158 if (mavenEmbedder
!= null) {
159 mavenEmbedder
.stop();
161 } catch (MavenEmbedderException e
) {
162 log
.error("Cannot destroy Maven manager", e
);
166 public void setLocalRepositoryPath(String localRepositoryPath
) {
167 this.localRepositoryPath
= localRepositoryPath
;
170 public List
<RemoteRepository
> getRemoteRepositories() {
171 return remoteRepositories
;
174 public void setRemoteRepositories(List
<RemoteRepository
> remoteRepositories
) {
175 this.remoteRepositories
= remoteRepositories
;
178 public void setClassLoader(ClassLoader classLoader
) {
179 this.classLoader
= classLoader
;
182 public void setOffline(Boolean offline
) {
183 this.offline
= offline
;