我们有一个没有ivy.xml和其他元数据文件的存储库。因为,它由另一个不使用常春藤/ maven的团队发布,但会继续经常提供代码。
依赖所需的jar存储在单个目录中的扁平结构中,没有修订数据。组织/模块/修订结构不存在。
常春藤是否允许在核心产品中使用此类依赖项解决方案,还是必须编写自定义解析程序?
由于
答案 0 :(得分:1)
标准解析器应该能够获取动作(url,filesystem等)。您将面临的问题是,默认情况下,常春藤假定修订版永远不会更改。如果没有版本信息,您将调整标准解析器设置以强制常春藤检查工件。
ivy concepts页面解释了其工作原理:
有些人,特别是来自maven 2 land的人,喜欢使用一个特殊版本来处理经常更新的模块。在maven 2中,这称为SNAPSHOT版本,有些人认为它有助于节省磁盘空间,只为开发时可以制作的大量中间构建版本保留一个版本。
Ivy支持这种以“改变修订”为概念的方法。不断变化的修订就是:Ivy应该考虑的修订版本可能会随着时间的推移而改变。要处理此问题,您可以指定依赖项作为依赖项标记的更改,或者使用解析程序中的changingPattern和changingMatcher属性来指示应将哪个修订版本或修订组视为更改。
我个人不喜欢这种依赖管理。你的构建是一个移动的目标帖子,很难保持稳定。
我鼓励说服其他团队至少为他们发布的每件工件附加一个内部版本号。然后,您的常春藤版本可以使用动态修订来解析工件。关键是,当您发送代码时,您的模块将依赖于其第三方库的特定版本。
以下是一个示例项目。它使用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
本地仓库没有版本,没有常春藤文件。通常情况下,常春藤解析器需要常春藤文件(或Maven情况下的POM)来确定远程模块是否已更改。在没有元数据的情况下,您可以将依赖关系标记为在常春藤文件中更改。
<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>
注意:
答案 1 :(得分:0)
了解常春藤模式帮助我解决了这个问题。只要存储库没有常春藤文件,catch就永远不会指定常春藤模式。