#java #jvm #build #kotlin

app jcargo

尝试为 JVM 生态系统创建一个与 Rust 的优秀构建工具等效的工具。

2 个不稳定版本

0.2.0 2022 年 1 月 13 日
0.1.0 2021 年 11 月 23 日

#1817 in 开发工具

MIT/Apache

68KB
1.5K SLoC

jcargo

尝试为 JVM 生态系统创建一个与 Rust 的优秀构建工具等效的工具。

动机

Maven 很糟糕,谁想写 XML。Gradle 是朝着正确方向迈出的一步,但使用它需要学位(并且它需要一个进程守护程序来隐藏它痛苦地慢的事实)。

Jcargo 不在 JVM 上运行,它没有漫长的启动时间(这对于 CLI 是必不可少的)。它附带我的另一个项目:[https://github.com/Gui-Yom/native-jdktools](https://github.com/Gui-Yom/native-jdktools),尝试用 GraalVM 编译 JDK 工具(javac、javadoc、jar 等)以改善启动时间。

Jcargo 从单个 jcargo.toml 文件进行配置,该文件易于编写和阅读。它遵循“简单且足够高效以满足 90% 的用例”的原则,对于剩余的 10%,我们可能需要构建脚本或其他东西(稍后探讨)。

对于 90% 的用例,您只需要启动一个项目,该项目可以拉取一些依赖项而无需进行任何特殊处理。

当前状态

该项目在实际上应用于任何真实事物方面还非常遥远。它可以成功编译没有依赖项的项目。

安装

下载预构建的二进制文件

请参阅发布页面

从源代码构建

需要至少 Rust 1.56

从 crates.io(发布版本)

cargo install jcargo

从 master 分支

git clone https://github.com/Gui-Yom/jcargo
cd jcargo
cargo install --path .

运行时

目前,JDK_HOME/bin 必须在您的路径中,以便 jcargo 能够找到 JDK 工具。如果您想编译 Kotlin 源代码,请将 KOTLINC_HOME 设置为指向 kotlinc 的安装目录。

使用 native-jdktools

如果您正在使用 native-jdktools,请将 NATIVE_JDKTOOLS 设置为指向 native-jdktools 可执行文件。还请将 JDKTOOLS_HOME 设置为 JDK 主目录。

配置

配置肯定没有冻结。我特别不喜欢依赖项的指定方式。示例

group = "marais"
artifact = "testproject"
version = "0.1.0"

[dependencies]
# Compile and runtime dependencies
compileRuntime = [
    "org.apache.logging.log4j:log4j-api:2.17.1"
]
# Runtime only dependencies
runtime = [
    { group = "org.apache.logging.log4j", artifact = "log4j-core", version = "2.17.1" }
]
# Compile only
compile = []
transitive = []

[[entrypoints]]
class = "Main"

[[entrypoints]]
name = "Other"
class = "OtherMain"

设计

阅读jcargo 的一些设计

1.0 版本路线图

  • 表示功能部分实现,尚未完全完成

  • 表示功能完全不存在

  • 项目模型、配置和管理

    • 稳定配置模型(TOML)
    • 项目初始化(jcargo init)
      • 创建初始配置文件
    • 项目清理(jcargo clean)
      • 删除 target 目录
    • 一致性检查(jcargo check)
      • 验证配置文件
      • 下载依赖
      • 检查依赖版本
    • 依赖处理
      • 标准 Maven 二进制仓库
        • Maven pom 解析
        • 递归合并 poms
        • 下载完整的依赖树
        • Gradle 元数据?
      • 自定义二进制仓库
      • Git 依赖(使用 jcargo 制成的项目)
      • 本地依赖(使用 jcargo 制成的项目)
      • 依赖缓存
        • 缓存 pom 和 jar
        • 缓存 Maven 元数据
        • 缓存依赖图解析
        • 验证文件哈希值
    • 多个源集
      • 主程序
      • 测试
      • 示例
      • 基准测试?
      • 每个源集的依赖
    • 多模块构建
      • 模块间依赖
  • Java 支持

    • 编译
    • Javadoc 生成
    • 注解处理
    • 工具链处理
      • 处理源和目标版本
      • 处理多个 JDK 安装
  • Kotlin 支持

    • JVM 编译支持
    • Kdoc 生成
    • 注解处理
    • 工具链处理
      • 处理源和目标版本
      • 处理多个 kotlinc 和 JDK 安装
  • 打包

    • 应用程序 jar
    • 文档 jar
    • 源码 jar
    • 源码 tarball
    • 资源处理
    • 依赖打包选项
    • 发布到二进制仓库
      • Maven 的 POM 生成
      • Gradle 模块元数据生成
      • 远程仓库发布
  • IDE 支持

    • IntelliJ IDEA 集成
      • 配置文件支持
      • 完整类路径支持

其他想法

  • 错误信息处理,美化 javac 命令行错误信息。

依赖

~12–25MB
~380K SLoC