当前位置: 首页 > 知识库问答 >
问题:

如何在多版本JAR中拥有多个版本的@SpringBootApplication主类?

梁俊友
2023-03-14

我有两个不同版本的spring配置,涉及两个不同的java版本,即Java8和Java11

项目结构类似于:

pom.xml:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-toolchains-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <toolchains>
                    <jdk>
                        <version>zulu-11</version>
                    </jdk>
                </toolchains>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>toolchain</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <executions>
                <execution>
                    <id>default-compile</id>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <release>8</release>
                    </configuration>
                </execution>
                <execution>
                    <id>compile-java-11</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <release>11</release>
                        <compileSourceRoots>
                            <compileSourceRoot>${project.basedir}/src/main/java11</compileSourceRoot>
                        </compileSourceRoots>
                        <multiReleaseOutput>true</multiReleaseOutput>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Multi-Release>true</Multi-Release>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.981 s
[INFO] Finished at: 2021-10-01T21:56:03+05:30
[INFO] Final Memory: 23M/293M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.5.5:repackage (repackage) on project demo: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.5.5:repackage failed: Unab
le to find a single main class from the following candidates [com.example.demo.DemoApplication, META-INF.versions.11.com.example.demo.DemoApplication] -> [Help 1]
[ERROR]

那么,有没有什么方法可以使用两个类而不导致构建失败呢?

此外,我不能使用配置文件和提及类要在特定的配置文件中使用。

共有1个答案

锺离飞尘
2023-03-14

可以使用pom.xml中的start-class属性来配置用于启动应用程序的类。

<properties>
    <start-class>com.example.demo.DemoApplication</start-class>
</properties>

当您在Java11上使用java-jar运行应用程序时,应该自动使用meta-inf/versions/11中的demoapplication变体。

 类似资料:
  • 在java 9中,引入了一个新特性,其中jar格式得到了增强,可以根据平台维护和使用不同版本的java类或资源。 在JAR中,文件文件的部分中有一个条目。 目录还包含版本子目录,其子目录(从9开始,用于Java 9)存储版本特定的类和资源文件。 在这个例子中,我们将使用多版本的jar来创建两个版本的文件,一个用于jdk 7,另一个用于jdk 9,并在不同的jdk版本上运行。 第1步 - 创建一个文

  • 我有一个独立的库(jar文件),它被添加到应用程序服务器类路径中,以监控JVM中所有正在运行的应用程序,并在出现问题时发送电子邮件。 jar文件将所有依赖项捆绑在jar中(使用maven shade插件),包括javamail jar文件。 当appserver中的其他Web应用程序之一具有javamail作为依赖项时,我的jar文件中的javamail会发生一些依赖冲突,我得到一个异常 我无法修

  • 问题内容: 将两个不同版本的 AngularJS 加载到一页中会遇到什么问题? 显然,这似乎是一件愚蠢的事情,但是我的用例是使用 AngularJS 的页面,该页面结合了第三方组件,并拖入了其首选的 AngularJS 版本。 更新: 找到一些信息: https://groups.google.com/forum/#!msg/angular/G8xPyD1F8d0/u1QNDNvcwW4J htt

  • 我的机器中有两个xampp版本,一个是php版本5.4,另一个是7.1(最近安装的)。我通常使用composer命令下载laravel。以前我下载时得到了laravel 5.0.X版本,因为我的php vesrion(5.4),但即使在安装了新的xampp(具有php版本7)之后,composer也只下载了laravel 5.0.X。当我检查我的php版本时,它显示了5.4,现在我如何选择或将最新

  • 问题内容: 我们有一个新的应用程序,需要glibc 2.4(来自gcc 4.1)。我们运行的机器具有gcc 3.4.6。我们无法升级,并且应用程序必须在此计算机上运行。 我们安装了gcc 4.1,但是在编译时,它使用的是3.4.6中的所有include等。 我们如何解决这个问题? 关于仅将此应用程序使用4.1的任何建议? 问题答案: 请参阅“如何安装GCC的多个版本” 这里的GNU GCC FAQ

  • 我需要在需要PHP 5.2的遗留系统上做一些工作 我已经安装了XAMP 1.7.3,但这个版本有PHP 5.3。 由于这是我在未来几个月可能会做几次的工作,我正在考虑安装一个运行PHP 5.2的XAMP版本,同时我还参与了一些需要使用PHP 5.3的工作,所以我无法卸载当前的XAMP版本并安装一个使用PHP 5.2的版本 在XAMPP下载网站上,很明显,在安装任何XAMPP版本时,它将删除之前的版