Closed
Description
- Framework version: 1.0
- Implementations: Jersey / Spring / Spring Boot / Spark
Since using maven shade plugin to create a fat jar is known to be problematic because it can overwrite files by mixing jars (https://product.hubspot.com/blog/the-fault-in-our-jars-why-we-stopped-building-fat-jars), we currently use with success a safer way to deploy lambdas with dependencies: a single zip with all jars in a lib folder (as documented in https://docs.aws.amazon.com/en_en/lambda/latest/dg/create-deployment-pkg-zip-java.html)
Example code of how we do it in maven:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<finalName>${theapp.brandingToken}-${project.version}</finalName>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<!-- Assembler to produce ditribution zip -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>zip-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>${theapp.brandingToken}-${project.version}</finalName>
<descriptors>
<descriptor>src/assembly/bin.xml</descriptor>
</descriptors>
<attach>false</attach>
</configuration>
</execution>
</executions>
</plugin>
And bin.xml
file:
<assembly>
<id>aws-lambda-package</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.directory}${file.separator}lib</directory>
<outputDirectory>lib</outputDirectory>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
</fileSets>
<files>
<file>
<source>${project.build.directory}${file.separator}${theapp.brandingToken}-${project.version}.jar</source>
<outputDirectory>lib</outputDirectory>
</file>
</files>
</assembly>
Thanks,
Eduardo