等同于 Java 中的 C++ header 文件?

Equivalent to C++ header files in Java?

我有一个大型 Java 库,我想开发几个与该库接口的较小应用程序。该库将作为 JAR 出现在目标设备的 class-path 上,但我想尽可能避免将整个库(JAR 或源代码)出现在 compile-time 上。 (如果重要的话,JAR 非常大,我也想保护知识分子 属性,尽管这不是我的主要关注点。)

在 C++ 中,我会通过创建一个 DLL (.so) 并将相关 class 和函数定义 headers 复制到我的项目并在编译时将它们添加到包含路径来解决这个问题时间,让动态链接器在运行时完成工作。

如何在 Java 中执行此操作?我的一个想法是删除私有 methods/members,并剥离相关 classes 的方法,以便它们的主体为空,并在运行时加载具有相同签名的真实 classes 和方法.然而,这种方法看起来非常丑陋和简陋,而且需要一些工具来自动化这个过程。有没有工具可以做到这一点?有没有更好的方法?

我不认为它与 this question 重复。这个问题的重点是通过删除不必要的 classes 来在编译时最小化生成的 JAR 文件的大小。我的意思不是要删除未使用的定义,而是要完全避免在编译时需要完整的库 JAR。虽然这些很相似,并且可能有一种方法可以使用 ProGuard 实现我想要的,但链接的问题没有讨论它。

在 Java 中没有头文件的完全等价物,但是在没有实际实现的情况下针对 "header" 进行编译(在 "contract" 的含义中)可以使用接口来实现:

  • 为您想要 "header" 的每个 class 创建接口,并使用相关方法
  • 使实际的 classes 实现各自的接口
  • 将接口打包到一个 JAR 中,将实现打包到另一个 JAR 中
    • (如果你使用的是Maven这样的构建工具,使用两个项目,让实现项目依赖接口一个)
  • 只在编译时提供接口JAR,运行时都提供

当然需要一些知道实际实现并可以实例化它们的工件,否则您将不得不使用一些查找来搜索 class路径以寻找合适的实现。

如果您的问题只是由于最终 jar 的最小化,并且您使用 Apache Maven,您可以在 pom.xml 中声明依赖项时尝试使用选项 "provided"。

例如我使用这个依赖声明:

    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcpkix-jdk15on</artifactId>
        <version>1.48</version>
        <scope>provided</scope>
    </dependency>

这意味着我的 java 编译器使用 bouncycastle 库进行编译,但最终并没有将其包含在最终的 jar 中。您应该在执行期间提供它。