Groovy没有调用Java库的方法的签名

Groovy没有调用Java库的方法的签名,java,groovy,casting,static-methods,Java,Groovy,Casting,Static Methods,当许多问题开始时,这让我发疯 我有一个自制的StarTeamjava库。我有一个这样的静态方法: public static Label getLatestDeploymentLabel(com.starbase.starteam.File child) { // blah } 当我从java调用该方法时,该方法可以按预期工作。当我从Groovy调用它时,我得到: Caught: groovy.lang.MissingMethodException: No signature of met

当许多问题开始时,这让我发疯

我有一个自制的
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)
}
并确认,事实上,它正在迭代我期望它迭代的内容:

项目类型为com.starbase.starteam.File

我在其他与静态方法相关的帖子中看到了一些不同的类似问题,回答是“你确定这是静态方法吗?”。我确信这是一种静态方法

这方面没有太多groovy代码。它的全部内容都包含在默认包中的单个脚本中。然后隐式调用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>
C:\apps\groovy-1.8.6\scripts>type Other.java
其他类{
私有字符串name=“notset”;
公共其他(字符串名称){
this.name=名称;
System.out.println(“创建了另一个”);
}
公共字符串toString(){
返回名称;
}
}
C:\apps\groovy-1.8.6\scripts>type ThingList.java
导入java.util.ArrayList;
导入java.util.Iterator;
类内容列表{
ArrayList ourlist=新的ArrayList();
公共ThingList(){}
公共阵列列表添加(其他内容){
添加(事物);
返回我们的名单;
}
公共迭代器迭代器(){
返回ourlist.iterator();
}
}
C:\apps\groovy-1.8.6\scripts>typejavalib.java
类JavaLib{
公共JavaLib(){}
公共静态内容列表getThingList(其他内容){
ThingList tl=新ThingList();
其他一个=新的其他(“额外一个”);
添加(事物);
tl.add(一);
返回物品清单;
}
}
C:\apps\groovy-1.8.6\scripts>键入testthing.groovy
def myOther=新的其他(“新的其他”)
println“myOther的类型为${myOther.class.getName()}”
def myList=getThingList(myOther)
myList.each(){
打印它
}
C:\apps\groovy-1.8.6\scripts>type wrapper.bat
@回音
设置INITIALCLASSPATH=%CLASSPATH%
设置GROOVY=C:\apps\GROOVY-1.8.6\bin\GROOVY.bat
设置CP=。
设置类路径=%CP%
%GROOVY%%*
设置类路径=%INITIALCLASSPATH%
C:\apps\groovy-1.8.6\scripts>wrapper.bat testthing.groovy
创造了另一个
myOther的类型是其他类型
捕获:groovy.lang.MissingMethodException:没有方法的签名:testthing.ge
tThingList()适用于参数类型:(其他)值:[新的其他]
groovy.lang.MissingMethodException:没有方法的签名:testthing.getThingLi
st()适用于参数类型:(其他)值:[新的其他]
运行(testthing.groovy:3)
C:\apps\groovy-1.8.6\scripts>
如有任何见解或建议,将不胜感激


AndyJ

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

Groovy代码不多,它的所有内容都包含在默认包中的单个脚本中。然后隐式调用main方法,并在脚本类的主体中调用java库。我在DOS批处理包装器脚本中设置了类路径,例如:Hi!谢谢你的想法。我更新了描述,以包括如何调用的细节。既然已经找到了类(没有CLASSDEF或找不到类错误),你还认为这可能是类加载器的问题吗?Peter,根据你的评论,我模仿了一些东西,似乎重现了我的情况。请参阅更新的问题。谢谢啊。。。我的代码中有几个错误,当纠正这些错误时,静态方法错误不再抛出。有几个错误(很抱歉这么草率,我想当我看到同样的错误信息时,我已经被迷住了)。我将错误保留在中,因为看到抛出的错误可能更有帮助。在我的例子中,它缺少括号。无论如何,这是更多的文件错误,然后导入问题。