如何在eclipse中使用Ivy + IvyDE将不同的jar放到lib和web-inf/lib中

Posted

技术标签:

【中文标题】如何在eclipse中使用Ivy + IvyDE将不同的jar放到lib和web-inf/lib中【英文标题】:How to use Ivy + IvyDE in eclipse to put different jars in lib and web-inf/lib 【发布时间】:2013-08-15 19:18:33 【问题描述】:

所以,我正在尝试将 Ivy 添加到我的项目中,该项目会输出一个 WAR 文件。一些依赖项,例如 RESTEasy 和 Jackson 在 JBoss 的运行时可用,所以我不希望它们在我的 war/WEB-INF/lib 文件夹中。其他库无法通过 JBoss 模块使用,所以我想将它们包含在我的项目中。

** 注意:在 Eclipse 中,我使用的是动态 Web 模块方面。这个想法是让 IvyDE 将所需的运行时依赖项复制到 war/WEB-INF/lib 中。

最初我创建了 2 个 ivy 配置文件:

ivy.xml - 运行时(不包括在 WAR 中) ivy_web.xml - 包含在战争中

然后我使用 GUI 来配置与 Ant 检索任务等效的 IDE。因此,在我并不想在 IDE 中使用的 ANT 构建文件中,我有以下内容:

<ivy:retrieve pattern="war/WEB-INF/lib/[artifact]-[revision].[ext]" file="ivy-web.xml" type="jar" />
<ivy:retrieve pattern="lib/[artifact]-[revision].[ext]" file="ivy.xml" type="jar" />
图片还不允许:-(

我注意到在另一篇评论 (mapping multiple ivy files in Eclipse) 中他们提到只使用 1 个 ivy.xml - 但我不太确定如何到达那里?

哦,我也注意到了这一点:IvyDE + WTP: How to workaround that ivy library is ignored by WTP? - 但是我的项目没有使用正确的方面,我宁愿不添加它们。

所以,在阅读了这篇 (https://***.com/a/16575318/880884) 帖子后,我在我的项目中添加了编译和运行时配置。它看起来像这样:

<configurations>
    <conf name="compile" description="used for building"/>
    <conf name="runtime" description="used for running"/>
</configurations>

 <dependencies>
    <!-- compile -->
    <dependency org="org.codehaus.jackson" name="jackson-core-asl" rev="1.9.2" conf="compile->default"/>
    <dependency org="org.codehaus.jackson" name="jackson-xc" rev="1.9.2" conf="compile->default"/>
    <dependency org="org.codehaus.jackson" name="jackson-jaxrs" rev="1.9.2" conf="compile->default"/>


    <!-- runtime -->
    <dependency org="com.google.guava" name="guava" rev="14.0.1" conf="runtime->default"/>
    <dependency org="com.google.inject" name="guice" rev="3.0"  conf="runtime->default"/>
    <dependency org="aopalliance" name="aopalliance" rev="1.0" conf="runtime->default"/>
    <dependency org="javax.inject" name="javax.inject" rev="1" conf="runtime->default"/>
</dependencies>

我再次尝试添加一个 ivy.xml。接下来我进入项目属性 > Ivy > 检索列表 > 添加 - 添加了 2 个不同的配置,一个用于编译,映射到 /lib。另一个使用“运行时”配置并为检索模式指定“war/WEB-INF/lib/[artifact]-[revision].[ext]”。

但是,我最终在我的 war/WEB-INF/lib/ 中得到了“编译”,这不是我想要的。我只希望将运行时依赖项复制到那里。

【问题讨论】:

【参考方案1】:

我认为您缺少的一点是在检索任务中使用配置:

<ivy:retrieve pattern="lib/[artifact]-[revision].[ext]" conf="compile" />

配置是 ivy 将依赖项组合在一起的机制。

示例

├── build.xml
├── ivy.xml
└── target
    ├── lib
    │   ├── jackson-core-asl-1.9.2.jar
    │   ├── jackson-jaxrs-1.9.2.jar
    │   ├── jackson-mapper-asl-1.9.2.jar
    │   └── jackson-xc-1.9.2.jar
    ├── reports
    │   ├── ivy-report.css
    │   ├── myorg-mymodule-compile.html
    │   └── myorg-mymodule-runtime.html
    └── war
        └── WEB-INF
            └── lib
                ├── aopalliance-1.0.jar
                ├── asm-3.1.jar
                ├── cglib-2.2.1-v20090111.jar
                ├── guava-14.0.1.jar
                ├── guice-3.0.jar
                └── javax.inject-1.jar

build.xml

<project name="demo" default="retrieve" xmlns:ivy="antlib:org.apache.ivy.ant">

   <property name="build.dir" location="target"/>

    <target name="resolve" description="Use ivy to resolve dependencies">
        <ivy:resolve/>
        <ivy:report todir='$build.dir/reports' graph='false' xml='false'/>
    </target>

    <target name="retrieve" depends="resolve" description="Populate directories">
      <ivy:retrieve pattern="$build.dir/lib/[artifact]-[revision].[ext]" conf="compile" />
      <ivy:retrieve pattern="$build.dir/war/WEB-INF/lib/[artifact]-[revision].[ext]" conf="runtime" />
    </target>

    <target name="clean" description="Cleanup build files">
        <delete dir="$build.dir"/>
    </target>

    <target name="clean-all" depends="clean" description="Additionally purge ivy cache">
        <ivy:cleancache/>
    </target>

</project>

注意事项:

上面的示例还生成了一个依赖关系解析报告,我发现它对于查看每个配置的内容非常有用。

ivy.xml

<ivy-module version="2.0">
  <info organisation="myorg" module="mymodule"/>

  <configurations>
    <conf name="compile" description="used for building"/>
    <conf name="runtime" description="used for running"/>
  </configurations>

  <dependencies>
    <!-- compile -->
    <dependency org="org.codehaus.jackson" name="jackson-core-asl" rev="1.9.2" conf="compile->default"/>
    <dependency org="org.codehaus.jackson" name="jackson-xc" rev="1.9.2" conf="compile->default"/>
    <dependency org="org.codehaus.jackson" name="jackson-jaxrs" rev="1.9.2" conf="compile->default"/>

    <!-- runtime -->
    <dependency org="com.google.guava" name="guava" rev="14.0.1" conf="runtime->default"/>
    <dependency org="com.google.inject" name="guice" rev="3.0" conf="runtime->default"/>
    <dependency org="aopalliance" name="aopalliance" rev="1.0" conf="runtime->default"/>
    <dependency org="javax.inject" name="javax.inject" rev="1" conf="runtime->default"/>
  </dependencies>
</ivy-module>

【讨论】:

我很高兴找到了这个问题,因为这正是我的问题。不幸的是,我不明白答案。它似乎没有回答这个问题。 OP 和我正在使用 IvyDE 插件。 @stepanian 我将 ivy 与 ANT 一起使用,因此提供了一个示例 build.xml 示例。 Eclipse 插件应该可以正常工作。你试过这个例子吗? 因此,一旦在 ivy.xml 文件中定义了“编译”和“运行时”配置(我理解),您如何使 ivyDE 不将“编译”依赖项添加到 Eclipse 生成的战争文件中?我不想弄乱构建文件 - 这是我认为使用插件的好处之一。 @stepanian 抱歉,我不太明白这个问题。不是创建 WAR 的 ANT 构建文件吗? 这真的是我的问题——我从不直接使用构建文件。我使用 Eclipse 导出到战争工具来创建战争文件。目前,来自 ivy.XML 文件的所有依赖项都已添加到战争中。我想排除一些。我需要最简单的方法来实现这一点。我将在评论中发布一个单独的问题并在此处链接到它。【参考方案2】:

我今天偶然发现了这个。鉴于 IvyDE 组件,我们在这里仍然缺少一些相关信息。为了使事情在 Eclipse IDE 中完全按照我想要的方式工作,我利用了 IvyDE 中一些不太明显的特性。

1 - 对于项目中的 Ivy 库,编辑设置以仅包含“提供”属性。展开 Java 库树,然后右键单击“Ivy”,选择“属性”。

2 - 对于 WEB-INF/lib 库,利用项目属性 IvyDE 部分下的检索功能。

选择适当的配置并将 Pattern 设置为您的 WEB-INF/lib 文件夹的位置。

【讨论】:

注意:IvyDE 中显然有一个新功能,它更直接地旨在解决 WEB-INF/lib 需求,并与 WTP 一起使用。不过我还没有尝试过。

以上是关于如何在eclipse中使用Ivy + IvyDE将不同的jar放到lib和web-inf/lib中的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse安装ivy插件

无法使用 Eclipse 中的 IvyDE 插件从常春藤缓存中删除过时的工件

如何将 Ivy 的依赖项添加到 Eclipse PDE 目标平台?

ivy 和 ivyde 以及 FileSystem 解析器

在 Eclipse 中,如何对 Ivy 解析的 jar 进行排序

ivy + eclipse 运行时依赖部署