web-dev-qa-db-fra.com

Spring Boot + Gradle: comment créer un fichier jar exécutable

J'essaie de créer un fichier jar exécutable dans le projet Spring Boot + Gradle, mais pour l'instant rien ne fonctionne. Voici la structure la plus simple possible. Il se peut que quelque chose manque dans la configuration de Gradle. 

Gradle:

buildscript {
    ext {
        springBootVersion = '1.5.8.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'Java'
apply plugin: 'org.springframework.boot'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

jar {
    manifest {
        attributes 'Main-Class': 'com.example.demo.DemoApplication'
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
}

Fichier de configuration principal:

@RestController
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping(value = "/")
    public String index() {
        return "index";
    }
}

 enter image description here

Lorsque j'ai exécuté le fichier jar tel que Java -jar 1.jar, j'ai eu cette exception:

[main] ERROR org.springframework.boot.SpringApplication - Applicati
on startup failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to proces
s import candidates for configuration class [com.example.demo.DemoApplication];
nested exception is Java.lang.IllegalArgumentException: No auto configuration cl
asses found in META-INF/spring.factories. If you are using a custom packaging, m
ake sure that file is correct.
        at org.springframework.context.annotation.ConfigurationClassParser.proce
ssDeferredImportSelectors(ConfigurationClassParser.Java:556)
        at org.springframework.context.annotation.ConfigurationClassParser.parse
(ConfigurationClassParser.Java:185)
        at org.springframework.context.annotation.ConfigurationClassPostProcesso
r.processConfigBeanDefinitions(ConfigurationClassPostProcessor.Java:308)
        at org.springframework.context.annotation.ConfigurationClassPostProcesso
r.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.Java:228)
        at org.springframework.context.support.PostProcessorRegistrationDelegate
.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.ja
va:272)
        at org.springframework.context.support.PostProcessorRegistrationDelegate
.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.Java:92)
        at org.springframework.context.support.AbstractApplicationContext.invoke
BeanFactoryPostProcessors(AbstractApplicationContext.Java:687)
        at org.springframework.context.support.AbstractApplicationContext.refres
h(AbstractApplicationContext.Java:525)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationConte
xt.refresh(EmbeddedWebApplicationContext.Java:122)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.
Java:693)
        at org.springframework.boot.SpringApplication.refreshContext(SpringAppli
cation.Java:360)
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java
:303)
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java
:1118)
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java
:1107)
        at com.example.demo.DemoApplication.main(DemoApplication.Java:13)
Caused by: Java.lang.IllegalArgumentException: No auto configuration classes fou
nd in META-INF/spring.factories. If you are using a custom packaging, make sure
that file is correct.
        at org.springframework.util.Assert.notEmpty(Assert.Java:277)
        at org.springframework.boot.autoconfigure.AutoConfigurationImportSelecto
r.getCandidateConfigurations(AutoConfigurationImportSelector.Java:153)
        at org.springframework.boot.autoconfigure.AutoConfigurationImportSelecto
r.selectImports(AutoConfigurationImportSelector.Java:95)
        at org.springframework.context.annotation.ConfigurationClassParser.proce
ssDeferredImportSelectors(ConfigurationClassParser.Java:547)
        ... 14 common frames omitted

Quel est le problème?

5
sva605

J'ai créé un projet avec toutes les sources que vous avez fournies. Exécuter "gradle build" depuis le terminal, basculer vers/build/libs puis exécuter "Java -jar artefact" fonctionne parfaitement.

Avez-vous essayé de nettoyer et de recompiler? Quelle version de Gradle utilisez-vous?

5
Moe

Au démarrage de printemps, vous pouvez créer directement un fichier jar exécutable en 

springBoot { 
    executable = true 
}

S'il vous plaît essayez

jar{
    baseName = 'myapp' 
    version = 'version'
}

Il va créer un fichier jar avec le nom myapp-version.jarDo ./myapp-version.jar à partir de la commande line.it sera exécuté

Reportez-vous au lien suivant pour plus d'informations. https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

3
GaneshSreeju

Dans Boot 2.x, les tâches bootJar et bootWar sont responsables du conditionnement de l'application.

La tâche bootJar est responsable de la création du fichier jar exécutable. Ceci est créé automatiquement une fois que le plugin Java est appliqué.

Si le fichier jar/war exécutable n’est pas généré, exécutez manuellement la tâche de classement ci-dessous.

$./gradlew bootJar

De même, bootWar génère un fichier war exécutable et est créé une fois le plugin war appliqué.

Nous pouvons exécuter la tâche bootWar en utilisant:

$./gradlew bootWar

Notez que pour Spring Boot 2.x, nous devons utiliser Gradle 4.0 ou version ultérieure.

2
Rajesh Samson