2012-10-12 45 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

相關問題