I'm trying to prototype a structure in which several @SpringBootApplications are segregated by means of their packaging namespaces, like so:
In Maven pom.xml
, to build, I'm relying on profiles, as shown below, and described here and here:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>
${spring.boot.mainclass}
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M6</version>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dcr</id>
<properties>
<spring.boot.mainclass>com.pru.globalpayments.feeds.downstream.dailycashreport.DcrDataFactoryApplication</spring.boot.mainclass>
</properties>
</profile>
<profile>
<id>other</id>
<properties>
<spring.boot.mainclass>com.pru.globalpayments.feeds.downstream.anothersystem.AnotherSystemDataFactoryApplication</spring.boot.mainclass>
</properties>
</profile>
</profiles>
</project>
My attempts to build the codebase (per spring-boot-maven-plugin spec) result in the following:
>mvn clear package -Drun.profiles=dcr
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.13:repackage (repackage) on project downstream-data-factory: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.7.13:repackage failed: Unable to find a single main class from the following candidates [com.pru.globalpayments.feeds.downstream.anothersystem.AnotherSystemDataFactoryApplication, com.pru.globalpayments.feeds.downstream.dailycashreport.DcrDataFactoryApplication] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.13:repackage (repackage) on project downstream-data-factory: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.7.13:repackage failed: Unable to find a single main class from the following candidates [com.pru.globalpayments.feeds.downstream.anothersystem.AnotherSystemDataFactoryApplication, com.pru.globalpayments.feeds.downstream.dailycashreport.DcrDataFactoryApplication]
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:375)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:351)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:171)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:163)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:294)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:960)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:293)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:196)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:566)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: org.apache.maven.plugin.PluginExecutionException: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.7.13:repackage failed: Unable to find a single main class from the following candidates [com.pru.globalpayments.feeds.downstream.anothersystem.AnotherSystemDataFactoryApplication, com.pru.globalpayments.feeds.downstream.dailycashreport.DcrDataFactoryApplication]
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:148)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:370)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:351)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:171)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:163)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:294)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:960)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:293)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:196)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:566)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
Caused by: java.lang.IllegalStateException: Unable to find a single main class from the following candidates [com.pru.globalpayments.feeds.downstream.anothersystem.AnotherSystemDataFactoryApplication, com.pru.globalpayments.feeds.downstream.dailycashreport.DcrDataFactoryApplication]
at org.springframework.boot.loader.tools.MainClassFinder$SingleMainClassCallback.getMainClassName (MainClassFinder.java:432)
at org.springframework.boot.loader.tools.MainClassFinder$SingleMainClassCallback.access$100 (MainClassFinder.java:403)
at org.springframework.boot.loader.tools.MainClassFinder.findSingleMainClass (MainClassFinder.java:198)
at org.springframework.boot.loader.tools.Packager.findMainMethod (Packager.java:318)
at org.springframework.boot.loader.tools.Packager.findMainMethodWithTimeoutWarning (Packager.java:307)
at org.springframework.boot.loader.tools.Packager.getMainClass (Packager.java:302)
at org.springframework.boot.loader.tools.Packager.addMainAndStartAttributes (Packager.java:282)
at org.springframework.boot.loader.tools.Packager.buildManifest (Packager.java:267)
at org.springframework.boot.loader.tools.Packager.write (Packager.java:209)
at org.springframework.boot.loader.tools.Packager.write (Packager.java:202)
at org.springframework.boot.loader.tools.Repackager.repackage (Repackager.java:144)
at org.springframework.boot.loader.tools.Repackager.repackage (Repackager.java:131)
at org.springframework.boot.maven.RepackageMojo.repackage (RepackageMojo.java:216)
at org.springframework.boot.maven.RepackageMojo.execute (RepackageMojo.java:206)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:370)
at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:351)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:171)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:163)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:294)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:960)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:293)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:196)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:566)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
[ERROR]
Though the above reference suggests invocation via -Drun.profiles=dcr
, the regular Maven way, via -P dcr
was also tried, unsuccessfully. It returns the same error message.
What am I missing?
The above approach is also referred to here - is that answer incrorrect?
Thank you in advance.
Some further experiments lead me to believe that the culprit is somewhere within the spring-boot-maven-plugin
configuration/invocation as even when I disable profiles stanza in pom.xml
completely, the error message remains the same, it doesn't distinguish between the 2 profiles and doesn't substitute the ${spring.boot.mainclass}
property:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>
${spring.boot.mainclass}
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M6</version>
</plugin>
</plugins>
</build>
<!--
<profiles>
<profile>
<id>dcr</id>
<properties>
<spring.boot.mainclass>com.pru.globalpayments.feeds.downstream.dailycashreport.DcrDataFactoryApplication</spring.boot.mainclass>
</properties>
</profile>
<profile>
<id>other</id>
<properties>
<spring.boot.mainclass>com.pru.globalpayments.feeds.downstream.anothersystem.AnotherSystemDataFactoryApplication</spring.boot.mainclass>
</properties>
</profile>
</profiles>
-->
</project>
The same error persists when plugins
are configured slightly differently, without using profiles:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage-dcr</id>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>com.pru.globalpayments.feeds.downstream.dailycashreport.DcrDataFactoryApplication</mainClass>
<finalName>dcr</finalName>
<outputDirectory>target/apps</outputDirectory>
</configuration>
</execution>
<execution>
<id>repackage-other</id>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>com.pru.globalpayments.feeds.downstream.anothersystem.AnotherSystemDataFactoryApplication</mainClass>
<finalName>other</finalName>
<outputDirectory>target/apps</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M6</version>
</plugin>
</plugins>
</build>
and invoked with simple mvn clean package
.
Reading more carefully into the Spring Boot Maven plugin documentation, looks like it's not intended to recognize Maven profiles at all, making the foundation on which this experiment is based, referred to above so much shakier:
Full 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.7.13</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.pru.globalpayments</groupId>
<artifactId>downstream-data-factory</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>downstream-data-factory</name>
<description>Contains logic for generation of feeds expected by the downstream systems</description>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<sonar.language>js</sonar.language>
<sonar.sources>src/main/java</sonar.sources>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.beanio</groupId>
<artifactId>beanio</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<!--
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.13.0</version>
</dependency>
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.11.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>1.8.0</version>
<!--<scope>test</scope>-->
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>4.11.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jeasy</groupId>
<artifactId>easy-random-core</artifactId>
<version>4.3.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>
${spring.boot.mainclass}
</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M6</version>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dcr</id>
<properties>
<spring.boot.mainclass>com.pru.globalpayments.feeds.downstream.dailycashreport.DcrDataFactoryApplication</spring.boot.mainclass>
</properties>
</profile>
<profile>
<id>other</id>
<properties>
<spring.boot.mainclass>com.pru.globalpayments.feeds.downstream.anothersystem.AnotherSystemDataFactoryApplication</spring.boot.mainclass>
</properties>
</profile>
</profiles>
</project>