package org.robolectric.internal.dependency; import org.apache.maven.artifact.ant.DependenciesTask; import org.apache.maven.artifact.ant.RemoteRepository; import org.apache.maven.model.Dependency; import org.apache.tools.ant.Project; import org.robolectric.RoboSettings; import org.robolectric.util.Util; import java.net.MalformedURLException; import java.net.URL; import java.util.Hashtable; public class MavenDependencyResolver implements DependencyResolver { private final Project project = new Project(); private final String repositoryUrl; private final String repositoryId; public MavenDependencyResolver() { this(RoboSettings.getMavenRepositoryUrl(), RoboSettings.getMavenRepositoryId()); } public MavenDependencyResolver(String repositoryUrl, String repositoryId) { this.repositoryUrl = repositoryUrl; this.repositoryId = repositoryId; } /** * Get an array of local artifact URLs for the given dependencies. The order of the URLs is guaranteed to be the * same as the input order of dependencies, i.e., urls[i] is the local artifact URL for dependencies[i]. */ public URL[] getLocalArtifactUrls(DependencyJar... dependencies) { DependenciesTask dependenciesTask = createDependenciesTask(); configureMaven(dependenciesTask); RemoteRepository remoteRepository = new RemoteRepository(); remoteRepository.setUrl(repositoryUrl); remoteRepository.setId(repositoryId); dependenciesTask.addConfiguredRemoteRepository(remoteRepository); dependenciesTask.setProject(project); for (DependencyJar dependencyJar : dependencies) { Dependency dependency = new Dependency(); dependency.setArtifactId(dependencyJar.getArtifactId()); dependency.setGroupId(dependencyJar.getGroupId()); dependency.setType(dependencyJar.getType()); dependency.setVersion(dependencyJar.getVersion()); if (dependencyJar.getClassifier() != null) { dependency.setClassifier(dependencyJar.getClassifier()); } dependenciesTask.addDependency(dependency); } dependenciesTask.execute(); @SuppressWarnings("unchecked") Hashtable<String, String> artifacts = project.getProperties(); URL[] urls = new URL[dependencies.length]; for (int i = 0; i < urls.length; i++) { try { urls[i] = Util.url(artifacts.get(key(dependencies[i]))); } catch (MalformedURLException e) { throw new RuntimeException(e); } } return urls; } @Override public URL getLocalArtifactUrl(DependencyJar dependency) { URL[] urls = getLocalArtifactUrls(dependency); if (urls.length > 0) { return urls[0]; } return null; } private String key(DependencyJar dependency) { String key = dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getType(); if(dependency.getClassifier() != null) { key += ":" + dependency.getClassifier(); } return key; } protected DependenciesTask createDependenciesTask() { return new DependenciesTask(); } protected void configureMaven(DependenciesTask dependenciesTask) { // maybe you want to override this method and some settings? } }