использование менеджера зависимостей IVY программно - PullRequest
5 голосов
/ 18 октября 2010

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

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

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

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

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

Я нашел одну ссылку в сети кого-то, кто пробовал нечто подобное
но похоже, что код не завершен, или отсутствуют некоторые переменные и я не знаю, как завершить остальное причина озера документации документации
http://www.mail-archive.com/ivy-user@ant.apache.org/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

1 Ответ

8 голосов
/ 19 октября 2010

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

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

Шаблон retrieve может затем использоваться для определения места установки файлов на основе настроек конфигурации 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 имеет встроенную поддержку для вызова задач плюща

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

...