我正在尝试构建一个结构原型,其中多个 @SpringBootApplications 通过它们的打包命名空间进行隔离,如下所示:
在 Maven 中pom.xml
,为了构建,我依赖于配置文件,如下所示,并进行了描述here https://docs.spring.io/spring-boot/docs/3.0.x-SNAPSHOT/maven-plugin/reference/htmlsingle/#packaging and here https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/maven-plugin/repackage-mojo.html:
<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>
我尝试构建代码库(根据 spring-boot-maven-pluginspec https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/maven-plugin/examples/run-profiles.html) 结果如下:
>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 以上参考 https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/maven-plugin/examples/run-profiles.html建议通过以下方式调用-Drun.profiles=dcr
,常规的 Maven 方式,通过-P dcr
也尝试过,没有成功。它返回相同的错误消息。
我缺少什么?
上面的方法也参考了here https://stackoverflow.com/a/42840829/283837- 这个答案不正确吗?
先感谢您。
一些进一步的实验让我相信罪魁祸首就在spring-boot-maven-plugin
配置/调用,即使我禁用配置文件节pom.xml
完全一样,错误消息保持不变,它不区分 2 个配置文件,也不替换${spring.boot.mainclass}
财产:
<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>
当以下情况时,同样的错误仍然存在:plugins
配置略有不同,不使用配置文件:
<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>
并用简单的方法调用mvn clean package
.
更仔细地阅读Spring Boot Maven 插件文档 https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#packaging,看起来它根本不是为了识别 Maven 配置文件,为这个实验奠定了基础,参考above https://stackoverflow.com/a/42840829/283837更加摇摇欲坠:
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>