传统仓库的Ivy依赖管理

3
我们有一个代码库,里面没有ivy.xml和其他元数据文件。因为它是由另一个不使用ivy/maven但会频繁交付代码的团队发布的。
所需依赖项的JAR文件存储在单个目录内的扁平结构中,没有版本数据的组织/模块/版本结构。
ivy是否允许在核心产品中进行这种依赖关系解析,还是我需要编写自定义解析器?
谢谢
2个回答

1
标准解析器应该能够获取工件(url, filesystem等)。你将面临的问题是,ivy默认情况下假定版本永远不会更改。如果没有版本信息,你需要调整标准解析器设置,强制ivy始终检查工件。 ivy概念页面解释了这是如何工作的。
一些人,特别是那些来自maven 2领域的人,喜欢使用一个特殊的修订版本来处理经常更新的模块。在maven 2中,这被称为SNAPSHOT版本,有人认为它有助于节省磁盘空间,只保留一个版本,可以制作大量的中间版本,在开发过程中进行操作。

Ivy通过“变更修订版”的概念支持这种方法。变更修订版就是这样一个修订版:Ivy应该考虑到工件随时间可能会发生变化。为了处理这个问题,您可以在依赖标签上将依赖项指定为可变的,或者在您的解析器上使用changingPattern和changingMatcher属性来指示哪个修订版或修订版组应该被视为可变。

个人而言,我不喜欢这种依赖管理方式。您的构建是一个动态目标,很难保持稳定。

我鼓励您说服其他团队至少给他们发布的每个工件附加一个生成编号。然后,您的ivy构建可以使用动态修订版来解析工件。关键点是,在您发送代码时,您的模块将对其第三方库的特定版本有一个依赖关系。

更新

以下是一个示例项目。它使用Maven Central和本地仓库下载其依赖项。

├── build
│   ├── compile
│   │   ├── artifact1.jar   <-- Changing artifact
│   │   └── slf4j-api.jar
│   ├── runtime
│   │   ├── artifact1.jar   <-- Changing artifact
│   │   ├── artifact2.jar   <-- Changing artifact
│   │   ├── log4j.jar
│   │   ├── slf4j-api.jar
│   │   └── slf4j-log4j12.jar
│   └── test
│       ├── artifact1.jar   <-- Changing artifact
│       ├── artifact2.jar   <-- Changing artifact
│       ├── artifact3.jar   <-- Changing artifact
│       ├── hamcrest-core.jar
│       ├── junit.jar
│       ├── log4j.jar
│       ├── slf4j-api.jar
│       └── slf4j-log4j12.jar
├── build.xml
├── ivysettings.xml
└── ivy.xml

本地仓库是非版本化的,没有ivy文件。通常情况下,ivy解析器需要ivy文件(或者在Maven的情况下是POM)来确定远程模块是否已更改。在没有元数据的情况下,您可以在ivy文件中将依赖标记为“changing”。

build.xml

<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">

   <target name="build" description="do something">
     <ivy:retrieve pattern="build/[conf]/[artifact].[ext]"/>
   </target>

   <target name="clean" description="Cleanup build files">
      <delete dir="build"/>
   </target>

   <target name="clean-all" depends="clean" description="Additionally purge ivy cache">
      <ivy:cleancache/>
   </target>

</project>

注:

  • 使用ivy构建文件进行标准化。retrieve任务将文件组成各种配置组。

ivy.xml

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>

    <configurations>
        <conf name="compile" description="Required to compile application"/>
        <conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
        <conf name="test"    description="Required for test only" extends="runtime"/>
    </configurations>

    <dependencies>
        <!-- compile dependencies -->
        <dependency org="org.slf4j" name="slf4j-api" rev="1.7.5" conf="compile->default"/>
        <dependency org="myorg" name="artifact1" rev="NA" conf="compile->default" changing="true"/>

        <!-- runtime dependencies -->
        <dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.5" conf="runtime->default"/>
        <dependency org="myorg" name="artifact2" rev="NA" conf="runtime->default" changing="true"/>

        <!-- test dependencies -->
        <dependency org="junit" name="junit" rev="4.11" conf="test->default"/>
        <dependency org="myorg" name="artifact3" rev="NA" conf="test->default" changing="true"/>
    </dependencies>

</ivy-module>

注:

  • "myorg" 的依赖关系有一个虚拟的 "NA" 条目作为它们的修订版本,并标记为 "changing"。

ivysettings.xml

<ivysettings>
   <settings defaultResolver="central" />
   <resolvers>
      <ibiblio name="central" m2compatible="true"/>
      <url name="myorg-repo">
         <artifact pattern="http://localhost:8080/userContent/[artifact].[ext]"/>
      </url>
   </resolvers>
   <modules>
      <module organisation="myorg" resolver="myorg-repo"/>
   </modules>
</ivysettings>

注意事项:

  • "myorg-repo"解析器只设置为下载"myorg"依赖项。这使得所有其他依赖项可以由Maven Central解析。
  • "myorg-repo"解析器仅声明了一个工件模式,我假设没有要检索的ivy文件。

@mark-oconnor 谢谢Mark,ivy提供了(-[revision])的无版本控制。我的问题是我在仓库中甚至没有ivy文件。结构看起来像http://repo.com/library 这个目录将拥有不同模块的所有jar包。只有jar包,没有元数据。 - Akshat
@Akshat Ivy可以做到这一点,但是如果没有元数据,您将不得不将依赖关系标记为“changing”(解析器通常通过查看元数据来尝试确定更改的远程模块)。我已经提供了一个详细的例子。 - Mark O'Connor

0

理解ivy模式帮助我解决了问题。关键是在存储库没有ivy文件的情况下,永远不要指定ivy模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接