Пикокли должен проанализировать дерево команд.Для этого необходимо загрузить классы объектов домена для каждой команды, которая замедляет запуск 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 может обеспечить окончательное решение для этого.Каковы другие варианты до тех пор?