Spring Boot Maven Plugin Include Resources

David picture David · Feb 20, 2018 · Viewed 8.1k times · Source

Example

Is it possible to somehow configure the spring boot maven plugin to include resources from a dependency.

E.g. if in my spring boot project I have:

<dependency>
        <groupId>co.company</groupId>
        <artifactId>example</artifactId>
    </dependency>

and in that JAR file there is a properties file such as example.properties

jar -tf example.jar | grep example.properties | wc -l

results in 1.

However, when I build the spring boot JAR, this properties file is not added to the src/main/resources. The JAR containing it is included in BOOT-INF/lib/example.jar

However, in my case. I'd like to extract the content of src/main/resources out into the boot BOOT-INF/classes/ directory of the spring boot JAR so that things like auto configuration can pick it up.

Real World

In the real world, i'm trying to do this with:

  • thymeleaf templates (e.g. my dependency JAR provides the HTML template files but in the deployed boot jar these templates are not resolved)
  • liquibase changelog files (my dependency includes changelog files but these aren't executed - I presume liquibase autoconfig doesn't find the changelog file because it's not in the src/main/resources of the boot JAR).

Answer

jjlharrison picture jjlharrison · Feb 23, 2018

I think the solution for this problem would be very similar to the solution for another question you asked.

You can use the unpack goal of the maven-dependency-plugin in your Spring Boot module:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>module-a</artifactId>
                        <version>${project.version}</version>
                        <includes>**/*.yaml</includes>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>${project.build.directory}/classes/BOOT-INF/</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

That will copy the resources from module-a to BOOT-INF directory of your boot-module. I've posted a more complete example on GitHub.