如何使用 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 构建带有 Gatling 测试的 jar 文件
如何使用 sbt-assembly 和 sbt-native-packager 构建 deb 包以包含单个程序集 jar?