У меня есть метод, который я использую для разрешения зависимостей с помощью Ivy и возврата ResolveReport.
Во-первых, вот код:
public static ResolveReport getResolveReport(
final File cacheFile,
final SbtDescriptor sbtDescriptor) throws IOException, ParseException {
final IvySettings ivySettings = new IvySettings();
final URLResolver centralResolver = new URLResolver();
centralResolver.setM2compatible(true);
centralResolver.setName("central");
centralResolver.addArtifactPattern(ARTIFACT_PATTERN);
ivySettings.addResolver(centralResolver);
ivySettings.setDefaultResolver(centralResolver.getName());
if (Objects.nonNull(cacheFile)) {
ivySettings.setDefaultCache(cacheFile);
}
final Ivy ivy = Ivy.newInstance(ivySettings);
final File ivyFile = File.createTempFile("ivy", ".xml");
final DefaultModuleDescriptor md = DefaultModuleDescriptor.newDefaultInstance(ModuleRevisionId.newInstance(
sbtDescriptor.getGroupId(),
sbtDescriptor.getArtifactId() + "-caller",
"working"
));
final DefaultDependencyDescriptor dd = new DefaultDependencyDescriptor(
md,
ModuleRevisionId.newInstance(
sbtDescriptor.getGroupId(),
sbtDescriptor.getArtifactId(),
sbtDescriptor.getVersion()
),
false,
false,
true
);
md.addDependency(dd);
XmlModuleDescriptorWriter.write(md, ivyFile);
final String[] confs = new String[]{"default"};
final ResolveOptions resolveOptions = new ResolveOptions().setConfs(confs);
resolveOptions.setLog(ResolveOptions.LOG_QUIET);
final ResolveReport resolveReport = ivy.resolve(ivyFile, resolveOptions);
FileUtil.delete(ivyFile);
return resolveReport;
}
Для объяснения приведенный выше класс SbtDescriptor эффективнобин, содержащий группу, артефакт и версию.FileUtil - это просто утилита, которая удалит временный файл Ivy после того, как я покончу с ним.Я не предоставил код для вышеперечисленных, так как они вам не нужны, но я могу по запросу добавить их к вопросу.
Что я действительно хотел бы сделать, так это не использоватьФайл Ivy и просто укажите дескриптор модуля.
Однако, когда я пытаюсь изменить описанный выше метод разрешения (ivy.resolve(ivyFile, resolveOptions);
) с использования ivyFile на прямую передачу дескриптора модуля (ivy.resolve(md, resolveOptions);
),он терпит неудачу и не загружает требуемый зависимый JAR.
Должен ли я использовать промежуточный файл Ivy, или есть ли способ, которым я могу избавиться от этой части и конкретного, что я хочу напрямую через ModuleDescriptor?Если так, то как это делается, поскольку я не могу понять разницу в простом написании дескриптора модуля в файл Ivy и последующем его использовании.Почему я не могу просто использовать объект ModuleDescriptor напрямую?