Программное использование диспетчера зависимостей IVY

мне нужна помощь в использовании IVY в качестве диспетчера зависимостей
моему приложению необходимо загружать подключаемые модули во время выполнения
означает, что во время работы основного приложения пользователь может запросить новый подключаемый модуль
и установить их,
я хочу управлять всеми установленными подключаемыми модулями с помощью базы данных основного приложения.

я хочу получить pom с моего сервера подключаемых модулей (или какого-либо другого дескриптора),
и попросить IVY сообщить мне, каковы зависимости ИЛИ позволить IVY установить подключаемый модуль и зависимости, основываясь на текущем состоянии моего применение.

(что у меня есть прямо сейчас,
1.jar используется основным приложением
2.jar используется текущими установленными плагинами)

я хочу, чтобы у каждого плагина был независимый каталог
в какой-то папке, где находится мое приложение (не общая)

дело в том, что я не знаю, с чего начать
я заметил, что для этого нет API программирования

я нашел одну ссылку в сети человека, который пробовал что-то подобное,
но похоже, что код не завершен, или не хватает какой-то переменной, и я не знаю, как заполнить остальные, потому что есть озеро документации по программированию
http://www.mail-archive.com/[email protected]/msg03228.html (куда пришла переменная "art" для.....)

не могли бы вы помочь мне, пожалуйста ... Спасибо всем

ОБНОВЛЕНИЕ

Хорошо, это то, что я сейчас пытаюсь. я получаю сообщение об ошибке, плюс я не знаю, как определить мой архивный сервер

      IvySettings settings = new IvySettings();

     settings.setDefaultIvyUserDir(new File("D:/programming/eclipse_projects/ivyTest/repo/"));

      settings.setDefaultCache(new File("D:/programming/eclipse_projects/ivyTest/repo/cache/"));
      settings.setDefaultCacheArtifactPattern("[module]/[revision]/[module]-[revision](-[classifier]");

  Ivy ivy = Ivy.newInstance(settings);

  ivy.getLoggerEngine().pushLogger(new DefaultMessageLogger(Message.MSG_VERBOSE));

  ModuleDescriptor md =  PomModuleDescriptorParser.getInstance().parseDescriptor(new IvySettings(), new File("src/movies.pom").toURL(), true);

  RetrieveOptions retriveOptions = new RetrieveOptions();
  retriveOptions.setUseOrigin(true);
  retriveOptions.setConfs(md.getConfigurationsNames());
  ivy.retrieve(md.getModuleRevisionId(), "lib/[conf]/[artifact].[ext]", etriveOptions);

это ошибка, которую я получаю

:: loading settings :: url = jar:file:/D:/programming/eclipse_projects/ivyTest/ivy-2.2.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
:: retrieving :: org.jtpc#movies
    checkUpToDate=true
    confs: [default, master, compile, provided, runtime, test, system, sources, javadoc, optional]
java.lang.RuntimeException: problem during retrieve of org.jtpc#movies: java.lang.IllegalStateException: Report file 'D:\programming\eclipse_projects\ivyTest\repo\cache\org.jtpc-movies-default.xml' does not exist.
    at org.apache.ivy.core.retrieve.RetrieveEngine.retrieve(RetrieveEngine.java:206)
    at org.apache.ivy.Ivy.retrieve(Ivy.java:540)
    at Test.main(Test.java:52)
Caused by: java.lang.IllegalStateException: Report file 'D:\programming\eclipse_projects\ivyTest\repo\cache\org.jtpc-movies-default.xml' does not exist.
    at org.apache.ivy.plugins.report.XmlReportParser.parse(XmlReportParser.java:294)
    at org.apache.ivy.core.retrieve.RetrieveEngine.determineArtifactsToCopy(RetrieveEngine.java:288)
    at org.apache.ivy.core.retrieve.RetrieveEngine.retrieve(RetrieveEngine.java:104)
    ... 2 more

person shay    schedule 17.10.2010    source источник
comment
Вам нужно будет указать, какие ошибки возвращаются.   -  person Mark O'Connor    schedule 20.10.2010
comment
да, я не знаю, как установить мой репозиторий.   -  person shay    schedule 21.10.2010
comment
Добавлен пример файла настроек, который будет настраивать расположение вашего репозитория Maven. Смотрите мою почту ниже   -  person Mark O'Connor    schedule 21.10.2010
comment
См. ответ stackoverflow.com/questions/8243930/   -  person Mark O'Connor    schedule 25.11.2011


Ответы (1)


Ivy можно использовать как автономную Java-программу:

java -jar ivy.jar -retrieve "lib/[conf]/[artifact].[ext]"

Затем можно использовать шаблон retrive для определения места установки файлов на основе настроек конфигурации ivy.

$ find lib -type f
lib/core/commons-lang.jar
lib/plugin1/commons-logging.jar
lib/plugin1/commons-codec.jar
lib/plugin2/commons-logging.jar
lib/plugin2/commons-cli.jar
lib/plugin3/commons-logging.jar

Конфигурации используются как коллективная метка или группировка зависимостей. Они похожи на области Maven, но гораздо более гибкие:

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>
    <configurations>
        <conf name="core"    description="Core application dependencies"/>
        <conf name="plugin1" description="Plugin 1 dependencies"/>
        <conf name="plugin2" description="Plugin 2 dependencies"/>
        <conf name="plugin3" description="Plugin 3 dependencies"/>
    </configurations>
    <dependencies>
        <dependency org="commons-lang"    name="commons-lang"    rev="2.5"   conf="core->default"/>
        <dependency org="commons-codec"   name="commons-codec"   rev="1.4"   conf="plugin1->default"/>
        <dependency org="commons-cli"     name="commons-cli"     rev="1.2"   conf="plugin2->default"/>
        <dependency org="commons-logging" name="commons-logging" rev="1.1.1" conf="plugin1,plugin2,plugin3->default"/>
    </dependencies>
</ivy-module>

Если вы хотите загрузить и установить только один набор jar-файлов, в указанный каталог вы можете использовать параметр confs:

java -jar ivy.jar -retrieve "plugin1/[artifact].[ext]" -confs plugin1

Наконец, если вы все еще хотите использовать программный API, вы можете вызвать метод run, вызываемый основным классом.

http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/Main.java?view=markup

Обновление 1

Groovy имеет встроенную поддержку для вызова задач ivy.

import groovy.xml.NamespaceBuilder

def ant = new AntBuilder()
def ivy = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.ivy.ant')

ivy.settings(file:"ivysettings.xml")
ivy.retrieve(pattern:"lib/[conf]/[artifact].[ext]")
ivy.report(toDir:'reports', graph:false) 

Обновление 2

Чтобы указать расположение вашего локального репозитория Maven, вам нужно использовать файл ivysettings.xml.

<ivysettings>
  <settings defaultResolver='nexus' />
  <resolvers>
    <ibiblio name='nexus' root='http://myhost.mydomanin.com:8081/nexus' m2compatible='true' />
  </resolvers>
</ivysettings>

Обновление 3

Только что нашел статью, в которой подробно описано, как вызов Ivy из Java

person Mark O'Connor    schedule 18.10.2010
comment
это способ сделать это ..., но поскольку ivy - это java API, почему бы не вызвать методы ivy и не установить настройки IVY из кода, - person shay; 19.10.2010
comment
Я полагаю, что нет причин, почему бы и нет. Я уверен, что если вы откроете исходный код, вы обнаружите все достоинства ivy. Помните, что основным вариантом использования Ivy является плагин для ANT, но он был успешно встроен в Groovy, Grails и Gradle. - person Mark O'Connor; 19.10.2010
comment
да, это я знаю, также я знаю, что копаться в исходном коде без API сложно, может быть, кто-то знает, как - person shay; 20.10.2010
comment
Используйте заводной пример, который я вам дал. Не забывайте, что groovy можно скомпилировать в байт-код Java. Это пример для другого дня - person Mark O'Connor; 20.10.2010
comment
я использовал ваше обновление, см. обновленный вопрос, как я могу добавить правильный комментарий с кодом? - person shay; 20.10.2010
comment
Я задолбался. Не похоже, что вы собираетесь принять мое предложенное решение. Вы также расширили объем своего первоначального вопроса, включив в него конфигурацию архива..... Могу ли я указать, что гораздо более простым решением было бы загрузить необходимые файлы jar с помощью HTTP из репозитория Maven. - person Mark O'Connor; 20.10.2010
comment
я просто не понимаю, почему API с открытым исходным кодом может быть настолько закрытым, я не хочу использовать XML, и у меня нет проблем с загрузкой себя с помощью HTTP, просто хочу знать, каковы зависимости и что загружать, почему так сложно, я на грани отказа от IVY - person shay; 23.10.2010
comment
Ты ведешь себя неразумно. Вызов внутренних методов Java никогда не может считаться API. Ivy изначально разрабатывался как плагин для ANT. Вы обнаружите, что Maven еще менее доступен. Мой прощальный совет: Sonatype выпустила новый программируемый API для Maven 3.0. Возможно, это то, где вы должны искать. - person Mark O'Connor; 24.10.2010
comment
Только что нашел статью, в которой подробно описано, как вызывать ivy из Java. См. обновление статьи 3 - person Mark O'Connor; 08.11.2010