Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Boot and ebextensions

I'm trying to add an .ebextensions folder to the root level of my jar to be deployed to AWS elastic beanstalk.

My folder structure is:

main:
--src
--resources
  --.ebextensions

When I build the jar my .ebextensions gets placed on the classpath of my target and therefore is not picked up by Elastic Beanstalk on deploy.

Pom.xml

<plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
     <configuration>
           <fork>true</fork>
           <addResources>false</addResources>
     </configuration>
</plugin>

How can I build so that ebextensions is picked up by ELB?

like image 938
s.pike Avatar asked Mar 09 '17 18:03

s.pike


3 Answers

This works for me, is the cleanest way (in maven) I found to solve this:

Add .ebextensions in the root of your project and add this snippet at the end in the plugins section:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <id>prepare</id>
                    <phase>package</phase>
                    <configuration>
                        <tasks>
                            <unzip src="${project.build.directory}/${project.build.finalName}.jar" dest="${project.build.directory}/${project.build.finalName}" />
                            <copy todir="${project.build.directory}/${project.build.finalName}/" overwrite="false">
                                <fileset dir="./" includes=".ebextensions/**"/>
                            </copy>
                            <zip compress="false" destfile="${project.build.directory}/${project.build.finalName}.jar" basedir="${project.build.directory}/${project.build.finalName}"/>
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

This plugin use ant to unzip the final jar generated by spring boot, copy the .ebextensions in the root and zip (jar) again with the same name. Tested and working in production :)

Works with Spring 1.5.3.RELEASE

like image 171
Javier Arnáiz Avatar answered Sep 23 '22 16:09

Javier Arnáiz


For those of you using Gradle, here is what needs to be added to your build.gradle in order to add the .ebextensions stuff to the root of the jar.

It assumes that the .ebextensions directory and contents are in the root of your project.

Normal Java app:

jar {
    from(".") {
        include ".ebextensions/**"
    }
}

Spring Boot app:

bootJar {
    from(".") {
        include ".ebextensions/**"
    }
}

The Spring Boot case is slightly different to the normal Java case because with Spring Boot it is the Spring Boot Gradle plugin that actually constructs the jar - and it uses a special "bootJar" task in place of the standard Java plugin "jar" task.

I think that for Maven builds, Javier's answer is the cleanest way to go. For me, this illustrates the flexibility of Gradle over Maven when modifying "standard" builds.

like image 38
jadc Avatar answered Sep 23 '22 16:09

jadc


I was having the same problems, moving .ebextensions next to the jar as Andy suggested worked for me when I combined it with directly adding a .conf file to the desired directory as suggested here:

https://stackoverflow.com/a/41011160/7686379

like image 33
Evan Stitt Avatar answered Sep 23 '22 16:09

Evan Stitt