\r
import java.io.File;\r
import java.util.List;\r
+import java.util.Set;\r
import java.util.Vector;\r
\r
import org.apache.commons.logging.Log;\r
import org.apache.commons.logging.LogFactory;\r
import org.apache.maven.artifact.Artifact;\r
+import org.apache.maven.artifact.factory.ArtifactFactory;\r
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;\r
import org.apache.maven.artifact.repository.ArtifactRepository;\r
-import org.apache.maven.embedder.MavenEmbedder;\r
-import org.apache.maven.embedder.MavenEmbedderException;\r
-\r
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;\r
+import org.apache.maven.artifact.resolver.ArtifactResolver;\r
+import org.apache.maven.project.MavenProject;\r
import org.argeo.slc.SlcException;\r
+import org.argeo.slc.maven.embedder.MavenEmbedderException;\r
+import org.codehaus.plexus.embed.Embedder;\r
\r
public class MavenManager {\r
+\r
private final Log log = LogFactory.getLog(getClass());\r
\r
private String localRepositoryPath = System.getProperty("user.home")\r
private List<ArtifactRepository> remoteRepositoriesInternal;\r
private List<RemoteRepository> remoteRepositories = new Vector<RemoteRepository>();\r
\r
- private MavenEmbedder mavenEmbedder;\r
+ private SlcMavenEmbedder mavenEmbedder;\r
+ private ClassLoader classLoader;\r
+ private Boolean offline = false;\r
\r
public void init() {\r
try {\r
- mavenEmbedder = new MavenEmbedder();\r
- mavenEmbedder.setOffline(true);\r
- mavenEmbedder.setClassLoader(Thread.currentThread()\r
- .getContextClassLoader());\r
+ mavenEmbedder = new SlcMavenEmbedder();\r
+ mavenEmbedder.setOffline(offline);\r
+ // mavenEmbedder.setAlignWithUserInstallation(true);\r
+ if (classLoader != null)\r
+ mavenEmbedder.setClassLoader(classLoader);\r
+ else\r
+ mavenEmbedder.setClassLoader(getClass().getClassLoader());\r
+ // else\r
+ // mavenEmbedder.setClassLoader(Thread.currentThread()\r
+ // .getContextClassLoader());\r
mavenEmbedder.start();\r
\r
mavenEmbedder.setLocalRepositoryDirectory(new File(\r
remoteRepository.getUrl(), remoteRepository.getId());\r
remoteRepositoriesInternal.add(repository);\r
}\r
- \r
+\r
MavenFile mavenFile = new MavenFile();\r
- mavenFile.setGroupId("org.argeo.slc.runtime");\r
- mavenFile.setArtifactId("org.argeo.slc.specs");\r
- mavenFile.setVersion("0.11.3-SNAPSHOT");\r
+ mavenFile.setGroupId("org.argeo.slc.dist");\r
+ mavenFile.setArtifactId("org.argeo.slc.sdk");\r
+ mavenFile.setVersion("0.12.2-SNAPSHOT");\r
+ mavenFile.setType("pom");\r
Artifact artifact = resolve(mavenFile);\r
- log.debug("Dependencies of "+artifact);\r
- for(Object obj : artifact.getDependencyTrail()){\r
- log.debug(" "+obj);\r
+ log.debug("Location of " + artifact + " : " + artifact.getFile());\r
+ // log.debug("Dependencies of " + artifact);\r
+ // for (Object obj : artifact.getDependencyTrail()) {\r
+ // log.debug(" " + obj);\r
+ // }\r
+\r
+ File pomFile = new File(\r
+ "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/pom.xml");\r
+ MavenProject project = mavenEmbedder\r
+ .readProjectWithDependencies(pomFile);\r
+ // MavenProject project = mavenEmbedder\r
+ // .readProjectWithDependencies(artifact.getFile());\r
+\r
+ // EventMonitor eventMonitor = new EventMonitor() {\r
+ //\r
+ // public void startEvent(String eventName, String target,\r
+ // long timestamp) {\r
+ // log.debug(eventName + ", " + target + ", " + timestamp);\r
+ // }\r
+ //\r
+ // public void errorEvent(String eventName, String target,\r
+ // long timestamp, Throwable cause) {\r
+ // log.debug(eventName + ", " + target + ", " + timestamp);\r
+ // }\r
+ //\r
+ // public void endEvent(String eventName, String target,\r
+ // long timestamp) {\r
+ // log.debug(eventName + ", " + target + ", " + timestamp);\r
+ // }\r
+ // };\r
+ //\r
+ // String[] goals = { "clean", "install" };\r
+ // mavenEmbedder.execute(project, Arrays.asList(goals),\r
+ // eventMonitor,\r
+ // null, null, pomFile.getParentFile());\r
+\r
+ Set<Artifact> transitDeps = getTransitiveProjectDependencies(\r
+ project, remoteRepositoriesInternal, localRepository);\r
+ log.debug(transitDeps.size() + " dependencies for " + artifact);\r
+ for (Object obj : transitDeps) {\r
+ log.debug(" " + obj);\r
}\r
\r
} catch (Exception e) {\r
}\r
}\r
\r
+ @SuppressWarnings("unchecked")\r
+ public Set<Artifact> getTransitiveProjectDependencies(MavenProject project,\r
+ List<ArtifactRepository> remoteRepos, ArtifactRepository local) {\r
+ Embedder embedder = mavenEmbedder.getEmbedder();\r
+ try {\r
+ ArtifactFactory artifactFactory = (ArtifactFactory) embedder\r
+ .lookup(ArtifactFactory.ROLE);\r
+\r
+ ArtifactResolver artifactResolver = (ArtifactResolver) embedder\r
+ .lookup(ArtifactResolver.ROLE);\r
+\r
+ ArtifactMetadataSource artifactMetadataSource = (ArtifactMetadataSource) embedder\r
+ .lookup(ArtifactMetadataSource.ROLE);\r
+\r
+ Set<Artifact> artifacts = project.createArtifacts(artifactFactory,\r
+ null, null);\r
+\r
+ ArtifactResolutionResult arr = artifactResolver\r
+ .resolveTransitively(artifacts, project.getArtifact(),\r
+ local, remoteRepos, artifactMetadataSource, null);\r
+\r
+ return arr.getArtifacts();\r
+ } catch (Exception e) {\r
+ throw new SlcException("Cannot resolve dependency for " + project,\r
+ e);\r
+ }\r
+ // Order, just for display\r
+ // Set dependencies = new TreeSet(new ArtifactComparator());\r
+ // dependencies.addAll(arr.getArtifacts());\r
+ // return dependencies;\r
+ }\r
+\r
private Artifact resolve(MavenFile mavenDistribution) {\r
try {\r
Artifact artifact;\r
this.remoteRepositories = remoteRepositories;\r
}\r
\r
+ public void setClassLoader(ClassLoader classLoader) {\r
+ this.classLoader = classLoader;\r
+ }\r
+\r
+ public void setOffline(Boolean offline) {\r
+ this.offline = offline;\r
+ }\r
+\r
}\r