【问题标题】:using IVY dependencies manager programmatically以编程方式使用 IVY 依赖项管理器
【发布时间】:2011-04-26 16:39:34
【问题描述】:

我在使用 IVY 作为依赖管理器时需要帮助
我的应用程序需要在运行时加载插件
意味着在核心应用程序运行时,用户可以请求新的插件
并安装它们,
我希望使用核心应用程序数据库管理所有已安装的插件。

我想从我的插件服务器(或其他一些描述符)中获取一个 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

【问题讨论】:

  • 您需要指出返回的错误。
  • 是的,我不知道如何设置我的存储库。
  • 添加了一个示例设置文件,用于配置 Maven 存储库的位置。在下面查看我的邮件

标签: java jar dependencies ivy


【解决方案1】:

Ivy 可以用作standalone 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 内置了对调用 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

刚刚发现一篇文章详细介绍了如何invoke Ivy from Java

【讨论】:

  • 这是一种方法......但是由于 ivy 它是一个 java API 为什么不调用 ivy 方法,并从代码中设置 IVY 设置,
  • 我想没有理由不这样做。我敢肯定,如果您打开源代码,您会发现 ivy 的所有优点。请记住,Ivy 的主要用例是 ANT 插件,但它已成功嵌入到 Groovy、Grails 和 Gradle 中
  • 是的,这个我知道,我也知道在没有api的情况下挖掘源代码很复杂,也许有人知道如何
  • 使用我给你的 groovy 例子。不要忘记将 groovy 编译成 Java 字节码是可能的。这是另一天的例子
  • 我只是不明白为什么开源 API 会如此封闭,我不想使用 XML,而且我使用 HTTP 下载我自己没有问题,只是想知道依赖关系和下载什么,为什么这么复杂,我快要放弃IVY了
猜你喜欢
  • 2013-10-11
  • 2015-11-05
  • 1970-01-01
  • 2013-03-13
  • 2015-02-12
  • 1970-01-01
  • 2016-09-03
  • 2013-09-08
  • 2010-10-01
相关资源
最近更新 更多