Groovy не выполняет Java-метод (подпись включает дженерики)

у меня есть следующий Java-код, который я хочу преобразовать в 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();

Моя текущая версия в groovy такова:

 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:

* 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: [com.github.dockerjava.core.command.ExecStartResultCallback@6ce82155]
  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-Method имеет подпись:

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

Я попытался преобразовать «новый ExecStartResultCallback (System.out, System.err)» в «ResultCallback», но это не сработало.

Есть ли способ заставить Groovy обрабатывать экземпляр как ResultCallback-Instance, чтобы вызывался правильный метод?

С уважением, марбон


person marbon    schedule 18.04.2016    source источник
comment
сначала добавьте stacktrace. тогда только мы сможем вам помочь @marbon. ExecStartResultCallback — это класс типа ResultCallbackTemplate, а не тип ResultCallback, как сказано здесь ›› github.com/docker-java/docker-java/blob/master/src/main/java/   -  person Vikrant Kashyap    schedule 18.04.2016
comment
@VikrantKashyap Но ResultCallbackTemplate — это ResultCallback, как здесь сказано: github.com/docker-java/docker-java/blob/master/src/main/java/   -  person tim_yates    schedule 18.04.2016


Ответы (1)


Коллега помог с этой проблемой, и мы обнаружили, что экземпляр dockerClient использует собственный загрузчик классов, с которым у меня есть некоторые проблемы. Это можно решить, создав экземпляр нового ExecStartResultCallback(System.out, System.err) с тем же загрузчиком классов из dockerInstance:

    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()
person marbon    schedule 18.04.2016