En dehors d'un plugin Maven, vous pouvez le faire de manière programmatique en utilisant Aether. Il existe une méthode readArtifactDescriptor
qui fait exactement cela :
Obtient des informations sur un artefact telles que ses dépendances directes et les relocalisations potentielles.
Tout d'abord, ajoutez les dépendances Aether à votre POM :
org.eclipse.aether
aether-impl
${aetherVersion}
org.eclipse.aether
aether-connector-basic
${aetherVersion}
org.eclipse.aether
aether-transport-file
${aetherVersion}
org.eclipse.aether
aether-transport-http
${aetherVersion}
org.apache.maven
maven-aether-provider
${mavenVersion}
1.1.0
3.3.9
Ensuite, vous pouvez avoir :
public static void main(final String[] args) throws Exception {
DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
RepositorySystem system = newRepositorySystem(locator);
RepositorySystemSession session = newSession(system);
RemoteRepository central = new RemoteRepository.Builder("central", "default", "http://repo1.maven.org/maven2/").build();
Artifact artifact = new DefaultArtifact("groupId:artifactId:version");
ArtifactDescriptorRequest request = new ArtifactDescriptorRequest(artifact, Arrays.asList(central), null);
ArtifactDescriptorResult result = system.readArtifactDescriptor(session, request);
for (Dependency dependency : result.getDependencies()) {
System.out.println(dependency);
}
}
private static RepositorySystem newRepositorySystem(DefaultServiceLocator locator) {
locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
locator.addService(TransporterFactory.class, FileTransporterFactory.class);
locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
return locator.getService(RepositorySystem.class);
}
private static RepositorySystemSession newSession(RepositorySystem system) {
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
LocalRepository localRepo = new LocalRepository("target/local-repo");
session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));
// set possible proxies and mirrors
session.setProxySelector(new DefaultProxySelector().add(new Proxy(Proxy.TYPE_HTTP, "host", 3625), Arrays.asList("localhost", "127.0.0.1")));
session.setMirrorSelector(new DefaultMirrorSelector().add("my-mirror", "http://mirror", "default", false, "external:*", null));
return session;
}
Ce que cela fait, c'est créer un système de dépôt Aether et lui dire de lire le descripteur de l'artefact d'un artefact donné. L'artefact est construit avec le constructeur new DefaultArtifact("...")
en lui donnant les coordonnées voulues.
Un objet de requête est créé avec cet artefact et la liste des dépôts à partir desquels le récupérer. Dans l'exemple ci-dessus, seul Maven Central a été ajouté, mais vous pourriez ajouter d'autres RemoteRepository
en les créant avec la classe RemoteRepository.Builder
. Après avoir appelé readArtifactDescriptor
, le résultat contient la liste des dépendances directes, qui peuvent être récupérées avec [getDependencies()
](http://download.eclipse.org/aether/aether-core/0.9.0/apidocs/org/eclipse/aether/resolution/ArtifactDescriptorResult.html#getDependencies()).
Les proxies et les miroirs peuvent être configurés à l'aide du DefaultProxySelector
et du DefaultMirrorSelector
respectivement. DefaultProxySelector.add
prend un Proxy
en argument, qui peut être créé avec son constructeur en lui passant son type (comme "http"
), hôte, port et éventuellement une Authentication
(consultez la classe AuthenticationBuilder
pour créer des objets d'authentification), et une liste d'hôtes non proxyfiés. De la même manière, DefaultMirrorSelector.add
prend son identifiant, URL, type (qui est "default"
pour Maven, mais vous pourriez avoir P2 par exemple), s'il s'agit d'un gestionnaire de dépôts, les identifiants de dépôts réellement miroités (selon la spécification de miroir), et le type de dépôt non miroité.