Java Git或TFS的Ivy自定义解析器
我是常春藤的新手,所以可能有一种我在文档中找不到的直截了当的方法,或者我所寻找的是不可能的,但现在开始。我希望能够指定源代码位于使用不同协议的本地和/或远程服务器上的依赖项Java Git或TFS的Ivy自定义解析器,java,git,ant,tfs,ivy,Java,Git,Ant,Tfs,Ivy,我是常春藤的新手,所以可能有一种我在文档中找不到的直截了当的方法,或者我所寻找的是不可能的,但现在开始。我希望能够指定源代码位于使用不同协议的本地和/或远程服务器上的依赖项 具体来说,我有一些存储在本地网络TFS服务器上的项目依赖项,以及存储在远程Git服务器上的其他项目依赖项(更准确地说是www.github.com)。有没有可能让Ivy下载源代码并构建一个jar文件,然后将其用作依赖项?如果是,怎么做?这要么是不可能的,要么需要严重的黑客攻击。Ivy旨在下载已经编译过的依赖项。使用任何现代构
具体来说,我有一些存储在本地网络TFS服务器上的项目依赖项,以及存储在远程Git服务器上的其他项目依赖项(更准确地说是
www.github.com
)。有没有可能让Ivy下载源代码并构建一个jar文件,然后将其用作依赖项?如果是,怎么做?这要么是不可能的,要么需要严重的黑客攻击。Ivy旨在下载已经编译过的依赖项。使用任何现代构建管理工具(Maven、Ivy、Gradle等),只要有可能,您总是最好遵守惯例。你越是偏离这条老路,你最终给自己带来的痛苦就越大
为什么需要动态下载和编译代码?如果您只是想将源代码用于调试目的,可能会有所帮助。如果原因是因为您总是希望在您的VCS中检查任何内容的绝对前沿版本,那么您最好设置某种连续构建,为您生成工件。我将回应@dbyrne的答案,即ivy设计用于管理二进制预编译依赖项。 最好让本地存储库管理员来存储项目的第三方依赖项 然而 从技术上讲,ivy可以使用下载和编译依赖项。这个非常聪明的解析器设计用于获取第三方zip或tar归档,然后使用ANT提取所需的工件 下面是我的示例,它从下载“helloworld”源代码,并将其动态编译到一个名为“helloworld.jar”的jar中 文件夹 项目文件
|-- build.xml
|-- ivysettings.xml
|-- ivy.xml
`-- repository
`-- leachim6
`-- hello-world
`-- 1.0
`-- packager.xml
ivy.xml
声明对“hello world”工件1.0版的依赖关系。在这个级别上,ivy需要从某种第三方存储库获取一个jar
ivysettings.xml
这就是我们定义要使用的存储库(或ivy speak中的解析器)的地方。默认情况下,ivy从Maven Central检索,但是,我们另外指定应该使用packager解析器检索“hello world”模块
分装商属性需要进一步解释:
- resourceCache:这是存储下载的存档文件的地方
- buildRoot:这是解压缩下载的归档文件并对其执行操作的地方
- 受限的:通常情况下,打包程序不允许运行诸如javac和delete之类的ANT命令。如果打包程序文件位于远程位置,则视为危险
这里是我们放置创建“helloworld.jar”工件的ANT脚本逻辑的地方
该文件用于生成一个ANT脚本,该脚本下载远程工件(使用其安全校验和)并提取或编译将返回到ivy任务的工件
最后注释:
- 这是一个人为的例子。在现实生活中,您会发现编译逻辑通常比简单的javac调用更复杂
- github项目发布另一个版本后,此示例将立即中断。(此样本没有发布标签)
<ivy-module version="2.0">
<info organisation="com.demo" module="packager_demo"/>
<dependencies>
<dependency org="leachim6" name="hello-world" rev="1.0"/>
</dependencies>
</ivy-module>
<ivysettings>
<settings defaultResolver="central"/>
<resolvers>
<ibiblio name="central" m2compatible="true"/>
<packager name="packager" buildRoot="${user.home}/.ivy2/packager/build" resourceCache="${user.home}/.ivy2/packager/cache" preserveBuildDirectories="false" restricted="false">
<ivy pattern="file:///${ivy.settings.dir}/repository/[organisation]/[module]/[revision]/ivy.xml"/>
<artifact pattern="file:///${ivy.settings.dir}/repository/[organisation]/[module]/[revision]/packager.xml"/>
</packager>
</resolvers>
<modules>
<module organisation="leachim6" name="hello-world" resolver="packager"/>
</modules>
</ivysettings>
<packager-module version="1.0">
<property name="name" value="${ivy.packager.module}"/>
<property name="version" value="${ivy.packager.revision}"/>
<resource dest="archive" url="https://github.com/leachim6/hello-world/tarball/master" sha1="7f0e2836d1e8dc6130cca68d29b6f86027b22983" type="tar.gz"/>
<build>
<mkdir dir="classes"/>
<javac srcdir="archive/leachim6-hello-world-38f6567/j" includes="*.java" destdir="classes"/>
<jar destfile="artifacts/jars/${name}.jar" basedir="classes"/>
</build>
</packager-module>