Вот как мы это делаем с Gradle!
У нас есть два подпроекта:
job
: для потоковой работы , которую мы хотимдля запуска runtime
: для дополнительных зависимостей времени выполнения (например, пользовательская FileSystem
реализация)
Мы создаем новую конфигурацию Gradle для зависимостей, которые предоставлены во время выполнения:
configurations {
provided,
compile.extendsFrom provided
}
, а затем пометьте предоставленные зависимости как:
provided("org.apache.flink:flink-java:1.6.0") // flink java v1.6.0
Тогда,мы модифицируем задачу jar
для создания jar без каких-либо provided
зависимостей :
jar {
dependsOn configurations.runtime
from {
(configurations.runtime - configurations.provided).collect {
it.isDirectory()? it : zipTree(it)
}
} {
exclude 'META-INF/*.RSA'
exclude 'META-INF/*.SF'
exclude 'META-INF/*.DSA'
}
manifest {
attributes 'Main-Class': 'com.example.Entrypoint'
}
}
В результате получается jar
с обязательными зависимостями (compile
) в комплекте, который мы затем развертываем с помощью веб-интерфейса.
Что касается пользовательских зависимостей времени выполнения , мы создаем собственный образ Docker и отправляем встроенный артефакт (runtime.jar
, встроенныйиспользуя ту же конфигурацию, что и выше) в каталог libs/
во Flink.Вы также можете сделать это вручную, если не используете Docker.
И, наконец, в нашем конкретном случае прямая зависимость не определена между нашей работой и зависимостью времени выполнения (которая обнаружена)используя отражение).