Как запустить shadow jar с задачей gradle?

#java #gradle #intellij-idea #kotlin #shadowjar

#java #gradle #intellij-idea #kotlin #shadowjar

Вопрос:

Я хочу запустить свое приложение после его сборки с помощью плагина shadow jar.

build.gradle:

 plugins {
    id 'java'
    id "org.jetbrains.kotlin.jvm" version "1.3.21"
    id "com.github.johnrengelman.shadow" version "5.0.0"
}

group 'org.example.java'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8
compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

repositories {
    jcenter()
}

dependencies {
    compile "io.ktor:ktor-server-netty:1.1.3"
}
  

У меня также есть глобальный init.gradle:

 gradle.projectsLoaded {
    rootProject.allprojects {
        buildDir = "/Users/User/Builds/${rootProject.name}/${project.name}"
    }
}
  

Итак, теперь fat jar может быть собран в мой глобальный каталог сборки с помощью задачи shadowJar. Но я хочу иметь возможность запускать и собирать его с помощью всего одной конфигурации запуска в IntelliJ. Как мне это сделать?

Может быть, есть другой способ позволить gradle перенаправлять все мои выходные данные в глобальный каталог сборки. Я не хочу настраивать каждый проект IntelliJ с одинаковым путем вывода вручную. Предложения приветствуются.

Спасибо 🙂

Ответ №1:

Вы не должны касаться buildDir свойства для достижения того, чего вы хотите.

Вместо этого вам следует создать JavaExec задачу, которая запустит приложение из shadow jar. Если вы хотите, чтобы это выполнение выполнялось в другом месте, чем местоположение сгенерированного jar по умолчанию, вам следует либо изменить выходные данные самой теневой задачи, и только этот вывод, либо сделать вашу задачу выполнения зависимой от задачи копирования, которая перемещала бы shadow jar.

Что-то вроде:

 shadowJar {
    destinationDir = "/Users/User/Builds/${rootProject.name}/${project.name}"
}

task runApp(type: JavaExec) {
    main = "your.main.Class
    classpath = shadowJar.archiveFile // use archivePath before Gradle 5.1
}
  

Комментарии:

1. Спасибо 🙂 Но что, если я хочу, чтобы все выходные данные находились в каталоге сборки за пределами моих проектов (также для не теневых проектов)

2. Тогда то, что вы сделали с buildDir , было одним из решений. И означает, что приведенный выше фрагмент может забыть о shadowJar конфигурации задачи.

3. Теперь использование getDestinationDirectory() as destinationDir не рекомендуется.

4. Если быть точным: getDestinationDirectory().set(new File(projectDir, "./build/my_folder"));