java - 用于 Git 或 TFS 的 Ivy 自定义解析器

标签 java git ant tfs ivy

我是 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/

相关文章:

java - 动态创建JTextAreas?

java - 使用 ExecutorService/ThreadPool 获取始终 Activity 线程的简单变量列表

java - 多级@JsonTypeInfo和@JsonSubTypes

node.js - 为什么运行npm install时npm-shrinkwrap.json会更改

java - import com.sun.xml.internal.fastinfoset.util.StringArray 无法在 javac 上解析

Android重新打包通过ant debug然后ant release

java - NumberFormatException 在正确的字符串上抛出?

git svn 在非标准 svn 存储库布局上指定分支和标签

java - IntelliJ : Adding ALL Files to git repository

java - 使用 ant 构建脚本从 Clover 报告中排除文件或包