【发布时间】:2017-04-21 04:50:04
【问题描述】:
我有一个大型 Java 库,我想开发几个较小的应用程序来连接这个库。该库将作为 JAR 出现在目标设备的类路径中,但如果可能的话,我想避免在编译时需要整个库(JAR 或源)。 (如果重要的话,JAR 非常庞大,我也想保护知识产权,尽管这不是我最关心的问题。)
在 C++ 中,我将通过创建 DLL (.so) 并将相关的类和函数定义头复制到我的项目并在编译时将它们添加到包含路径来解决这个问题,让动态链接器在运行时。
如何在 Java 中做到这一点?我的一个想法是删除私有方法/成员,并剥离相关类的方法,以便它们的主体为空,并且在运行时加载具有相同签名的真实类和方法。然而,这种方法看起来非常丑陋和原始,而且需要一些工具来自动化这个过程。有没有工具可以做到这一点?有没有更好的办法?
我不认为它与 this question 重复。该问题的重点是通过删除不必要的类来最小化编译时生成的 JAR 文件的大小。我的意思不是删除未使用的定义,而是完全避免在编译时需要完整的库 JAR。虽然这些是相似的,并且可能有一种方法可以使用 ProGuard 实现我想要的,但链接的问题没有讨论它。
【问题讨论】:
-
在 Java 中没有等效的头文件。这是一件非常非常非常好的事情。是的,三个'非常'。
-
嗯,头文件肯定会让人头疼。但这不是我问题的重点。重点是:如何在 Java 中将实现(在编译时不需要知道)与库接口(在编译时必须知道)分开。
-
没有办法,也没有必要做这一切。在编译和运行时,您必须在类路径中包含依赖项 jar。仅此而已,仅此而已。期间。
-
你是对的,我曾经使用过你提出的技术,但完全是出于其他原因。在那种情况下,这是为了什么?在编译期间硬盘驱动器中没有足够的空间来保存 JAR?我想这只是一种 C++ 的思维方式。 Java 和 JVM 最初是为了摆脱这种情况而创建的。 C ++中标头的目的是什么?它可以从实际的库实现中抽象出我的代码。即相同的库在 Linux、Solaris、Windows 等中可能不同。JVM 可以绕过这个问题。有没有打算在编译和运行时对该 JAR 进行不同的实现?
标签: java jar shared-libraries javac