如何让 Ivy 将我的依赖项的依赖项捆绑到他们自己的 jar 中?

Posted

技术标签:

【中文标题】如何让 Ivy 将我的依赖项的依赖项捆绑到他们自己的 jar 中?【英文标题】:How can I get Ivy to bundle dependencies for MY dependencies into their own jar? 【发布时间】:2019-05-22 09:22:44 【问题描述】:

在我的项目中,我只有一个依赖项(现在还为时过早!) - Hibernate。在我的 Ivy 配置中,我有以下内容:

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency org="org.hibernate" name="hibernate-core" rev="5.4.0.Final" conf="sources->sources"/>
    <dependency org="org.hibernate" name="hibernate-core" rev="5.4.0.Final" conf="binaries->default"/>
</dependencies>

在我的 build.xml 中,我有这个:

<ivy:retrieve conf="sources" pattern="war/WEB-INF/lib/[conf]/[artifact](-[classifier]).[ext]"/>
<ivy:retrieve conf="binaries" pattern="war/WEB-INF/lib/[artifact](-[classifier]).[ext]"/>       

现在,在我的 lib 文件夹中,我有一个名为 sources 的文件夹,里面只有一个 jar,hibernate-core-sources.jar - 完美!!但是在 lib 文件夹本身中,我没有一个 jar - 我有 18 个 jar,一个用于 Hibernate 的每个依赖项(以及祖父依赖项等)

我真正想看到的是hibernate-core.jarhibernate-core-deps.jar

这样的事情可能吗?如果不是,是否有可能是hibernate-core.jarmy-app-deps.jar?如果这是不可能的,它可以将它们全部捆绑到一个my-app-deps.jar 中吗?

我对 Ivy 不是很有经验,所以你的答案越明确越好!

【问题讨论】:

为什么需要这个?我的意思是你需要你的依赖项才能运行你的应用程序。问只是因为我们在这里可能有一个 XY 问题:) 因为我喜欢查看我的 lib 文件夹并查看我真正需要能够使用的东西,而不是碰巧是我的依赖项之一的隐藏依赖项。但是,你是对的,我可以看到这可能是一个更大问题的征兆,但现实是它仅仅是为了审美目的。无论如何,Ivy 都能妥善管理它们,这是肯定的。 【参考方案1】:

这是可能的,但您必须注意,当您构建类路径时,您可能会丢失一些类并在运行时抛出NoClassDefFoundError。 解决方案是调用 ivy resolve 一次,将transitive 设置为false,第二次将其设置为true(这是默认设置)。在每一个之后,您必须调用 retrieve 但具有不同的检索模式,因此非传递 (hibernate-core.jar) 到 lib 文件夹和传递到临时文件夹,您可以从中创建 hibernate-core-deps.jar

【讨论】:

以上是关于如何让 Ivy 将我的依赖项的依赖项捆绑到他们自己的 jar 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免使用 Ivy 复制依赖项

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

如何使用 Sonatype Nexus 作为 Ivy 依赖项的镜像 [重复]

Ivy 解决了 Oracle JDBC 依赖项,但不部署具有其他依赖项的 jar

从命令行使用时,如何让 Ivy 将依赖项复制到 lib 目录?

具有 ivy 依赖项的 Eclipse 部署程序集失败