У меня есть большое количество простых Scala-приложений из командной строки, которые имеют довольно общую структуру. Все они наследуются от scala.App, что просто отлично. Я хотел бы преобразовать общую структуру этих приложений командной строки в общую черту, которую затем я мог бы унаследовать в моих (гораздо более простых) классах приложений командной строки. Проблема возникает в том, что некоторая общая структура включает в себя анализ аргументов командной строки.
object MyScript extends BaseScript with App{
//small bits of business logic using components defined in BaseScript
}
trait BaseScript extends App{
val configuration = loadConfiguration(args(0))
//setup a bezillion components, usable from any of the scripts, based on the configuration
}
Это компилируется, но завершается неудачно с NPE, когда наступает момент разыменования args
, вероятно, потому, что черта App
еще не инициализирована. Изменение порядка признаков и изменение наследования App в BaseScript для объявления собственного типа ничего не делают, как и эксперименты с DelayedInit. Объявление компонентов как «ленивых» в BaseScript будет работать, но я также хотел бы, чтобы эти компоненты фактически использовались во время инициализации (например, настройка каталогов журналов и загрузка классов драйверов JDBC на основе конфигурации), поэтому преимущества лени теряются. Что я могу сделать, чтобы аргументы командной строки были видимы и инициализированы в признаке BaseScript?