【问题标题】:Groovy No signature of method calling Java libraryGroovy 没有方法调用 Java 库的签名
【发布时间】:2012-10-03 15:08:02
【问题描述】:

随着许多问题的开始,这让我发疯了。

我有一个自制的StarTeam java 库。我有一个这样的静态方法:

public static Label getLatestDeploymentLabel(com.starbase.starteam.File child) {
 // blah
}

当我从 java 调用该方法时,该方法按预期工作。当我从 Groovy 调用它时,我得到:

Caught: groovy.lang.MissingMethodException: 
No signature of method: static pkg.starteam.StarTeamUtils.getLatestDeploymentLabel() 
is applicable for argument types: (com.starbase.starteam.File) 
values: [FILENAME-FOO.sql] at starteam.run(starteam.groovy:54)

我在调用该方法之前输入了println

chgset.elements().each() { item ->
  println "type of item is ${item.class.getName()}"
  def latestlabel = StarTeamUtils.getLatestDeploymentLabel(item)
}

并确认,事实上,它正在迭代我所期望的迭代:

type of item is com.starbase.starteam.File

我在其他与静态方法相关的帖子中看到了一些不同的类似问题,并且响应类似于“您确定它是静态方法吗?”。我确定这是一个静态方法。

没有太多的常规代码。它的所有内容都包含在默认包中的单个脚本中。然后隐式调用 main 方法,并在脚本类的主体中调用 java 库。我在 DOS 批处理包装脚本中设置类路径,例如:

SET INITIALCLASSPATH=%CLASSPATH%
SET NEWCP=c:/libs/etc.jar;c:/etc/etc.jar
SET GROOVYPATH=c:/groovy.bat
SET CLASSPATH=%NEWCP%
%GROOVYPATH% %*
SET CLASSPATH=%INITIALCLASSPATH%

我创建了一个我认为模仿我的情况的简单情况。

C:\apps\groovy-1.8.6\scripts>type Other.java
class Other {
    private String name = "notset";
    public Other(String name) {
        this.name = name;
        System.out.println("Created an other");
    }
    public String toString() {
        return name;
    }
}
C:\apps\groovy-1.8.6\scripts>type ThingList.java
import java.util.ArrayList;
import java.util.Iterator;

class ThingList {
    ArrayList ourlist = new ArrayList<Other>();
    public ThingList(){}
    public ArrayList add(Other thing) {
        ourlist.add(thing);
        return ourlist;
    }
    public Iterator iterator(){
        return ourlist.iterator();
    }
}
C:\apps\groovy-1.8.6\scripts>type JavaLib.java
class JavaLib {
    public JavaLib() {}
    public static ThingList getThingList(Other thing) {
        ThingList tl = new ThingList();
        Other one = new Other("extra one");
        tl.add(thing);
        tl.add(one);
        return ThingList;
    }
}
C:\apps\groovy-1.8.6\scripts>type testthing.groovy
def myOther = new Other("A new other")
println "type of myOther is ${myOther.class.getName()}"
def myList = getThingList(myOther)
myList.each() {
  println it
}
C:\apps\groovy-1.8.6\scripts>type wrapper.bat
@ECHO OFF
SET INITIALCLASSPATH=%CLASSPATH%
SET GROOVY=C:\apps\groovy-1.8.6\bin\groovy.bat
SET CP=.
SET CLASSPATH=%CP%

%GROOVY% %*

SET CLASSPATH=%INITIALCLASSPATH%
C:\apps\groovy-1.8.6\scripts>wrapper.bat testthing.groovy
Created an other
type of myOther is Other
Caught: groovy.lang.MissingMethodException: No signature of method: testthing.ge
tThingList() is applicable for argument types: (Other) values: [A new other]
groovy.lang.MissingMethodException: No signature of method: testthing.getThingLi
st() is applicable for argument types: (Other) values: [A new other]
        at testthing.run(testthing.groovy:3)

C:\apps\groovy-1.8.6\scripts>

任何见解或建议将不胜感激!

安迪

【问题讨论】:

    标签: java groovy casting static-methods


    【解决方案1】:

    如果没有重现的方法,就不可能确定问题出在哪里。一种可能性是这是一个类加载问题。 Groovy 代码是否包含在位于类路径上的常规 Groovy 类中,还是 Groovy 代码是动态加载的(例如,通过使用 GroovyShell)?

    【讨论】:

    • 没有太多 groovy 代码,所有这些都包含在默认包中的单个脚本中。然后隐式调用 main 方法,并在脚本类的主体中调用 java 库。我在 DOS 批处理包装脚本中设置类路径,例如:
    • 嗨!谢谢你的想法。我更新了描述以包括如何调用它的细节。由于正在找到该类(没有 CLASSDEF 或 CLASS NOT FOUND 错误),您仍然认为这可能是类加载器问题吗?
    • 彼得,根据您的评论,我嘲笑了一些似乎重现我的情况的东西。请参阅更新的问题。谢谢!
    • 呃...我上面的代码中有几个错误,在更正后,不再抛出静态方法错误。有几个错误(抱歉马虎,我想当我看到相同的错误消息时我被带走了)。我将错误留在其中,因为看到抛出的错误可能更有帮助。
    • 就我而言,它缺少括号。无论如何,文件中的错误比导入问题更多。
    猜你喜欢
    • 1970-01-01
    • 2022-08-06
    • 2017-03-02
    • 2018-12-26
    • 1970-01-01
    • 2021-04-28
    • 2014-10-16
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多