我有3个具有以下结构的项目:
App
| |
...
| |
| +--lib
| | |
| | +--...
| |
| +--dist
|
Lib
| |
...
| |
| +--lib
| | |
| | +--sublib-1.0.jar
| |
| +--dist
| |
| +--lib-1.0.jar
|
SubLib
|
...
|
+--dist
|
+--sublib-1.0.jar
具有以下关系:
App <-- Lib <-- SubLib
我正在使用apache ivy来检索App
和Lib
的依赖关系。依赖关系描述如下:
ivy.xml
的{{1}}:
Lib
<ivy-module version = "2.0">
<info organisation = "com.test.lib" module = "lib"/>
<dependencies>
<dependency org = "com.test.sub.lib" name = "sublib" rev = "1.0" conf = "compile->default"/>
</dependencies>
</ivy-module>
的 ivy.xml
:
App
<ivy-module version = "2.0">
<info organisation = "com.test.app" module = "App"/>
<dependencies>
<dependency org = "com.test.lib" name = "lib" rev = "1.0" conf = "compile->default"/>
</dependencies>
</ivy-module>
:
ivysettings.xml
执行<ivysettings>
<settings defaultResolver = "local"/>
<resolvers>
<filesystem name = "local">
<artifact pattern = "${ivy.settings.dir}/SubLib/dist/[artifact]-[revision].[ext]"/>
<artifact pattern = "${ivy.settings.dir}/Lib/dist/[artifact]-[revision].[ext]"/>
</filesystem>
</resolvers>
<modules>
<module organisation = "com.test.ivytest" resolver = "local"/>
</modules>
</ivysettings>
后, 预期结果,ivy:retrieve
和sublib-1.0.jar
都出现在lib-1.0.jar
实际结果 App/lib
中只有lib-1.0.jar
。生成的App/lib
常春藤报告中未提及App
是sublib
的依赖关系。在构建期间,ant + ivy日志中没有任何类型。
注意: lib
并非构建为胖罐。
我在此配置中缺少什么?
更新
我已经做了一些思考,我得出的唯一结论是这个问题确实是错误的配置。从事实来看,没有检索到传递依赖,我们可以肯定地说,当它解决lib-1.0.jar
时,常春藤没有任何类型的信息。这是有道理的,因为lib
文件夹可以位于文件系统的任何位置。获得有关传递依赖性的信息的唯一方法是在该jar附近的某处Lib/dist
。哪个不是。日志ivy.xml
中的消息稍微确认了这一点。保留信息的唯一方法是[ivy:retrieve] local: no ivy file found for com.test.lib#lib;1.0: using default data
中的缓存数据。生成的%user%/.ivy/cache
文件确实包含依赖关系信息。所以我猜测它能正常工作,我将不得不在App的分辨率级别上使用缓存。
这有意义还是我明显错了?
答案 0 :(得分:0)
好的,问题确实是错误的配置和我对它的理解不足。以下是如何使其工作的详细说明。我的术语不太好,所以我可能在这里误用了一些词。让我们看一下项目配置以及它是什么。
对于具有编译时依赖关系Sublib
的{{1}} , Lib
将成为运行时依赖关系。
guava
因此,我们需要在SubLib SubLib
| `lib
| `guava-19.0.jar
|
`dist
| `--sublib-1.0.jar
|
`src
`...
中进行适当的配置:
ivy.xml
这里,通过声明<ivy-module version="2.0">
<info organisation="com.test.sub.lib" module="sublib"/>
<configurations>
<conf name="runtime" visibility="public"/>
</configurations>
<dependencies>
<dependency org="com.google" name="guava" rev="19.0" conf="runtime->default"/>
</dependencies>
</ivy-module>
配置,我们声明此runtime
描述了一个运行时依赖的模块。由于番石榴没有这样的文件,我们将其描述为默认值。这里很标准。现在,让其他人知道ivy.xml
实际上具有来自sublib-1.0.jar
的依赖关系,我们需要将其发布到存储库,以便这些信息以jar文件旁边的文件guava-19.0.jar
的形式存在。我选择发布到ivy-[version].xml
文件夹。为此,build
需要包含一个解析程序,该解析程序有助于匹配文件模式以便在我们从ivysettings.xml
解析时进行发布和稍后检索。
Lib
<ivysettings>
<settings defaultResolver="filesystem-resolver"/>
<resolvers>
<filesystem name="sublib-resolver">
<ivy pattern="${ivy.settings.dir}/SubLib/dist/repo/ivy-[revision].xml"/>
<artifact pattern="${ivy.settings.dir}/SubLib/dist/repo/[artifact]-[revision].[ext]"/>
</filesystem>
<filesystem name="filesystem-resolver">
<artifact pattern="${ivy.settings.dir}/SubLib/lib/[artifact]-[revision].[ext]"/>
</filesystem>
</resolvers>
<modules>
<module name="sublib" organisation="com.test.sub.lib" resolver="sublib-resolver"/>
</modules>
</ivysettings>
将允许查找相应的sublib-resolver
,其中包含有关ivy-[revision].xml
的依赖关系和位置的信息。而jar
会找到我们的filesystem-resolver
依赖关系。现在,我们只需通过调用我们的解析器发布guava
sublib
:
ant
现在到<target name="publish">
<ivy:publish artifactspattern="${dist.dir}/[artifact]-[revision].[ext]"
resolver="sublib-resolver"
overwrite="true"
pubrevision="${revision}"
/>
</target>
。 Lib将成为Lib
的编译时依赖关系,我们在App
中将其描述为此类,并将ivy.xml
声明为运行时依赖关系< / strong> for it:
SubLib
这里有配置发挥作用以及我最初不了解的内容。 <ivy-module version="2.0">
<info organisation="com.test.lib" module="lib"/>
<configurations>
<conf name="compile" visibility="public"/>
<conf name="runtime" extends="compile" visibility="public"/>
</configurations>
<dependencies>
<dependency org="com.test.sub.lib" name="sublib" rev="2.0" conf="runtime->compile"/>
</dependencies>
</ivy-module>
左侧是可以理解的:runtime->compile
被声明为运行时依赖项,我们将其分配给sublib
conf in it的常春藤文件。在箭头的右侧,我们声明我们也需要runtime
的编译时依赖项。而那样配置的是sublib
。它将由解析器找到并检索。因此,我们还需要guava
的解析器,因此完整的Lib
文件将如下所示:
ivysettings.xml
在<ivysettings>
<properties file="${ivy.settings.dir}/ivysettings.properties"/>
<settings defaultResolver="filesystem-resolver"/>
<resolvers>
<filesystem name="sublib-resolver">
<ivy pattern="${ivy.settings.dir}/SubLib/dist/repo/ivy-[revision].xml"/>
<artifact pattern="${ivy.settings.dir}/SubLib/dist/repo/[artifact]-[revision].[ext]"/>
</filesystem>
<filesystem name="lib-resolver">
<ivy pattern="${ivy.settings.dir}/Lib/dist/repo/ivy-[revision].xml"/>
<artifact pattern="${ivy.settings.dir}/Lib/dist/repo/[artifact]-[revision].[ext]"/>
</filesystem>
<filesystem name="filesystem-resolver">
<artifact pattern="${ivy.settings.dir}/SubLib/lib/[artifact]-[revision].[ext]"/>
</filesystem>
</resolvers>
<modules>
<module name="sublib" organisation="com.test.sub.lib" resolver="sublib-resolver"/>
<module name="lib" organisation="com.test.lib" resolver="lib-resolver"/>
</modules>
</ivysettings>
Lib
中发布Lib
:
build.xml
现在主要问题:传递检索。配置。在<target name="publish">
<ivy:publish artifactspattern="${dist.dir}/[artifact]-[revision].[ext]"
resolver="lib-resolver"
overwrite="true"
pubrevision="${revision}"
/>
</target>
&#39; s App
中,我们需要准确指出我们需要传递依赖项。存储在存储库中的信息是不够的。必须在ivy.xml
App
:
ivy.xml
这里发生的事情如下:通过声明<configurations>
<conf name="compile" visibility="public"/>
</configurations>
<dependencies>
<dependency org="com.test.lib" name="lib" rev="1.0" conf="compile->compile; compile->runtime"/>
</dependencies>
conf,我们声明compile
具有编译配置。与之前一样,第一个箭头链表明我们(编译配置模块App
)想要获得名为App
的编译配置依赖项。分别为左右箭头两侧。第二个箭头集指出我们(编译配置模块lib
)想要获得运行时配置的App
依赖项!这是lib
。因为它与sublib
一起被检索,所以也可以检索它。
有点凌乱的解释,并且可能不是解决方案中最优雅的解释,但它是我设法使这项工作正常运行的唯一方法。如果有人知道更好的方法,那么任何帮助都会受到赞赏。