Brady
Brady

Reputation: 10357

spring-boot-maven-plugin not pulling in dependent classes into jar

Im having a problem with the spring-boot-maven-plugin whereby it is not including the dependent classes in the resulting jar file.

In the docs, it states that dependencies with scope provided will be included in the jar file, but I cant get it to include them.

I have a project with 2 sub-modules: model and restServer. In the model module, I want to use swagger to codegen based on an openApi input model. The resulting classes are put in a jar file: model/target/rest-model-0.0.1-SNAPSHOT.jar.

In the restServer module, I have the Spring RestController and Application java code, and want to "pull in" the model classes into the resulting jar file: restServer/target/rest-server-0.0.1-SNAPSHOT.jar with the spring-boot-maven-plugin builder, but its not including anything from the model sub-module.

The entire project structure and pom files are listed below.

How can I get the spring-boot-maven-plugin to pull in the class files from the model sub-module, effectively creating a "fat" self-contained jar?

Project Structure

project-root/
    pom.xml # parent pom
    model/
        pom.xml
        src/main/openApi/model.json
        target/
            generated-sources/* (package: com.me.rest.model.*)
            rest-model-0.0.1-SNAPSHOT.jar

    restServer/
        pom.xml
        src/main/java/com/me/rest/
            controller/Controller.java
            Application.java

Parent pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
  </parent>

  <groupId>com.me</groupId>
  <artifactId>rest-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>rest</name>
  <packaging>pom</packaging>

  <description>Swagger codegen for Spring Rest Server sandbox project</description>

  <scm>
    <connection>scm:git:[email protected]:swagger-api/swagger-codegen.git</connection>
    <developerConnection>scm:git:[email protected]:swagger-api/swagger-codegen.git</developerConnection>
    <url>https://github.com/swagger-api/swagger-codegen</url>
  </scm>

  <prerequisites>
    <maven>2.2.0</maven>
  </prerequisites>

  <modules>
    <module>model</module>
    <module>restServer</module>
  </modules>
</project>

model/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.kontron</groupId>
        <artifactId>rest-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <groupId>com.kontron</groupId>
    <artifactId>rest-model</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies> ... </dependencies>

    <build>
        <plugins>
            <!-- Swagger codegen plugin -->
            <plugin>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-codegen-maven-plugin</artifactId>
                <version>2.3.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration> ... </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

restServer/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
      <groupId>com.kontron</groupId>
      <artifactId>rest-parent</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>rest-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.kontron</groupId>
            <artifactId>rest-model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>provided</scope>     <!-- Notice scope is provided -->
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.1.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Update: adding resulting META-INF/MANIFEST.MF:

Manifest-Version: 1.0
Implementation-Title: rest-server
Implementation-Version: 0.0.1-SNAPSHOT
Built-By: bjohnson
Implementation-Vendor-Id: com.me
Spring-Boot-Version: 2.1.2.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.me.rest.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.5.4
Build-Jdk: 1.8.0_144
Implementation-URL: https://projects.spring.io/spring-boot/#/spring-bo
 ot-starter-parent/rest-parent/rest-server

Upvotes: 0

Views: 2202

Answers (1)

Simon Martinelli
Simon Martinelli

Reputation: 36223

The dependencies are placed in BOOT-INF\lib\ of the repackaged JAR file.

This path will be added to the classpath of you Spring Boot Application.

Upvotes: 1

Related Questions