我尝试了一个非常简单的groovy脚本

class HelloGroovy {
    public static void main(args) {
        println("hello groovy")
    }
}

并通过 groovy 将其编译成 .class 文件

mkdir out && groovyc helloGroovy.groovy

out目录的唯一内容是单个类文件

cd out && ls
> HelloGroovy.class

我尝试将这个类打包成一个以HelloGroovy作为入口点的jar .

jar cfe foo.jar HelloGroovy HelloGroovy.class

但是当我试图运行生成的jar时,无法使用 java -jar foo.jar 加载主类

java -jar foo.jar
> Error: could not find or load main class HelloGroovy

我检查了jar文件,清单列表 HelloGroovyMain-Classjavap HelloGroovy.class 表明有一个带有适当参数结构的main方法 .

public class HelloGroovy implements groovy.lang.GroovyObject {
  public static transient boolean __$stMC;
  public HelloGroovy();
  public static void main(java.lang.String...);
  protected groovy.lang.MetaClass $getStaticMetaClass();
  public groovy.lang.MetaClass getMetaClass();
  public void setMetaClass(groovy.lang.MetaClass);
  public java.lang.Object invokeMethod(java.lang.String, java.lang.Object);
  public java.lang.Object getProperty(java.lang.String);
  public void setProperty(java.lang.String, java.lang.Object);
}

为什么java不能找到HelloGroovy类并执行main方法?

我觉得该程序无法打印是有道理的,因为我知道,groovy标准库不在类路径上 . 但是,我仍然希望它能够找到原来的课程而且很困惑 .