Создание Fat Jar в Gradle с KotlinDSL - PullRequest
1 голос
/ 08 апреля 2019

Итак, я перевожу пример кода того, как создать толстую банку с Gradle, из GroovyDSL в KotlinDSL (я использую Gradle 5.3.1).Я получил код GroovyDSL здесь :

jar {
    manifest {
        attributes "Main-Class": "com.baeldung.fatjar.Application"
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

Вот как далеко я продвинулся: ОБНОВЛЕНИЕ: (последняя версия с обратной связью от JB Nizet)

jar {
    manifest {
        attributes("Main-Class" to "io.ktor.server.netty.EngineMain")
    }
    val compileConfig: Configuration = configurations.compile.get()
    from {
        compileConfig.
    }
}

Проблема в том, что в compileConfig нет метода сбора, который является Конфигурацией

Вызов «from» также является для меня загадкой.Я вполне уверен, что метод происходит из AbstractCopyTask .Существует три его версии: одна принимает Object ... sourcePaths, а две другие имеют два параметра Object sourcepath и Closure / Action, но версия Groovy вызывает его только с одним замыканием!Мое лучшее предположение состоит в том, что замыкание автоматически оценивается, и результат приводится в объект ... вызывая первую версию метода.

ОБНОВЛЕНИЕ: (последнийверсия с обратной связью от JB Nizet)

Если вы хотите проверить свои идеи о том, как решить эту проблему , здесь , вы можете найти эту конфигурацию jar-task наПроект HelloWorld-Ktor.

jar {
    manifest {
        attributes("Main-Class" to "io.ktor.server.netty.EngineMain")
    }
    from({
        val compileConfig = configurations.compile.get()
        logger.info("#files to iterate over: ${compileConfig.count()}")
        compileConfig.map { file -> 
            if (file.isDirectory) file else zipTree(file)
        }
    })
}

Компилируется, но не создает толстую банку (через "чистую сборку").Если посмотреть на вывод с информацией (через gradle clean build -x test --info ), можно найти ответ: на самом деле файлы не обрабатываются!

> Task :jar
#files to iterate over: 0
#files to iterate over: 0
Task ':jar' is not up-to-date because:
  Output property 'archiveFile' file /Users/SSchrod/progs/data-integration-salesforce-auto-cancellationkt/build/libs/data-integration-salesforce-auto-cancellation-0.1.51-SNAPSHOT.jar has been removed.
#files to iterate over: 0
:jar (Thread[Execution worker for ':',5,main]) completed. Took 0.068 secs.
:assemble (Thread[Execution worker for ':',5,main]) started.

С кодомказалось бы, правильно переведено на Kotlin, может быть, в остальной части моего build-скрипта проблема?Оригинальный учебник содержал вызов java-плагина в его build.gradle

apply plugin: 'java'

repositories {
    mavenCentral()
}

, которого нет в моем build.gradle.kts:

plugins {
    id("org.jetbrains.kotlin.jvm") version "1.3.20"
    id("pl.allegro.tech.build.axion-release") version "1.9.4"
    id("com.palantir.docker") version "0.21.0"
    id("com.github.johnrengelman.shadow") version "5.0.0"
}

repositories {
    mavenCentral()
    jcenter()
}

, но его добавление некажется, не имеет значения.

1 Ответ

1 голос
/ 10 апреля 2019

Итак, я получил решение с помощью плагина shadowJar:

plugins {
    kotlin("jvm") version "1.3.21"
    application
    id("com.github.johnrengelman.shadow") version "5.0.0"
}

application {
    mainClassName = "uk.co.which.stephan.server.ServerKt"
}

// repositories/dependencies/etc

tasks {
    withType<KotlinCompile> {
        kotlinOptions.jvmTarget = "1.8"
    }

    shadowJar {
        // defaults to project.name
        //archiveBaseName.set("${project.name}-fat")

        // defaults to all, so removing this overrides the normal, non-fat jar
        archiveClassifier.set("")
    }
}

полное решение доступно в файле gradle.build.kts ветки solution / shadowJar моего проекта HelloWorld-Ktor.

...