我有一种方法可以用来使用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类实际上是一个保存组,工件和版本的bean。 FileUtil只是一个实用工具,用完后将删除临时Ivy文件。我没有提供上述代码,因为您不需要它们,但我可以根据要求将其添加到问题中。
我真正想做的是根本不必使用Ivy文件,只需指定模块描述符即可。
但是,当我尝试将上述解析方法(ivy.resolve(ivyFile, resolveOptions);
)从使用ivyFile更改为直接传递模块描述符(ivy.resolve(md, resolveOptions);
)时,它将失败,并且不会下载所需的从属JAR
我是否必须使用中间Ivy文件,或者有什么方法可以直接通过ModuleDescriptor摆脱那一部分并明确我想要的东西?如果是这样,它是如何完成的,因为我无法理解仅将模块描述符写入Ivy文件然后使用它的区别。为什么我不能直接使用ModuleDescriptor对象?