1

多くの質問が始まると、これは私を夢中にさせます。

私は自家製のStarTeamJavaライブラリを持っています。次のような静的メソッドが 1 つあります。

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

静的メソッドに関連する他の投稿でいくつかの異なる同様の問題を見てきましたが、応答は「静的メソッドだと確信していますか?」という行に沿っています。私はそれが静的メソッドだと確信しています。

これにはあまりグルーヴィーなコードはありません。その内容はすべて、デフォルト パッケージの 1 つのスクリプトに含まれています。その後、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>

洞察や提案をいただければ幸いです。

アンディJ

4

1 に答える 1

2

再現する方法がなければ、問題が何であるかを確実に言うことは不可能です. 1 つの可能性は、それがクラスのロードの問題であるということです。Groovy コードは、クラス パス上にある通常の Groovy クラスに含まれていますか?それとも、Groovy コードは動的に (たとえば を使用してGroovyShell) ロードされますか?

于 2012-10-13T04:26:56.797 に答える