• 免编译,运行单文件Java程序【JDK16+】


    运行单文件Java程序

    单文件源代码程序的运行

    从JDK 11开始,Java引入了用Java启动器,可以直接运行一个单文件的Java源代码,运行前不需要对源代码进行显式的编译。
    原理很简单,Java启动器会自动调用编译器,并将编译好的字节码缓存在内存中。

    这种运行方式简化了编码-编译-运行的繁琐环节,可以让我们非常方便的学习Java,或者测试一些JavaAPI的新特性。
    接下来我们介绍几种Java启动器的使用方式和一些注意事项。

    运行你的第一个单文件源代码程序

    • 想要执行一个单文件源代码程序,必须首先定义一个包含main方法的类,比如说下面这个Hello World
    public class HelloWorld {
      public static void main(String[] args) {
        System.out.println("Hello World!");
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 将上面的代码保存在名为HelloWorld.java的文件中,就可以使用下面的命令来运行它了:
    java HelloWorld.java
    
    • 1

    传入参数

    • 传参的方式与编译后的类用法相同,比如使用下面的代码:
    public class HelloJava {
      public static void main(String[] args) {
        System.out.println("Hello " + args[0]);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 可以像这样传入World!作为第一个参数
    java HelloJava.java World!
    
    • 1

    包含多个类的源代码文件

    • 如果你需要集成度更高的进行多个类的封装,也可以将多个类定义在同一个源代码文件中:
    public class MultipleClassesInSameFile {
      public static void main(String[] args) {
        System.out.println(GenerateMessage.generateMessage());
        System.out.println(AnotherMessage.generateAnotherMessage());
      }
    }
    
    class GenerateMessage {
      static String generateMessage() {
        return "Here is one message";
      }
    }
    
    class AnotherMessage {
      static String generateAnotherMessage() {
        return "Here is another message";
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 执行:
    java MultipleClassesInSameFile.java
    
    • 1
    • 输出
    Here is one message
    Here is another message
    
    • 1
    • 2

    引入JDK或非JDK的类

    JDK内部的类不需要额外的添加到指定环境的类路径中。比如下面例子中用到的ScannerMatchResult 类,你可以直接在源代码中使用import导入:

    import java.util.Scanner;
    import java.util.regex.MatchResult;
    
    public class ScannerExample {
      public static void main(String... args) {
        String wordsAndNumbers = """
            The Apache™ Hadoop® 
            project develops 
            open-source software for 
            reliable,
            scalable,
            distributed computing.
            """;
    
        try (Scanner scanner = new Scanner(wordsAndNumbers)) {
          scanner.findAll("open-source")
              .map(MatchResult::group)
              .forEach(System.out::println);
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 运行:
    java ScannerExample.java
    
    • 1
    • 下面的例子中我们引入一个RandomUtils类,这个类是Apache Commons Lang 中提供的,此时我们需要将commons-lang.jar添加到运行的类路径中:
    import org.apache.commons.lang3.RandomUtils;
    
    public class ReferenceNonJDKClass {
      public static void main(String[] args) {
        System.out.println(RandomUtils.nextInt());
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 运行:
    java -cp /path/to/commons-lang3-3.12.0.jar ReferenceNonJDKClass.java
    
    • 1

    类似脚本的方式运行Java源代码

    • 在类Unix系统中(或Windows上的Bash环境),我们可以将Java程序封装成如下这样类似脚本的形式直接运行。
    • 在脚本的开头,需要加上对应的Java环境路径和Java源代码的编译版本path/to/java/home --source
    #!/path/to/your/bin/java --source 19
     
    public class HelloJava {
      public static void main(String[] args) {
        System.out.println("Hello " + args[0]);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 注意!此时文件不能以.java结尾,并在一些系统中需要使用chmod +x为其赋予执行权限,之后你就可以像运行一个脚本一样直接运行它了:
    ./HelloJava
    
    • 1
  • 相关阅读:
    基于jacoco和CI做代码覆盖率检测
    无法访问mybatis.dto.StudengInVO-使用maven编译报错
    二十三种设计模式全面解析-单例设计模式:解密全局独一无二的实例创造者
    03.状态图、活动图、时序图、协作图、组件图、部署图
    Android Material Design之ShapeableImageView(十三)
    用DIV+CSS技术设计的红酒主题网站(web前端网页制作课作业)
    Swift编写爬取商品详情页面的爬虫程序
    提交代码出现error Empty block statement no-empty,代码却没报错?
    【推荐系统】:协同过滤和基于内容过滤概述
    云计算计算资源池与存储池访问逻辑
  • 原文地址:https://blog.csdn.net/amos_cloud/article/details/127750499