sva605
sva605

Reputation: 1681

Spring Boot + Gradle: how to build executable jar

I'm trying to build an executable jar in Spring Boot + Gradle project, but for now nothing works. Here is the simplest possible structure. Possibly, something is missing in Gradle configuration.

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')
}

Main config file:

@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

When I ran the jar file like java -jar 1.jar, I got this 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

What might be wrong?

Upvotes: 52

Views: 125876

Answers (7)

nanosoft
nanosoft

Reputation: 3091

For me clicking on "jar" under gradle tasks in intellij created jar under./build/libs/

Click jar not bootJar

Upvotes: 1

Tarkan
Tarkan

Reputation: 561

If you're trying to make your .jar file executable, for use such as in a systemd service. You'll have to edit the bootJar task and enable launchScript.

build.gradle

bootJar {
    launchScript()
}

or with Gradle Kotlin DSL build.gradle.kts

tasks {
    bootJar {
        launchScript()
    }
}

You should now be able to run your project's .jar file as an executable.

Upvotes: 3

ton
ton

Reputation: 4577

My two cents.

When using spring-boot if you want to customize the MANIFEST.MF file, you need to set the bootJar task, it won't work on the default jar task.

bootJar {
    manifest {
    attributes 'Start-Class': 'com.baeldung.DemoApplication'
    }
}

Upvotes: 2

Santosh Kumar Arjunan
Santosh Kumar Arjunan

Reputation: 3896

I just recently tried a Spring boot application with 2.1.4.Release with Gradle build.

I ran the following command from the directory in Windows CMD.

gradlew clean build

(upon required JDK8 installed in the system), I was able to see the JAR generated under,

<project-directory>/build/libs/<project-name-version.jar>

Hope this helps though older question.

Reference:

enter image description here

Upvotes: 6

Rajesh
Rajesh

Reputation: 4769

In Boot 2.x, the bootJar and bootWar tasks are responsible for packaging the application.

The bootJar task is responsible for creating the executable jar file. This is created automatically once the java plugin is applied.

In case the executable jar/war file is not generated run the below gradle task manually.

$./gradlew bootJar

Similarly, bootWar generates an executable war file and gets created once the war plugin is applied.

We can execute the bootWar task using:

$./gradlew bootWar

Note that for Spring Boot 2.x, we need to use Gradle 4.0 or later.

Upvotes: 50

GaneshSreeju
GaneshSreeju

Reputation: 323

In spring boot you can directly create executable jar file by

springBoot { 
    executable = true 
}

Please try

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

It will create jar with name myapp-version.jar Do ./myapp-version.jar from command line.it will execute

Refer following link for more info. https://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

Upvotes: 11

moritz.krischke
moritz.krischke

Reputation: 345

I created a project with all the sources you provided. Running "gradle build" from terminal, switching to /build/libs and then running "java -jar artifactname" works just fine.

Have you tried to clean and recompile? Which Version of Gradle are you using?

Upvotes: 26

Related Questions