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
沒有太多的groovy代碼,它包含在默認包中的單個腳本中。然後主要方法被隱式調用,並且它在腳本類的主體中調用了Java庫。我在DOS批處理包裝腳本中設置類路徑,例如: – AndyJ
嗨!謝謝你的想法。我更新了描述以包含如何調用的具體細節。由於該類正在被找到(沒有CLASSDEF或CLASS NOT FOUND錯誤),你是否仍然認爲這可能是一個類加載器問題? – AndyJ
彼得,根據你的評論我嘲笑了一些似乎重現我的情況。請參閱更新的問題。謝謝! – AndyJ