Apache常春藤。未检索传递依赖项

时间:2016-10-14 08:59:41

标签: java ant dependency-management ivy

我有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来检索AppLib的依赖关系。依赖关系描述如下: 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:retrievesublib-1.0.jar都出现在lib-1.0.jar

实际结果 App/lib中只有lib-1.0.jar。生成的App/lib常春藤报告中未提及Appsublib的依赖关系。在构建期间,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的分辨率级别上使用缓存。

这有意义还是我明显错了?

1 个答案:

答案 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一起被检索,所以也可以检索它。

有点凌乱的解释,并且可能不是解决方案中最优雅的解释,但它是我设法使这项工作正常运行的唯一方法。如果有人知道更好的方法,那么任何帮助都会受到赞赏。