如何使用 SBT 为库构建分层 JAR 文件?

Posted

技术标签:

【中文标题】如何使用 SBT 为库构建分层 JAR 文件?【英文标题】:How can I build a hierarchical JAR file for a library with SBT? 【发布时间】:2016-01-28 05:43:33 【问题描述】:

我在一个需要一些依赖项的图书馆工作。 为了便于部署,我想创建一个包含所有内容的 JAR 文件,包括依赖项。

我已经尝试过 sbt-assembly - 这可行,但由于法律原因,它可能是不可取的,所以我正在寻找一种解决方案,其中生成的 JAR 文件包含原始 JAR 文件,并且类路径条目在 MANIFEST .MF 的设置使得客户端类可以将这个“嵌套 JAR 文件”添加到它们的类路径中。

这样的事情可能吗? sbt-one-jar 几乎可以满足我的要求,但仅适用于可执行文件 - 我的产品将生成一个库,因此这不是一个完美的选择。

到目前为止,我一直在使用 SBT,SBT 插件将是最容易使用的,因为现在将everyting 转换为 maven 或 gradle 或 ... 的工作量太大。

【问题讨论】:

法律论据是什么?从技术上讲,无论您是在 jar 中还是在 .class 文件中都有 jar,实际上并没有什么区别。毕竟 jar 只是一个虚拟文件系统。 这个库的许可证说我们不允许修改它。目前尚不清楚重新包装是否算作“修改”——我们只是想保持水密。 【参考方案1】:

在对类查找的工作原理进行了更多思考之后,我们决定放弃这个实验。 基本上类是由 ClassLoader 实例加载的,应用程序的标准类加载器使用如何在 JAR 文件或目录中查找类的固定策略。 似乎要允许一个库位于一个分层 JAR 文件中,我们还必须为这个库(即库客户端)的 用户 提供一个特殊的类加载器,以便我们的客户端可以加载所有需要的来自分层 JAR 的类。

工作量太大,不值得 - 分层 JAR 的整个想法只是为了简化部署,而必须同时使用自己的类加载器会使这种简化无效。

简而言之 - 可能,但可能不值得努力。

【讨论】:

以上是关于如何使用 SBT 为库构建分层 JAR 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 sbt 的包中排除程序集?

仅使用 sbt 构建带有 Gatling 测试的 jar 文件

如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?

SBT:如何创建实用程序 jar 作为构建后步骤以将所有依赖 jar 包含在类路径中

SBT:如何 Dockerize 一个胖罐子?

使用 sbt 进行多项目构建