Так что в некоторых языках импорт должен выполняться определенным образом. Этот способ выглядит как «импортировать все вещи, а затем начать делать вещи»
В Scala можно импортировать элементы в любом месте исходного кода. Это усложнит вещи. Например, в коде Spark вы косвенно спрашиваете мастера приложения Spark, какие символы оно предлагает, которое хранится в переменной, переданной вам во время выполнения, и импортируете их.
import org.apache.spark.sql.SparkSession
val spark = SparkSession
.builder()
.appName("Spark SQL basic example")
.config("spark.some.config.option", "some-value")
.getOrCreate()
// For implicit conversions like converting RDDs to DataFrames
import spark.implicits._
(Обратите внимание на Последняя строка в примере импортирует все, что содержится в поле implicits
созданной искровой переменной.
Наконец, существует более одной версии артефакта Maven. Невозможно безопасно ссылаться на любую версию спецификаций * 1050. * Артефакт Maven, поскольку не все проекты пытаются обеспечить обратную совместимость между всеми номерами версий (и даже если они пытаются это сделать, ошибки в совместимости все еще могут существовать).
https://mvnrepository.com/artifact/org.apache.spark/spark-core перечисляет около 30 различных версий spark-core, основных подпрограмм, используемых другими библиотеками spark.Если вы выберете версию, отличающуюся от существующих служб spark, ваше приложение будет работать неправильно, так как spark обычно не совместим с основным номером версии, но по мажорному и минорному номеру версии (2.3 скомпилированный код не удастся для работы в среде 2.4)
Кроме того, код Scala использует сложные подпрограммы оптимизации на этапе компиляции. Эти процедуры оптимизации означают, что обычно нельзя использовать класс Scala 2.11 в среде выполнения Scala 2.12. Все классы должны точно соответствовать их среде выполнения. Чтобы обнаружить среду выполнения, не нужно проверять операторы импорта, а вместо этого проверять параметры среды выполнения Scala на компьютере, где происходит компиляция, и проверять, совпадают ли они с целевыми средами, в которых будут выполняться выходные данные. Вот почему для многих библиотек вы увидите один и тот же номер версии, созданный несколько раз, например
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>2.4.5</version>
</dependency>
против
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.5</version>
</dependency>
(Пример выше изготовлен, но иллюстрирует то же самое версия библиотеки, скомпилированная для 2.11 и 2.12)
Наконец, импорт не является ссылками на имена артефактов Maven. Скорее они являются элементами в файлах JAR (которые являются одним из видов артефактов Maven). Таким образом, у вас возникнет дополнительная проблема с определением того, какой JAR-файл содержит импортированные элементы, без возможности заранее узнать, какие JAR-файлы вы используете.
Короче говоря, вы пытаетесь изменить естественный процесс написания программ в этой среде с помощью рутины, потому что вы пытаетесь исправить программиста, который не задокументировал то, что они намеревались использовать. Тем не менее, ваша процедура должна будет
- взять импорт, некоторые из которых, возможно, построены во время выполнения, и составить список.
- взять этот список элементов и каким-то образом найти все файлы JAR, которые могут содержать элементы.
- Для каждого импортированного элемента, предлагаемого различными артефактами, определите (без ввода), какой из артефактов был тем, который разработчик намеревался использовать.
- Для проекта найдите нужную версию Scala (определенную средой (ами) развертывания) и найдите версии, соответствующие артефакту Scala.
- Список версий для этого артефакта найдите версию, которая будет работать с остальной инфраструктурой искры.
Для шагов 3 и 5 требуется решение, аналогичное «Я припарковал свой автомобиль, вот ключи, go найди его», где машина может быть где угодно в мире, и вы не можете получить больше информации от человека, чем «Я припарковал свою машину»
Шаг 4 требует обнаружения чего-либо это не может быть определено, потому что вы, вероятно, не знаете все места развертывания, но вы можете просто скомпилировать для каждой версии Scala.
Суть этого поста в том, что вы находитесь на поручение дурака Файл sbt - это документация того, что требуется / нужно разработчикам. Разработчик, который не может быть обеспокоен тем, чтобы написать единственную строку конфигурации на том, что они используют, является кошмаром. Разработчик, который забыл написать эту единственную строку, - это раздражение, которое можно легко исправить, попросив разработчика сделать то, что он забыл сделать.
И это игнорирует основные концепции Maven, на которых построен SBT. Поскольку при условии, что вам действительно удалось успешно выполнить шаги с 1 по 5, не все комбинации версий библиотеки работают вместе, поскольку Maven и SBT оба автоматически автоматизируют c разрешение зависимостей. Это означает, что если вы импортируете org: item: 1.1 и org: item2: 1.0, для org: item2: 1.0 может потребоваться org: item: 1.3, и у вас будет конфликт номера версии в ваших полностью разрешенных зависимостях Maven. При таких условиях только одна из библиотек используется в проектах Java 1.8, и если используемая библиотека имеет несовместимость с некоторым кодом, люди (называемые мастерами сборки) обычно должны исследовать конфигурацию сборки и определить, какие версии какие артефакты нужно обновить, чтобы исправить несовместимости.
Если бы ваш проект мог быть написан, это было бы здорово. Удачи!