Ohhnews

分类导航

$ cd ..
foojay原文

jip:克隆Java项目即可运行,摆脱Maven与Gradle的繁琐配置

#jip#java#依赖管理#开发工具#开源软件

我为什么创建 jip

这个项目始于一个简单的挫败感,而不是一个要重新发明 Java 开发的宏大计划。

我相信你偶尔会从 GitHub 克隆 Java 项目,用来验证一个想法、探索某个库,或者看看别人是怎样解决问题的。我也会这么做。而有一件事让我越来越沮丧:我常常不能直接开始看代码,反而为了把项目跑起来,不得不和 Maven 或 Gradle 较劲。

你克隆了一个仓库,想要做点实验。结果却要弄清楚构建配置、插件、依赖声明、包装脚本,以及项目所需的其他各种东西。你并不一定每台机器上都安装了 Maven 或 Gradle,而修改或添加依赖,可能让一次快速实验变成比实验本身还多的工作。

Rust 让我看到,当这些问题被整合进开发工作流时,可以处理得多么干净利落。我想把这种简洁性的一部分带到 Java 中:直截了当的依赖管理、可读的配置,以及不碍事的工具。

这就是我创建 jip 的原因:一个简单的工具,用来克隆 Java 项目、解析依赖并运行代码,而不会把一次快速实验变成构建系统练习。

目标很简单:在发现一个 Java 项目和真正使用它之间,减少障碍。

为什么 Java 不能有更简单的方式?

我使用其他编程语言的时间越长,就越欣赏它们处理依赖管理的方式。

Python 有 pip,以及一种直截了当的依赖声明方式。Rust 有 Cargo,具备清晰的项目清单、依赖解析,以及用于可复现构建的锁文件。

而 Java 有 Maven 和 Gradle。两者都很强大,对复杂项目很有用,但如果只是试跑代码,它们会显得没必要地复杂。

为什么我只是测试和调整一个小型 Java 项目,就需要理解整个构建系统?

我想要一种更接近 Rust 体验的方式:紧凑的依赖文件、可预测的工作流,以及一个管理基本事项的单一工具。

这个想法最终变成了 jip。

jip 是什么?

jip 是一个轻量级、受 pip 启发的 Java 依赖管理器和运行器。 它以单个二进制文件的形式分发,使用精简的 jip.toml 配置文件,而不需要为日常开发准备复杂的构建配置。

基本工作流很直接:

$ bash
jip get https://github.com/example/project.git
cd project
jip run

无需安装 Maven 或 Gradle。jip 会处理依赖,这样你就可以专注于探索代码,而不是和构建系统较劲。

jip 会解析依赖、在需要时编译 Java 源码、检测主类,并运行应用程序。

你也可以使用 jip get 克隆仓库,并自动将检测到的 Maven 或 Gradle 配置转换为 jip.toml 文件。执行仍然是一个独立且明确的步骤,因此你可以在运行前检查代码。

目标很简单:把时间花在探索 Java 代码上,而不是研究如何启动它。

紧凑的依赖配置

jip 不使用庞大的构建配置,而是用 TOML 描述项目所需的依赖。

例如:

$ toml
[project]
name = "hello-java"
version = "1.0.0"
java = "25"

[dependencies]
com.google.guava:guava = "33.0.0-jre"

[test-dependencies]
org.junit.platform:junit-platform-console-standalone = "1.11.4"

该配置将运行时依赖与测试依赖分开。jip 还支持仅编译依赖、自定义仓库,以及一个 jip.lock 文件,用于固定已解析的依赖版本。

最终得到的配置易于阅读、理解和维护。

不仅仅是依赖

虽然最初的动机是让 GitHub 项目更容易运行,但 jip 已经发展成一套实用的 Java 开发工具集合。

它的一些功能包括:

  • 依赖管理: 添加、移除、更新和检查依赖。
  • 构建与执行: 编译项目、检测主类并运行应用程序。
  • GitHub 工作流: 克隆仓库,并转换受支持的 Maven 和 Gradle 配置。
  • 可复现性: 锁定已解析的依赖版本,并支持使用缓存依赖进行离线执行。
  • 测试: 编译并运行 JUnit 测试。
  • 打包: 构建标准 JAR,或包含所有依赖的自包含可执行 fat JAR。
  • JDK 管理: 安装、列出、选择和移除来自受支持供应商的 JDK 安装。
  • 项目维护: 检查依赖树、查找过时的包,并查看依赖元数据。
  • 多模块项目: 检测受支持的 Maven 和 Gradle 模块结构,并按依赖顺序构建模块。

当所需构件已经可用时,jip 还可以复用本地 Maven 缓存中的依赖,从而减少不必要的下载。

jip 是要取代 Maven 和 Gradle 吗?

未必适用于每个项目。

Maven 和 Gradle 拥有成熟的生态系统,支持复杂的构建流水线、自定义插件和复杂的企业需求。jip 并不试图复现这些系统的每一项能力。

它的重点不同:让 Java 开发和实验更简单、更快速,并且更少依赖构建系统的复杂性。

如果你维护的是一个构建要求复杂的大型生产项目,那么现有构建系统可能仍是正确选择。

但如果你经常克隆仓库、评估库、测试想法,或者构建较小的 Java 应用程序,jip 提供了一种直接得多的工作流。

你也可以使用 jip init 将受支持的 Maven 和 Gradle 配置转换为 jip 的格式。原始构建文件保持不变,因此你可以尝试这种替代方案,而无需承诺迁移。

试试看

jip 是开源的,可在 GitHub 上获取:

github.com/autumoswitzerland/jip

jip 用 Rust 编写,并提供适用于不同平台的预构建二进制文件,因此你不需要自己编译源代码。下载适合你平台的发行版,安装后即可开始探索 Java 项目,而无需经历通常的 Maven 或 Gradle 麻烦。