Плагин Gradle и Shadow - копировать дополнительные файлы (файлы.jar) в финальный jar после задачи shadowJar

Описание проблемы:
Я использую плагин Gradle Shade, все отлично работает и копирует файлы ресурсов в финальную банку. Однако, как говорят в документах, он не может включать другие .jar файлы как ресурсы, потому что он не может отличить их от зависимостей. Он распаковывает их не в порядке.

Что я хочу сделать:
Я хочу скопировать дополнительные .jar файлы из tools папка (которая живет рядом с моей build.gradle) в финал jar произведено shadowJar задача.

Вопрос:
Как продлить задачу (shadowJar) скопировать дополнительные файлы в созданный файл jar.

1 ответ

Ответ на этот вопрос содержится в документации плагина Gradle shadow, раздел « Встраивание файлов Jar в ваш Shadow Jar» :

[...] shadow не может отличить файл jar, настроенный как зависимость, от файла jar, включенного в папку ресурсов. Это означает, что любой jar-файл, найденный в каталоге ресурсов, будет объединен с теневым jar-файлом так же, как и любая другая зависимость. Если вы намерены встроить банку внутрь, вы должны переименовать банку, чтобы она не заканчивалась на .jar, прежде чем начнется теневая задача.

К сожалению, это справедливо как для JAR-файла, который является частью конфигурации зависимостей, так и для копирования JAR-файла с использованием fromкопировать спецификацию (которая работает с тех пор, как shadowJarзадача расширяет задачу; которая, в свою очередь, является задачей копирования и, следовательно, поддерживает спецификации копирования).

Таким образом, JAR можно встроить, только переименовав его. Если это должно быть названо .jarвнутри Uber JAR я думаю, что единственный вариант — обходной путь из трех шагов:

  1. Создайте Uber JAR и вставьте JAR, переименовав их; например, используйте суффикс .
      shadowJar
{
    from("${dirThatContainsSomeJARs}")
    {
        include '*.jar'
        rename '(.+).jar', '$1.zip'
    }
}
  1. Распакуйте Uber JAR и переименуйте все JAR, которые были внедрены, как *.zipвернуться к *.jar.
  2. Переупакуйте все снова, используя jarили же zipзадача.
Другие вопросы по тегам