gpt4 book ai didi

java - 使用java运行javac编译的groovy代码?

转载 作者:行者123 更新时间:2023-11-29 09:53:32 28 4
gpt4 key购买 nike

我有一个简单的 groovy 文件如下:

class test2 {
public static void main(String[] args) {
println("In groovy!!");
}
}

我的 gradle 任务是将其编译成 test2 类文件

如何从提示符运行此文件?

java test2(来自 test2.class 文件的位置)导致:错误:找不到或加载主类test2.class

我假设我需要将 asm 和 groovy 添加到类路径中。然而:java -cp "groovy-all-2.3.6.jar;asm-all-3.3.1.jar"test2也不起作用(文件位于正确的位置)。

最佳答案

我知道这对于 OP 来说可能有点晚了,但是:

假设你的 groovy main 存在,错误信息:

Error: Could not find or load main class YOUR_MAINCLASS_HERE

java 命令执行 groovy main(生成类的已编译 groovy 文件)基本上意味着你的 groovy jar不在类路径中。

更长的答案:

让我们看看为什么这是一个简单的 hello world 示例。我有一个名为 main.groovy 的文件,其中包含以下内容:

class Main {
static void main(String[] args){
println('hello world')
}

把它放在你的文件系统的某个地方。在同一目录中打开命令提示符并确保可以通过 PATH 访问 groovy 和 java。

在命令提示符下,使用groovyc 编译文件,因此只需输入:

groovyc main.groovy

这将生成一个名为 Main.class 的文件(由于类名的缘故,M 大写)。

好的,现在我们有了合适的测试设置。如果您现在尝试仅使用 java 命令运行该文件:

java Main 

您将收到错误消息:

Error: Could not find or load main class Main

这有点出乎意料,因为有人会认为我们可以在不链接 groovy 库的情况下调用 Main.class 中的 main,所以我们会期望出现类似 ClassNotFoundException 的异常。

相比之下,在类路径中使用 groovy 再试一次。我会将您的 groovy 安装目录称为 GROOVY_HOME。要最终运行 hello world Main 类,我们可以输入:

java -cp ".:/$GROOVY_HOME/lib/*" Main

它在类 unix 系统上产生预期的输出(在 Windows 上你需要用分号替换冒号并且变量访问就像 %GROOVY_HOME%)。

原因很简单:Groovy 为 groovy main 方法生成的签名与 java 规范所要求的不同。因此,您只能在 CLASSPATH 上调用带有 groovy 的 groovy main - 这是完全有道理的!

您可以自己检查一下。现在尝试命令:

javap Main.class

这将使您快速分析字节码和“Main.class”类的当前接口(interface)。一直以来,您都会看到类似于此输出的内容:

Compiled from "main.groovy"
public class Main implements groovy.lang.GroovyObject {
public static transient boolean __$stMC;
public Main();
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);
}

感兴趣的是第 5 行:

  public static void main(java.lang.String...);

这看起来与普通的 java main 非常相似,但有一个区别:groovyc 使用 java.lang.String 省略号(如三个点所示)而不是 java.lang.String[]。

所以这可能是原因。我不太确定,因为如果它能找到类但找不到方法签名,通常 java 会给你一个适当的错误输出。例如,尝试:

java java.lang.Integer

这显然不是主要方法。 Java 正确地看到了这一点:

Error: Main method not found in class java.lang.Integer, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

我也不确定,groovy 在类加载期间做了什么来理解这种主要签名(或者说这种字节码),但是如果你将它与普通的 java hello world javap 输出进行比较,你会得到

公共(public)类 JMain {
公共(public) JMain();
public static void main(java.lang.String[]);
}

它有一个不同的和普通的 java 主签名。

也许来自关键的 groovy 团队的人可以澄清一下。我希望这会给你一个提示。

关于java - 使用java运行javac编译的groovy代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26166711/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com