【问题标题】:How to copy runtime libraries without the provided ones in IVY如何在没有 IVY 中提供的运行时库的情况下复制运行时库
【发布时间】:2012-07-28 06:15:19
【问题描述】:

我以为我不需要问这个,但我没有任何进展。

这个问题的解决方案: How are maven scopes mapped to ivy configurations by ivy 实际上解决了问题,但在其理论部分。

我有这个配置:

<conf name="compile"  description="???" />
<conf name="runtime"  description="???" extends="compile" />
<conf name="test"     description="???" extends="runtime" />
<conf name="provided" description="???" />

假设我有这个依赖:

<dependency org="org.apache.tomcat" name="servlet-api" rev="6.0.16" transitive="false" />

我想要的是:当我在捆绑之前调用 ivy:retrieve 将库复制到 .war lib 目录时,我只想复制所有运行时(并隐式编译)而不是 servlet-api。

那么如何使用 ivy:retrieve 呢?

<ivy:retrieve conf="WHAT_TO_PUT_HERE" />

以及如何配置依赖:

<dependency conf="WHAT_IS_THE_CONF_MAPPING" org="org.apache.tomcat" name="servlet-api" rev="6.0.16" transitive="false" />

我在这里停滞不前,所以请任何帮助将不胜感激。

知道 servlet-api 的 ivy.xml 定义了工件

conf="master"

所以我认为问题是如何“真正”将提供的 maven 范围映射到提供的 IVY 配置。

【问题讨论】:

    标签: ivy


    【解决方案1】:

    这是您将依赖项映射到本地“提供”配置的方式:

    <dependency org="org.apache.tomcat" name="servlet-api" rev="6.0.16" conf="provided->master"/>
    

    配置映射工作如下:

    provided->master
       ^        ^
       |        |
     Local    Remote
     config   config
    

    正如答案中所解释的,特殊的“主”配置仅包含此模块本身发布的工件,没有传递依赖:

    这意味着“transitive=false”属性不是必需的。

    更新

    如何使用配置取决于您。第一个选项更简单,但我更喜欢第二种方法,因为我的配置报告与我的类路径内容匹配

    选项 1

    您可以按如下方式创建单个类路径:

    <ivy:cachepath pathid="compile.path" conf="compile,provided"/>
    

    这可以在 javac 任务中使用,如下所示:

    <javac ... classpathref="compile.path">
    ..
    

    选项 2

    或者我更喜欢在配置和类路径之间进行一对一映射:

    <ivy:cachepath pathid="compile.path" conf="compile"/>
    <ivy:cachepath pathid="provide.path" conf="provided"/>
    

    后一种方法的问题是javac任务需要明确说明类路径用法如下:

    <javac ...
       <classpath>
          <path refid="compile.path"/>
          <path refid="provided.path"/>
       </classpath>
    

    我认为这明确解释了您如何使用这个特殊提供的范围,但这完全取决于您。

    【讨论】:

    • 这是否意味着,当我构建编译类路径时,我包含编译依赖项以及提供的依赖项(手动为两者创建类路径),当我进行检索时,我使用runtime conf 所以 Provided 不是它的一部分,对吧?
    • 我不知道我可以在 cachepath 的 conf 中使用两种配置,这就是我已经开始使用第二种方法的原因。但老实说,因为我们正在从“旧的做事方式”迁移。 ANT 的这些 javac 和 junit 任务太多了,我希望尽可能地减少更改。但是,让我们坚持良好的报告和良好的做法。谢谢。
    • +1 对配置映射的详细解释(带有漂亮的 ASCII 图)
    • 我相信更严格地说,配置映射不会将“本地”映射到“远程”配置,而是a configuration of the current module to a dependency configuration(后者不一定需要远程)。
    • @sschuberth 常春藤中的配置映射是一个强大的功能,最初很难理解......“本地”到“远程”在我的大脑中效果更好:-)我认为这是箭头符号。也许我的想法是有缺陷的,但它起源于我理解 ivy 如何在 Maven 中映射“范围”的灯泡时刻。
    猜你喜欢
    • 2023-03-26
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多