2 * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org
.argeo
.slc
.maven
;
19 import org
.apache
.maven
.cli
.MavenCli
;
20 import org
.codehaus
.plexus
.PlexusContainer
;
24 public class MavenManager
{
26 public static void main(String
[] args
){
27 //CustomCli mavenCli = new CustomCli();
28 MavenCli mavenCli
= new MavenCli();
29 String
[] goals
= { "-e","dependency:tree" };
30 mavenCli
.doMain(goals
, "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk", System
.out
, System
.err
);
33 static class CustomCli
extends MavenCli
{
34 private PlexusContainer container
;
37 protected void customizeContainer(PlexusContainer container
) {
38 this.container
= container
;
41 public PlexusContainer
getContainer() {
49 private final Log log = LogFactory.getLog(getClass());
51 private String localRepositoryPath = System.getProperty("user.home")
52 + File.separator + ".m2" + File.separator + "repository";
54 private ArtifactRepository localRepository;
55 private List<ArtifactRepository> remoteRepositoriesInternal;
56 private List<RemoteRepository> remoteRepositories = new Vector<RemoteRepository>();
58 private MavenEmbedder mavenEmbedder;
59 private ClassLoader classLoader;
60 private Boolean offline = false;
64 mavenEmbedder = new SlcMavenEmbedder();
65 mavenEmbedder.setOffline(offline);
66 // mavenEmbedder.setAlignWithUserInstallation(true);
67 if (classLoader != null)
68 mavenEmbedder.setClassLoader(classLoader);
70 mavenEmbedder.setClassLoader(getClass().getClassLoader());
72 // mavenEmbedder.setClassLoader(Thread.currentThread()
73 // .getContextClassLoader());
74 mavenEmbedder.start();
76 mavenEmbedder.setLocalRepositoryDirectory(new File(
77 localRepositoryPath));
79 localRepository = mavenEmbedder.getLocalRepository();
81 remoteRepositoriesInternal = new Vector<ArtifactRepository>();
82 for (RemoteRepository remoteRepository : remoteRepositories) {
84 ArtifactRepository repository = mavenEmbedder.createRepository(
85 remoteRepository.getUrl(), remoteRepository.getId());
86 remoteRepositoriesInternal.add(repository);
89 MavenFile mavenFile = new MavenFile();
90 mavenFile.setGroupId("org.argeo.slc.dist");
91 mavenFile.setArtifactId("org.argeo.slc.sdk");
92 mavenFile.setVersion("0.12.2-SNAPSHOT");
93 mavenFile.setType("pom");
94 Artifact artifact = resolve(mavenFile);
95 log.debug("Location of " + artifact + " : " + artifact.getFile());
96 // log.debug("Dependencies of " + artifact);
97 // for (Object obj : artifact.getDependencyTrail()) {
98 // log.debug(" " + obj);
101 File pomFile = new File(
102 "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/pom.xml");
103 MavenProject project = mavenEmbedder
104 .readProjectWithDependencies(pomFile);
105 // MavenProject project = mavenEmbedder
106 // .readProjectWithDependencies(artifact.getFile());
108 // EventMonitor eventMonitor = new EventMonitor() {
110 // public void startEvent(String eventName, String target,
112 // log.debug(eventName + ", " + target + ", " + timestamp);
115 // public void errorEvent(String eventName, String target,
116 // long timestamp, Throwable cause) {
117 // log.debug(eventName + ", " + target + ", " + timestamp);
120 // public void endEvent(String eventName, String target,
122 // log.debug(eventName + ", " + target + ", " + timestamp);
126 // String[] goals = { "clean", "install" };
127 // mavenEmbedder.execute(project, Arrays.asList(goals),
129 // null, null, pomFile.getParentFile());
131 Set<Artifact> transitDeps = getTransitiveProjectDependencies(
132 project, remoteRepositoriesInternal, localRepository);
133 log.debug(transitDeps.size() + " dependencies for " + artifact);
134 for (Object obj : transitDeps) {
135 log.debug(" " + obj);
138 } catch (Exception e) {
139 throw new SlcException("Cannot initialize Maven manager", e);
143 @SuppressWarnings("unchecked")
144 public Set<Artifact> getTransitiveProjectDependencies(MavenProject project,
145 List<ArtifactRepository> remoteRepos, ArtifactRepository local) {
146 Embedder embedder = mavenEmbedder.getEmbedder();
148 ArtifactFactory artifactFactory = (ArtifactFactory) embedder
149 .lookup(ArtifactFactory.ROLE);
151 ArtifactResolver artifactResolver = (ArtifactResolver) embedder
152 .lookup(ArtifactResolver.ROLE);
154 ArtifactMetadataSource artifactMetadataSource = (ArtifactMetadataSource) embedder
155 .lookup(ArtifactMetadataSource.ROLE);
157 Set<Artifact> artifacts = project.createArtifacts(artifactFactory,
160 ArtifactResolutionResult arr = artifactResolver
161 .resolveTransitively(artifacts, project.getArtifact(),
162 local, remoteRepos, artifactMetadataSource, null);
164 return arr.getArtifacts();
165 } catch (Exception e) {
166 throw new SlcException("Cannot resolve dependency for " + project,
169 // Order, just for display
170 // Set dependencies = new TreeSet(new ArtifactComparator());
171 // dependencies.addAll(arr.getArtifacts());
172 // return dependencies;
175 private Artifact resolve(MavenFile mavenDistribution) {
178 if (mavenDistribution.getClassifier() == null) {
179 artifact = mavenEmbedder.createArtifact(mavenDistribution
180 .getGroupId(), mavenDistribution.getArtifactId(),
181 mavenDistribution.getVersion(),
182 Artifact.SCOPE_PROVIDED, mavenDistribution.getType());
184 artifact = mavenEmbedder.createArtifactWithClassifier(
185 mavenDistribution.getGroupId(), mavenDistribution
186 .getArtifactId(), mavenDistribution
187 .getVersion(), mavenDistribution.getType(),
188 mavenDistribution.getClassifier());
191 mavenEmbedder.resolve(artifact, remoteRepositoriesInternal,
195 } catch (Exception e) {
196 throw new SlcException("Cannot resolve artifact.", e);
200 public File getPackageLocation(MavenFile mavenDistribution) {
201 return resolve(mavenDistribution).getFile();
204 public void destroy() {
206 if (mavenEmbedder != null) {
207 mavenEmbedder.stop();
209 } catch (MavenEmbedderException e) {
210 log.error("Cannot destroy Maven manager", e);
214 public void setLocalRepositoryPath(String localRepositoryPath) {
215 this.localRepositoryPath = localRepositoryPath;
218 public List<RemoteRepository> getRemoteRepositories() {
219 return remoteRepositories;
222 public void setRemoteRepositories(List<RemoteRepository> remoteRepositories) {
223 this.remoteRepositories = remoteRepositories;
226 public void setClassLoader(ClassLoader classLoader) {
227 this.classLoader = classLoader;
230 public void setOffline(Boolean offline) {
231 this.offline = offline;