Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Git或TFS的Ivy自定义解析器_Java_Git_Ant_Tfs_Ivy - Fatal编程技术网

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命令。如果打包程序文件位于远程位置,则视为危险
packager.xml

这里是我们放置创建“helloworld.jar”工件的ANT脚本逻辑的地方

该文件用于生成一个ANT脚本,该脚本下载远程工件(使用其安全校验和)并提取或编译将返回到ivy任务的工件

最后注释:

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

我希望下载并编译源代码,因为我试图避免将编译后的文件存储在源代码存储库中。那么,现在很明显,Ivy只用于编译依赖项,这是设置个人存储库的典型解决方案吗?()@E-rich您是对的,您应该使用某种工件存储库。除了ivyroundup,Archiva和Nexus是两种流行的选择。
<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>