Использование Gradle Kotlin DSL Jar.from () - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь включить один исходный файл для Main-Class банки - на самом деле у меня есть каталог таких файлов верхнего уровня, demo/, но я не хочу, чтобы они все были в банке. Мне нужны отдельные банки, каждая из которых использует только один из них.

Это похоже на своего рода анти-шаблон в gradle, поскольку основной механизм предполагает или предпочитает, чтобы я вместо этого помещал каждый в отдельный sourceSet. Ух.

Случайное чтение документов подразумевает Jar.from(), может быть полезно следующим образом: «Указывает исходные файлы или каталоги ...»

Как выясняется, «источник», возможно, употребляется неправильно. Вот пример, типичная kotlin толстая банка с добавленными from("demo/LockingBufferDemo.kt"):

val jar by tasks.getting(Jar::class) {
    manifest { attributes["Main-Class"] = "LockingBufferDemoKt" }
    from(sourceSets.main.get().output)
    from("demo/LockingBufferDemo.kt")
    dependsOn(configurations.runtimeClasspath)
    from({
        configurations.runtimeClasspath.get().filter {
            it.name.endsWith("jar") }.map { zipTree(it) }
    })
}         

Простите мою наивность: Угадайте, что не попадает в банку? LockingBufferDemo.class. Угадайте, что делает? LockingBufferDemo.kt. Другими словами, это больше похоже на ресурс , а не источник , и самый простой ответ - это тупик.

Другой способ приблизиться к этому - добавить каталог demo как независимый sourceSet, а затем использовать from(sourceSets["demo"].get(), за исключением того, что я не могу найти способ завершить это; согласно IntelliJ get() возвращает довольно непрозрачный «Provider» , который я не могу найти в фактическом javado c: 1 , 2 и Я действительно чувствую, что в этот момент я иду по садовой дорожке, и лес вокруг меня быстро темнеет.

Это не должно быть так сложно.

Как я могу добавить один файл (или производный от него класс) в банку в gradle, не помещая его отдельно в каталог и создавая sourceSet для каждого такого каталога?

1 Ответ

1 голос
/ 19 июня 2020

Что касается ваших объяснений в начале вашего сообщения, вам следует подумать о создании нескольких задач типа Jar самостоятельно, так как каждая задача типа Jar будет создавать только один JAR-файл, и вы "хотите разделить баночки ". Я не думаю, что вам следует использовать разные исходные наборы, так как все файлы в конечном итоге являются Java Kotlin исходными файлами и обрабатываются одинаково (компиляция, тесты, документы ... ). Использование нескольких исходных наборов усложнило бы этот общий конвейер.

"Указывает исходные файлы или каталоги ..." Как оказалось, слово "источник", возможно, несколько неверно. *

Что ж, документация на этом не заканчивается, но там написано «для копии и создает дочерний CopySpec». Таким образом, это не источник , как в исходный код , а источник операции копирования. В Gradle задачи, создающие архив (ZIP, JAR), совместно используют свой API с задачами, копирующими файлы, поскольку создание архива можно рассматривать как копирование файлов из исходного местоположения в целевое местоположение (внутри архива).

Итак, метод from может использоваться для указания файлов, которые копируются / архивируются. Но он принимает не только параметр sourcePath, но также закрытие или действие для настройки. Используя этот второй параметр, вы можете сузить количество исходных файлов или каталогов до одного необходимого вам файла, например, используя метод include:

val jar by tasks.getting(Jar::class) {
    manifest { attributes["Main-Class"] = "LockingBufferDemoKt" }
    from(sourceSets.main.get().output) {
        include("**/LockingBufferDemo.class")
    }
    dependsOn(configurations.runtimeClasspath)
    from({
        configurations.runtimeClasspath.get().filter {
            it.name.endsWith("jar") }.map { zipTree(it) }
    })
}
...