1

当我第一次开始使用 Ivy 时,我询问了配置,并被指向Lightguard 关于该主题的博客文章。我发现它非常有帮助。但是,我现在对这篇文章(和其他文章)所提供的配置有疑问。配置项如下所示:

<conf name="provided" 
    visibility="public" 
    description="this is much like compile, but indicates 
         you expect the JDK or a container to provide it. 
         It is only available on the compilation classpath, 
         and is not transitive."/>

我把description参数分开了,这样更容易看到。注意它说“并且不是传递的”。

Ivy 怎么知道provided配置是不可传递的?配置没有transitive="false"参数。是因为此配置与 Maven 存储库交互的方式使其不可传递吗?或者,这是每个人都从一个博客复制到另一个博客的小故障吗?

4

1 回答 1

2

我认为常春藤配置描述旨在反映Maven 文档中相应的范围描述:

假如

这很像 compile,但表明您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java 企业版构建 Web 应用程序时,您可以将 Servlet API 和相关 Java EE API 的依赖设置为提供的范围,因为 Web 容器提供了这些类。此范围仅在编译和测试类路径上可用,并且不可传递

至于 ivy 如何将此范围转换为 ivy 配置映射,我必须下载一个包含“提供的”范围依赖项的 Maven 模块来检查。

更新

需要记住的是,ivy 会翻译作用域在 Maven 中的工作方式。一个示例模块是:

它的 POM 包含两个“提供的”范围依赖项,它们由 ivy 转换为以下 ivy 依赖项:

<dependency org="org.eclipse.jetty" name="jetty-webapp" ... conf="provided->compile(*),provided(*),runtime(*),master(*)"/>
<dependency org="org.eclipse.jetty.orbit" name="javax.servlet" ... conf="provided->compile(*),provided(*),runtime(*),master(*)"/>

关键是这些依赖项都没有映射到以下 ivy 配置:

  • 默认
  • 编译

这意味着当您声明对jetty-servlets的依赖项时,它们不会被拉下为传递依赖项。

更新

下载 Maven 模块时,ivy 会在刚性作用域系统之间转换为模仿相同操作的 ivy 配置。因此,当您在模块中声明以下配置映射“provided->default”时,会将远程模块“编译”依赖项下拉到本地“提供”配置中(“编译”范围是 Maven 中的默认值和也在常春藤翻译的 Maven 模块中)。

要检索远程“提供”依赖项,您必须指定“提供->提供”,这可以使用 ivy,但不是 Maven 模块支持的操作。

于 2012-10-22T19:53:11.607 回答