X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.support.maven%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fmaven%2FMavenManager.java;h=049ce8233addab30e4f5455b9dc5eb63659b3d1b;hb=bd07be7603d234ac496652aaa07ded77d4a2a292;hp=1a2ab09c912737979270849e527e8f8fa98215b1;hpb=31858bf96e11953b30711376be853d47e8f8e081;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java b/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java index 1a2ab09c9..049ce8233 100644 --- a/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java +++ b/runtime/org.argeo.slc.support.maven/src/main/java/org/argeo/slc/maven/MavenManager.java @@ -1,208 +1,177 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.argeo.slc.maven; -import java.io.File; -import java.util.List; -import java.util.Set; -import java.util.Vector; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.artifact.metadata.ArtifactMetadataSource; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.resolver.ArtifactResolutionResult; -import org.apache.maven.artifact.resolver.ArtifactResolver; -import org.apache.maven.project.MavenProject; +import org.apache.maven.repository.internal.DefaultServiceLocator; +import org.apache.maven.repository.internal.MavenRepositorySystemSession; import org.argeo.slc.SlcException; -import org.argeo.slc.maven.embedder.MavenEmbedderException; -import org.codehaus.plexus.embed.Embedder; +import org.argeo.slc.aether.AetherUtils; +import org.argeo.slc.aether.ConsoleRepositoryListener; +import org.argeo.slc.aether.ConsoleTransferListener; +import org.codehaus.plexus.PlexusContainer; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.connector.wagon.WagonProvider; +import org.eclipse.aether.connector.wagon.WagonRepositoryConnectorFactory; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.repository.LocalRepository; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; +import org.eclipse.aether.util.artifact.DefaultArtifact; +import org.eclipse.aether.util.graph.PreorderNodeListGenerator; public class MavenManager { - - private final Log log = LogFactory.getLog(getClass()); - - private String localRepositoryPath = System.getProperty("user.home") - + File.separator + ".m2" + File.separator + "repository"; - - private ArtifactRepository localRepository; - private List remoteRepositoriesInternal; - private List remoteRepositories = new Vector(); - - private SlcMavenEmbedder mavenEmbedder; - private ClassLoader classLoader; - private Boolean offline = false; + private final static Log log = LogFactory.getLog(MavenManager.class); public void init() { try { - mavenEmbedder = new SlcMavenEmbedder(); - mavenEmbedder.setOffline(offline); - // mavenEmbedder.setAlignWithUserInstallation(true); - if (classLoader != null) - mavenEmbedder.setClassLoader(classLoader); - else - mavenEmbedder.setClassLoader(getClass().getClassLoader()); - // else - // mavenEmbedder.setClassLoader(Thread.currentThread() - // .getContextClassLoader()); - mavenEmbedder.start(); - - mavenEmbedder.setLocalRepositoryDirectory(new File( - localRepositoryPath)); - - localRepository = mavenEmbedder.getLocalRepository(); - - remoteRepositoriesInternal = new Vector(); - for (RemoteRepository remoteRepository : remoteRepositories) { - - ArtifactRepository repository = mavenEmbedder.createRepository( - remoteRepository.getUrl(), remoteRepository.getId()); - remoteRepositoriesInternal.add(repository); - } - - MavenFile mavenFile = new MavenFile(); - mavenFile.setGroupId("org.argeo.slc.dist"); - mavenFile.setArtifactId("org.argeo.slc.sdk"); - mavenFile.setVersion("0.12.2-SNAPSHOT"); - mavenFile.setType("pom"); - Artifact artifact = resolve(mavenFile); - log.debug("Location of " + artifact + " : " + artifact.getFile()); - // log.debug("Dependencies of " + artifact); - // for (Object obj : artifact.getDependencyTrail()) { - // log.debug(" " + obj); + testMaven(); + testAether(); + // List> lst = plexusContainer + // .discoverComponents(plexusContainer.getContainerRealm()); + // for (ComponentDescriptor cd : lst) { + // log.debug(cd); // } - - File pomFile = new File( - "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/pom.xml"); - MavenProject project = mavenEmbedder - .readProjectWithDependencies(pomFile); - // MavenProject project = mavenEmbedder - // .readProjectWithDependencies(artifact.getFile()); - - // EventMonitor eventMonitor = new EventMonitor() { - // - // public void startEvent(String eventName, String target, - // long timestamp) { - // log.debug(eventName + ", " + target + ", " + timestamp); - // } - // - // public void errorEvent(String eventName, String target, - // long timestamp, Throwable cause) { - // log.debug(eventName + ", " + target + ", " + timestamp); - // } - // - // public void endEvent(String eventName, String target, - // long timestamp) { - // log.debug(eventName + ", " + target + ", " + timestamp); + // ArtifactHandler artifactHandler = plexusContainer + // .lookup(ArtifactHandler.class); + // ArtifactRepository localRepository = new + // DefaultArtifactRepositoryFactory().createArtifactRepository("local", + // , layoutId, snapshots, releases); + // Maven maven = mavenCli.getContainer().lookup(Maven.class); + // Artifact artifact = new DefaultArtifact("org.argeo.slc.dist", + // "org.argeo.slc.sdk", "0.13.1-SNAPSHOT", "compile", "pom", + // null, artifactHandler); + // ArtifactResolutionRequest req = new ArtifactResolutionRequest(); + // req.setLocalRepository(localRepository); + // req.setResolveTransitively(true); + // req.setArtifact(artifact); + // ArtifactResolver artifactResolver = plexusContainer + // .lookup(ArtifactResolver.class); + // ArtifactResolutionResult res = artifactResolver.resolve(req); + // Set artifacts = res.getArtifacts(); + // for (Artifact art : artifacts) { + // log.debug(art); // } - // }; - // - // String[] goals = { "clean", "install" }; - // mavenEmbedder.execute(project, Arrays.asList(goals), - // eventMonitor, - // null, null, pomFile.getParentFile()); - - Set transitDeps = getTransitiveProjectDependencies( - project, remoteRepositoriesInternal, localRepository); - log.debug(transitDeps.size() + " dependencies for " + artifact); - for (Object obj : transitDeps) { - log.debug(" " + obj); - } - } catch (Exception e) { - throw new SlcException("Cannot initialize Maven manager", e); + // TODO Auto-generated catch block + e.printStackTrace(); } } - @SuppressWarnings("unchecked") - public Set getTransitiveProjectDependencies(MavenProject project, - List remoteRepos, ArtifactRepository local) { - Embedder embedder = mavenEmbedder.getEmbedder(); + public void testMaven() { + Thread.currentThread().setContextClassLoader( + getClass().getClassLoader()); + String[] goals = { "-o", "-e", "-f", + "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/pom.xml", + "dependency:tree" }; + + // String m2Home = "/opt/apache-maven-3.0.1"; + // System.setProperty("classworlds.conf", m2Home + "/bin/m2.conf"); + // System.setProperty("maven.home", m2Home); + // + // Launcher.main(goals); + + CustomCli mavenCli = new CustomCli(); + mavenCli.doMain(goals, + "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk", + System.out, System.err); + + PlexusContainer plexusContainer = mavenCli.getContainer(); + log.debug(plexusContainer.getContext().getContextData()); + plexusContainer.dispose(); + } + + public void testAether() { try { - ArtifactFactory artifactFactory = (ArtifactFactory) embedder - .lookup(ArtifactFactory.ROLE); + RepositorySystem repoSystem = createRepositorySystem(); - ArtifactResolver artifactResolver = (ArtifactResolver) embedder - .lookup(ArtifactResolver.ROLE); + RepositorySystemSession session = createRepositorySystemSession(repoSystem); - ArtifactMetadataSource artifactMetadataSource = (ArtifactMetadataSource) embedder - .lookup(ArtifactMetadataSource.ROLE); + Dependency dependency = new Dependency(new DefaultArtifact( + "org.argeo.slc.dep:org.argeo.slc.dep.sdk:0.13.1-SNAPSHOT"), + "compile"); + RemoteRepository argeo = new RemoteRepository("argeo", "default", + "http://maven.argeo.org/argeo/"); + RemoteRepository argeoSnapshots = new RemoteRepository( + "argeo-snapshots", "default", + "http://dev.argeo.org/maven/argeo-snapshots/"); - Set artifacts = project.createArtifacts(artifactFactory, - null, null); + CollectRequest collectRequest = new CollectRequest(); + collectRequest.setRoot(dependency); + collectRequest.addRepository(argeo); + collectRequest.addRepository(argeoSnapshots); + DependencyNode node = repoSystem.collectDependencies(session, + collectRequest).getRoot(); - ArtifactResolutionResult arr = artifactResolver - .resolveTransitively(artifacts, project.getArtifact(), - local, remoteRepos, artifactMetadataSource, null); + repoSystem.resolveDependencies(session, node, null); - return arr.getArtifacts(); - } catch (Exception e) { - throw new SlcException("Cannot resolve dependency for " + project, - e); - } - // Order, just for display - // Set dependencies = new TreeSet(new ArtifactComparator()); - // dependencies.addAll(arr.getArtifacts()); - // return dependencies; - } + PreorderNodeListGenerator nlg = new PreorderNodeListGenerator(); + node.accept(nlg); - private Artifact resolve(MavenFile mavenDistribution) { - try { - Artifact artifact; - if (mavenDistribution.getClassifier() == null) { - artifact = mavenEmbedder.createArtifact(mavenDistribution - .getGroupId(), mavenDistribution.getArtifactId(), - mavenDistribution.getVersion(), - Artifact.SCOPE_PROVIDED, mavenDistribution.getType()); - } else { - artifact = mavenEmbedder.createArtifactWithClassifier( - mavenDistribution.getGroupId(), mavenDistribution - .getArtifactId(), mavenDistribution - .getVersion(), mavenDistribution.getType(), - mavenDistribution.getClassifier()); + for (Artifact artifact : nlg.getArtifacts(true)) { + log.debug(artifact); } - mavenEmbedder.resolve(artifact, remoteRepositoriesInternal, - localRepository); + AetherUtils.logDependencyNode(0, node); + // System.out.println(nlg.getClassPath()); - return artifact; } catch (Exception e) { - throw new SlcException("Cannot resolve artifact.", e); + throw new SlcException("Cannot resolve", e); } - } - public File getPackageLocation(MavenFile mavenDistribution) { - return resolve(mavenDistribution).getFile(); } - public void destroy() { + /** Creates a Maven {@link RepositorySystem}. */ + public static RepositorySystem createRepositorySystem() { try { - if (mavenEmbedder != null) { - mavenEmbedder.stop(); - } - } catch (MavenEmbedderException e) { - log.error("Cannot destroy Maven manager", e); - } - } + // return new + // DefaultPlexusContainer().lookup(RepositorySystem.class); - public void setLocalRepositoryPath(String localRepositoryPath) { - this.localRepositoryPath = localRepositoryPath; - } + DefaultServiceLocator locator = new DefaultServiceLocator(); - public List getRemoteRepositories() { - return remoteRepositories; - } + locator.setServices(WagonProvider.class, new ManualWagonProvider()); + locator.addService(RepositoryConnectorFactory.class, + WagonRepositoryConnectorFactory.class); - public void setRemoteRepositories(List remoteRepositories) { - this.remoteRepositories = remoteRepositories; + return locator.getService(RepositorySystem.class); + } catch (Exception e) { + throw new SlcException("Cannot lookup repository system", e); + } } - public void setClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; + public static RepositorySystemSession createRepositorySystemSession( + RepositorySystem system) { + MavenRepositorySystemSession session = new MavenRepositorySystemSession(); + + LocalRepository localRepo = new LocalRepository( + System.getProperty("user.home") + "/.m2/repository"); + session.setLocalRepositoryManager(system + .newLocalRepositoryManager(localRepo)); + session.setTransferListener(new ConsoleTransferListener(System.out)); + session.setRepositoryListener(new ConsoleRepositoryListener()); + return session; } - public void setOffline(Boolean offline) { - this.offline = offline; + public static void main(String[] args) { + new MavenManager().init(); } }