适用于Git或TFS的常春藤自定义解析器

我对Ivy很新,所以也许有一种我无法在文档中找到的直接方式或者我正在寻找的东西是不可能的,但是这里有。 我希望能够指定源代码位于使用不同协议的本地和/或远程服务器上的依赖项。

具体来说,我有一些存储在本地网络TFS服务器上的项目依赖项,以及存储在远程Git服务器上的其他项目依赖项(更准确地说是www.github.com )。 有没有可能让Ivy下载源代码并构建一个jar文件,然后将其用作依赖项? 如果是这样,怎么样?

这要么是不可能的,要么是需要严重的黑客攻击。 Ivy旨在下载已编译的依赖项。 使用任何现代的构建管理工具(Maven,Ivy,Gradle等),如果可能的话,最好坚持使用常规。 你越远离这条经过良好打击的道路,你最终会给自己带来的痛苦就越大。

为什么需要动态下载和编译代码? 如果您只想让源代码可用于调试目的, 这个问题可能有所帮助。 如果原因是因为您总是想要检查VCS中的任何内容的绝对前沿版本,那么最好设置某种连续构建,以便为您生成工件。

我会回应@dbyrne的答案,即常春藤旨在管理二进制预编译的依赖项。 您最好有一个像Nexus这样的本地存储库管理器来存储项目的第三方依赖项。

然而….

使用打包器解析器 ,常春藤下载和编译依赖项在技术上是可行的。 这个非常聪明的解析器旨在采用第三方zip或tar存档,然后使用ANT提取所需的工件。

下面是我从github leachim6存储库下载“hello world”源码的示例,并将其编译成一个名为“hello-world.jar”的jar。

项目文件

 |-- build.xml |-- ivysettings.xml |-- ivy.xml `-- repository `-- leachim6 `-- hello-world `-- 1.0 `-- packager.xml 

的ivy.xml

       

声明对“hello-world”工件的1.0版本的依赖性。 在这个级别,常春藤应该从某种第三方存储库中获取一个jar。

ivysettings.xml

              

这是我们定义要使用的存储库(或常春藤说话中的解析器)的地方。 默认情况下,ivy从Maven Central检索,但是,我们还指定应使用打包程序解析程序检索“hello-world”模块。

打包器属性需要进一步解释:

  • resourceCache :这是存储下载的存档的位置。
  • buildRoot :这是下载的存档解压缩并执行操作的地方。
  • restricted :通常不允许打包者运行javac和delete等ANT命令。 如果打包文件位于远程位置,则认为是危险的。

packager.xml

           

这是我们放置ANT脚本逻辑的地方,它创建了“hello-world.jar”工件。

此文件用于生成ANT脚本,该脚本下载远程工件(使用它的校验和以确保安全性)并提取或在我们的案例中编译将返回到常春藤任务的工件。

最后的说明:

  • 这是一个人为的例子。 在现实生活中,您会发现编译逻辑通常比简单调用javac更复杂。
  • 一旦github项目发布另一个版本,此示例将中断。 (没有基于此样本的发布标签)