2012-10-12 28 views
1

尽可能多的问题开始,这让我发疯。Groovy没有调用Java库的方法的签名

我有一个本土的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

我看到其他职位有关静态方法的几个不同的类似问题和答复是沿着线“是你肯定这是一个静态的方法?“。我相信这是一个静态的方法。

没有太多的groovy代码。它的全部内容都包含在默认包中的单个脚本中。然后主要方法被隐式调用,并且它在脚本类的主体中调用了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> 

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

AndyJ

回答

2

没有办法复制,这是不可能肯定地说是什么问题。一种可能性是它是一个类加载问题。 Groovy代码是否包含在类路径中的常规Groovy类中,或Groovy代码是否被动态加载(例如,通过使用GroovyShell)?

+0

没有太多的groovy代码,它包含在默认包中的单个脚本中。然后主要方法被隐式调用,并且它在脚本类的主体中调用了Java库。我在DOS批处理包装脚本中设置类路径,例如: – AndyJ

+0

嗨!谢谢你的想法。我更新了描述以包含如何调用的具体细节。由于该类正在被找到(没有CLASSDEF或CLASS NOT FOUND错误),你是否仍然认为这可能是一个类加载器问题? – AndyJ

+0

彼得,根据你的评论我嘲笑了一些似乎重现我的情况。请参阅更新的问题。谢谢! – AndyJ

相关问题