JBang:灵活的文件组织方式

引言

在软件开发过程中,良好的文件组织方式对于代码的可读性和可维护性至关重要。文件组织的合理性可以使我们更好地组织代码和资源文件,提高开发效率。本文将介绍一款名为 JBang 的工具,它提供了灵活的文件组织方式,使我们能够更好地组织和管理项目文件。

JBang 的文件组织方式

JBang 允许我们使用多个源代码文件,并提供了一种简单的方式来组织这些文件。我们可以将多个源文件放置在同一个源代码目录中,甚至可以在一定程度上使用包进行组织。

以下是一个示例,展示了如何在 JBang 中使用多个源文件:

Main.java

import model.Person;

public class Main {

    public static void main(String... args) {
        Person p = new Person(args[0]);
        System.out.println("Hello " + p.getName());
    }
}

model/Person.java

package model;

public class Person {
    String name;

    public String getName() {
        return name;
    }

    public Person(String n) {
        this.name = n;
    }
}

在这个示例中,我们有两个源代码文件:Main.javamodel/Person.javaMain.java 文件包含了应用程序的入口点,而 model/Person.java 文件定义了一个简单的 Person 类。我们可以通过在命令行中运行 jbang Main.java 来执行这个应用程序。

需要注意的是,当多个源文件相互引用时,有些情况下可能会出现问题。例如,如果 model.Person 引用了 util.Generator,则会导致编译错误。此外,由于 jbang edit 在运行之前必须进行编译,因此它无法识别和处理多个源文件。

使用多个源文件的高级功能

从版本 0.46 开始,JBang 提供了更高级的功能,使多个源文件的管理更加灵活。主要的脚本文件定义了所有的依赖项,而我们可以使用//SOURCES <filename> 注释将更多的源文件添加到应用程序中。如果包含的源文件中存在//SOURCES 注释,那么这些文件也将被递归地添加进来。对于.jsh 脚本文件,包含的源文件将按照它们被发现的顺序进行添加,采用深度优先的方式。

在编译时,列出的文件名将被添加到源文件列表中。

需要注意的是,目前尚不支持使用*.java 样式匹配或在这些.java 文件中声明//DEPS 或其他 JBang 配置。目前,这些配置只会被主要的脚本或应用程序所识别。根据反馈,未来将放宽这些限制。

添加更多资源文件

如果你想要添加 META-INF/application.propertiesMETA-INF/resource.index.html 或其他文件到生成的 JAR 文件中,你可以使用//FILES 注释来添加它们。

//FILES 的格式为//FILES <mountpoint>[=<sourcefile>]

以下是一个示例:

//FILES resource.properties
//FILES META-INF/resources/index.html=index.html

在这个示例中,resource.properties 文件将被直接复制,而 META-INF/resources/index.html 文件的内容将来自于 index.html 文件。

所有的位置都需要相对于脚本所在的位置。

需要注意的是,目前 jbang edit 和基于 HTTP(S. 的脚本与//FILES 不兼容。

用于命令行插件的无扩展名/非 Java 文件

你可以使用 JBang 编写命令行插件,例如 kubectl 、 git 等。这些插件希望插件能够以<cmd>-<plugin> 的方式命名,例如 kubectl-myplugin

针对这种情况,JBang 提供了两种方法来使其工作。第一种推荐的方式是使用 jbang app install 命令,在中间生成一个脚本来避免问题。例如,jbang app install --name kubectl-my-plugin myplugin.java

第二种方式是利用 JBang 的自动处理能力,适用于只有一个文件且不需要中间脚本的情况。具体的做法如下:

  • 将文件命名为 kubectl-my-plugin,不包含.java.jsh 扩展名。
  • JBang 会将该文件复制到一个临时目录,并使用短横线命名法将文件名映射为合适的 Java 类名。

例如,如果你创建了一个名为 kubectl-my-plugin 的文件,JBang 将会假设实际的类名为 KubectlMyPlugin

需要注意的是,当使用 jbang edit 时,JBang 会创建一个符号链接,使得 IDE 将其视为普通的驼峰式 Java 类。

如果不遵循这种命名模式,将会导致编译错误,因为 javac 要求公共类和文件名相等。

此外,针对无扩展名的脚本,你可以在文件开头添加 #! 注释,以让应用程序识别它作为脚本处理。为了避免编译问题,JBang 在编译之前会删除该注释行。

结论

JBang 提供了灵活的文件组织方式,使我们能够更好地组织和管理项目文件。通过使用多个源文件和注释,我们可以轻松地组织代码结构,并将资源文件添加到生成的 JAR 中。此外,JBang 还允许我们为命令行插件编写无扩展名的文件,并提供了便捷的命名约定。

合理的文件组织方式有助于提高代码的可读性和可维护性。通过使用 JBang 的文件组织功能,我们可以更加高效地开发和管理我们的项目。

参考文献

发表评论