Разрешить и загрузить зависимость программно - без промежуточного файла плюща - PullRequest
0 голосов
/ 21 мая 2019

У меня есть метод, который я использую для разрешения зависимостей с помощью 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 напрямую?

...