java - 相当于Java中的C++头文件?

标签 java jar shared-libraries javac

我有一个大型 Java 库,我想开发几个与该库接口(interface)的较小应用程序。该库将作为 JAR 出现在目标设备的类路径中,但我想尽可能避免在编译时出现整个库(JAR 或源代码)。 (如果重要的话,JAR 相当大,我也想保护知识产权,尽管这不是我主要关心的问题。)

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

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

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

最佳答案

在 Java 中没有头文件的确切等价物,但是可以使用接口(interface)来实现在没有实际实现的情况下针对“头文件”(在“契约”的含义中)进行编译:

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

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

关于java - 相当于Java中的C++头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997215/

相关文章:

java - java将html表格转为png图片

java 时间戳格式 - 在单行解决方案中避免子字符串 IndexException

c - 在公共(public)头文件中包含条件是否被认为是好的做法?

java - 在 LAN Java/Android 中查找确切的设备

java - 如果 session 过期,如何重定向到登录页面?

java - 使用 Gradle 创建 "fat-JAR"时,log4j.properties 被覆盖

Netbeans 新手——如何启用从 javadoc JAR 文件查看信息

java - 导出的jar文件执行后卡住

c++ - 构建开放资源导入库 (Assimp) 时遇到问题

c++ - 共享库中的静态类成员