以编程方式解决和下载依赖项-无需中间Ivy文件

时间:2019-05-21 18:28:20

标签: java ivy

我有一种方法可以用来使用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对象?

0 个答案:

没有答案