2016-04-18 11 views
1

私、私はグルーヴィーに変換することを、次のJava-コードを持っている:GroovyはJavaでメソッドを(署名がジェネリックを含みます)を実行しません

String id = "545cdc81a969"; 

    def execCreateCmdResponse = dockerClient 
      .execCreateCmd(id) 
      .withAttachStdout(true) 
      .withCmd('sh','-c','sleep 5 && exit 5') 
      .exec() 


    dockerClient.execStartCmd(execCreateCmdResponse.getId()) 
      .withDetach(false) 
      .exec(new ExecStartResultCallback(System.out, System.err)) 
      .awaitCompletion() 
:Groovyで

String containerId = "545cdc81a969"; 

ExecCreateCmdResponse execCreateCmdResponse = dockerClient 
    .execCreateCmd(containerId) 
    .withAttachStdout(true) 
    .withCmd("sh", "-c", "sleep 5 && exit 5") 
    .exec(); 

ExecStartResultCallback execStartCmd = 
    dockerClient.execStartCmd(execCreateCmdResponse.getId()) 
     .exec(new ExecStartResultCallback(System.out, System.err)) 
     .awaitCompletion(); 

私の現在のバージョンはこれです

* What went wrong: 
Execution failed for task ':werner'. 
> No signature of method: com.github.dockerjava.core.command.ExecStartCmdImpl.exec() is applicable for argument types: (com.github.dockerjava.core.command.ExecStartResultCallback) values: [[email protected]155] 
    Possible solutions: exec(com.github.dockerjava.api.async.ResultCallback), exec(com.github.dockerjava.api.async.ResultCallback), every(), grep(), every(groovy.lang.Closure), grep(java.lang.Object) 

のJava-exec-:

私の問題は、私は次のエラーを取得することを、私はGroovyのコードを実行しようとするとありますこの方法は、署名を持っています

public <T extends ResultCallback<Frame>> T exec(T resultCallback); 

私は「ResultCallback」に「新ExecStartResultCallback(のSystem.out、System.errの)」をキャストしようとしたが、それは動作しませんでした。

正しいメソッドが呼び出されるように、GroovyにインスタンスをResultCallback-Instanceとして処理させる方法はありますか?

よろしく、 marbon

+0

最初 'stacktrace'を追加してください。 @marbonを手伝うことができます。 'ExecStartResultCallback'は' ResultCallbackTemplate'タイプのクラスで、ここでは「ResultCallback」のタイプではありません>> https://github.com/docker-java/docker-java/blob/master/src/main/java/ com/github/dockerjava/core/command/ExecStartResultCallback.java –

+0

@VikrantKashyapしかし、「ResultCallbackTemplate」はここで言うように「ResultCallback」です:https://github.com/docker-java/docker-java/blob/master/ src/main/java/com/github/dockerjava/core/async/ResultCallbackTemplate.java –

答えて

1

同僚は、この問題を手伝ってくれましたし、我々は、インスタンスdockerClientが私はいくつかの問題を持つカスタムクラスローダを使用していること、が分かりました。 dockerInstanceから同じクラスローダで新しいExecStartResultCallback(のSystem.out、System.errの)をインスタンス化することによって解決することができます

ClassLoader dockerClientClassLoader = dockerClient.getClass().getClassLoader() 
    Class callbackClass = dockerClientClassLoader.loadClass("com.github.dockerjava.core.command.ExecStartResultCallback") 
    def callback = callbackClass.getDeclaredConstructor(OutputStream.class, OutputStream.class).newInstance(System.out, System.err); 

    dockerClient.execStartCmd(execCreateCmdResponse.getId()) 
      .withDetach(false) 
      .exec(callback) 
      .awaitCompletion()