我们有一个代码库,里面没有ivy.xml和其他元数据文件。因为它是由另一个不使用ivy/maven但会频繁交付代码的团队发布的。
所需依赖项的JAR文件存储在单个目录内的扁平结构中,没有版本数据的组织/模块/版本结构。
ivy是否允许在核心产品中进行这种依赖关系解析,还是我需要编写自定义解析器?
谢谢
所需依赖项的JAR文件存储在单个目录内的扁平结构中,没有版本数据的组织/模块/版本结构。
ivy是否允许在核心产品中进行这种依赖关系解析,还是我需要编写自定义解析器?
谢谢
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
<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-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>
注:
<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>
注意事项:
理解ivy模式帮助我解决了问题。关键是在存储库没有ivy文件的情况下,永远不要指定ivy模式。