我是 Ivy 的新手,所以也许有一个直接的方法我无法在文档中找到,或者我正在寻找的东西是不可能的,但这里有。我希望能够指定源代码位于使用不同协议(protocol)的本地和/或远程服务器上的依赖项。
具体来说,我有一些存储在本地网络 TFS 服务器上的项目依赖项和存储在远程 Git 服务器上的其他项目依赖项(更准确地说是 www .github.com
)。是否可以让 Ivy 下载源代码并构建一个 jar 文件,然后将其用作依赖项?如果是,怎么办?
最佳答案
我赞同@dbyrne 的回答,即ivy 旨在管理二进制预编译依赖项。 您最好拥有像 Nexus 这样的本地存储库管理器存储项目的第 3 方依赖项。
然而……
从技术上讲,ivy 可以使用packager resolver 来下载和编译依赖项。 .这个非常聪明的解析器旨在获取第 3 方 zip 或 tar 存档,然后使用 ANT 提取所需的工件。
下面是我的示例,它从 github leachim6 repository 下载“hello world”源代码并将其即时编译成一个名为“hello-world.jar”的 jar。
文件
项目文件
|-- build.xml
|-- ivysettings.xml
|-- ivy.xml
`-- repository
`-- leachim6
`-- hello-world
`-- 1.0
`-- packager.xml
Ivy .xml
<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>
声明对“hello-world”工件 1.0 版的依赖。在这个级别上,ivy 应该从某种第 3 方存储库中获取一个 jar。
Ivy 设置.xml
<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>
这是我们定义要使用的存储库(或 ivy 中的解析器)的地方。默认情况下,ivy 从 Maven Central 检索,但是,我们另外指定应该使用打包解析器检索“hello-world”模块。
包装器属性需要进一步解释:
- resourceCache :这是存储下载的存档的地方。
- buildRoot :这是下载的存档解压缩和操作的地方。
- restricted :通常不允许打包程序运行 ANT 命令,如 javac 和 delete。如果打包程序文件位于远程位置,则被认为是危险的。
packager.xml
<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>
这里是我们放置创建“hello-world.jar”工件的 ANT 脚本逻辑的地方。
此文件用于生成一个 ANT 脚本,该脚本下载远程工件(使用它的校验和以确保安全)并提取出来,或者在我们的例子中编译将返回给 ivy 任务的工件。
最后的注释:
- 这是一个人为的例子。在现实生活中,您会发现编译逻辑通常比简单调用 javac 更复杂。
- 一旦 github 项目发布另一个版本,此示例就会中断。 (没有发布标签作为此样本的基础)
关于java - 用于 Git 或 TFS 的 Ivy 自定义解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9294996/