一个名为 Jarviz 的新 Java JAR 检查和洞察工具可帮助开发人员在 JAR 中查找不同的字节码版本,并查询其属性、服务等。Sonatype统计数据显示,Maven Central上有517,231个独特的工件。同时,OpenJDK社区每六个月发布一次新版本的Java,每个LTS版本至少支持两年。
Java 应用程序可以使用许多不同的库,而这些库可能依赖于许多其他库。跟踪 Java 应用程序所依赖的所有不同工件(相对于它可以运行的各种 Java 版本)可能具有挑战性。Jarviz 通过提供一个用户友好的 CLI 来检查不同的 JAR 文件及其依赖项来解决这个问题。
InfoQ在最近的0.2.0发布之际采访了Jarviz的创建者Andres Almiray,讨论了Jarviz及其未来。
InfoQ:启动这个项目的灵感是什么?
安德烈斯·阿尔米雷:我编写 CLI 工具和库是一种爱好。我必须注意的许多方面是二进制兼容性。我们知道工具和库可能会带来额外的依赖项,而这些依赖项又必须符合设置的二进制兼容性规则。例如,假设一个Maven插件将其字节码基线设置为Java 8(字节码52)。这意味着其任何依赖项都不得超过该数字。如果是这种情况,那么插件的消费者将被迫升级到下一个兼容的 Java 版本,有时由于各种原因无法发生这种情况。
此外,无论来源或文档如何声明,类都有最终决定权。构建可能会在不知情的情况下拉取错误的依赖项,或者着色依赖项可能会带来无效的类。还有其他方法可以使类进入 JAR 并打破您的字节码期望。这就是为什么检查JAR文件是唯一确定的方法。
Jarviz 的创建就是为了解决这些问题。一旦管道机制到位来检查JAR文件,很明显可以查询其他数据,例如,如果给定的清单条目可用并提取其值或声明性服务的名称(通常在/META-INF/services中找到)及其给定的实现。
InfoQ:Java社区需要更多像Jarviz这样的工具吗?
阿尔米雷:我想是的,是的。我希望看到用Java编写和/或针对JVM生态系统的命令行工具的复兴。GraalVM 本机映像使构建单个平台特定的可执行文件变得简单,如果想要在没有 JVM 的情况下运行所述命令,或者如果启动时间和内存占用被证明是性能驱动因素。
或者,这些工具可以与使用 jlink 制作的最小 Java 运行时捆绑在一起。包装这些工具的选项并不缺乏。在Maven Central上发现的Java库的庞大和范围,加上Java标准库的丰富性,应该使实现特定用例变得更加容易。
InfoQ:在不久的将来,你有什么具体的功能想要实现吗?
阿尔米雷:是的,专门处理多资源 JAR 和 Java 模块。在这方面,最新版本的Java SDK(Java 17及更高版本)增强了其工具(如JAR工具)提供的功能。只要您可以访问 Java 17 SDK,这很好,但如果您很好地坚持使用旧版本,那么您可能不走运。Jarviz 将 Java 11 设置为其基准,从而使运行旧 JVM 的用户更容易。
此外,目前的报告使用纯文本格式进行。它可以增强以支持其他格式,例如 JSON、XML、YAML、markdown 表或其他格式。
InfoQ:Jarviz 的下一步是什么?
阿尔米雷:除了新功能外,下一步还将提供更多选项来执行该工具。如果您查看版本 0.1.0 版本,您会注意到有三种类型的可交付成果:通用(纯 zip/tar)和工具提供程序作为单个可执行 JAR,需要 Java 11 运行时,以及独立,其中包括用于 8 个不同平台的捆绑 Java 运行时。其他可交付成果可能是使用 GraalVM 本机映像制作的本机可执行文件。
Jarviz 还提供了更高级的功能,例如检查或查询清单的内容。基于属性的 MF 文件。在大多数情况下,查看 JAR 文件依赖于哪些服务非常重要,而无需将其解压缩并搜索。