Как уменьшить медленный запуск приложений Picocli за счет отражения - PullRequest
0 голосов
/ 29 сентября 2018

Пикокли должен проанализировать дерево команд.Для этого необходимо загрузить классы объектов домена для каждой команды, которая замедляет запуск jvm.

Какие есть варианты, чтобы избежать этой задержки запуска?Одно из предложенных мной решений описано в https://github.com/remkop/picocli/issues/482:

. Я использую отражение, чтобы отложить загрузку любого класса до тех пор, пока не будет выбрана команда.Таким образом, загружаются только сами классы команд, и, наконец, классы, которые реализуют единственную команду, запрошенную пользователем:

abstract class BaseCommand implements Runnable {

    interface CommandExecutor {
        Object doExecute() throws Exception;
    }

    // find the CommandExecutor declared at the BaseCommand subclass.
    protected Object executeReflectively() throws Exception {
        Class<?> innerClass = getExecutorInnerClass();
        Constructor<?> ctor = innerClass.getDeclaredConstructor(getClass());
        CommandExecutor exec = (CommandExecutor) ctor.newInstance(this);
        return exec.doExecute();
    }

    private Class<?> getExecutorInnerClass() throws ClassNotFoundException {
        return getClass().getClassLoader().loadClass(getClass().getName() + "$Executor");
    }

    public void run() {
        try {
             executeReflectively();
       } catch(...){
          /// usual stuff
       }
    }
}

Конкретный класс commend:

@Command(...) 
final class CopyProfile extends BaseCommand {
    @Option String source;
    @Option String dest;

    // class must NOT be static and must be called "Executor"
    public class Executor implements CommandExecutor {
        @Override
        public Object doExecute() throws Exception {
           // you can basically wrap your original run() with this boilerplate
           // all the CopyProfile's field are in scope!
          FileUtils.copy(source, dest);
        }
    }
}

Кажется, что https://github.com/remkop/picocli/issues/500 может обеспечить окончательное решение для этого.Каковы другие варианты до тех пор?

1 Ответ

0 голосов
/ 05 октября 2018

Альтернативой, которая не требует каких-либо изменений кода, является использование GraalVM для компиляции приложения на основе picocli в собственное изображение.

В этой статье показано, как это сделать, и в результате время запуска составляет 3 миллисекунды.

Example picocli-based app running on GraalVM

...