java - dockerBuild 失败导致不支持的类文件主要版本 61 错误

标签 java docker maven docker-build jib

我正在尝试构建一个 docker 镜像,但我收到一条错误消息,告诉我 jib-maven-plugin 失败了。导致不支持的类文件主要版本 61 错误。

起初我以为这与我使用的 java 版本 (Java 17) 有关。所以我从我的机器上卸载了它并安装了 Java 15 但没有成功。

我正在尝试运行的命令:

./mvnw compile jib:dockerBuild -Djib.to.image=fullstack:v1

我得到的错误响应:

Failed to execute goal com.google.cloud.tools:jib-maven-plugin:2.5.2:dockerBuild (default-cli) on project demo: Execution default-cli of goal com.google.cloud.tools:jib-maven-plugin:2.5.2:dockerBuild failed: Unsupported class file major version 61 -> [Help 1]

我的 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 https://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.4.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>15</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <!-- The plugin below is to make a docker image using Jib -->
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>2.5.2</version>
                <configuration>
                    <from>
                        <image>openjdk:15</image>
                    </from>
                    <container>
                        <ports>
                            <port>8080</port>
                        </ports>
                        <format>OCI</format>
                    </container>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <!-- The code below is for packaging the frontend with the backend using maven -->
    <profiles>
        <profile>
            <id>build-frontend</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <plugins>

                    <plugin>
                        <groupId>com.github.eirslett</groupId>
                        <artifactId>frontend-maven-plugin</artifactId>
                        <!-- Use the latest released version:
                                  https://repo1.maven.org/maven2/com/github/eirslett/frontend-maven-plugin/ -->
                        <version>1.11.2</version>
                        <configuration>
                            <nodeVersion>v4.6.0</nodeVersion>
                            <workingDirectory>src/frontend</workingDirectory>
                        </configuration>
                        <executions>
                            <execution>
                                <id>install node and npm</id>
                                <goals>
                                    <goal>install-node-and-npm</goal>
                                </goals>
                                <configuration>
                                    <nodeVersion>v15.4.0</nodeVersion>
                                    <npmVersion>7.3.0</npmVersion>
                                </configuration>
                            </execution>
                            <execution>
                                <id>npm install</id>
                                <goals>
                                    <goal>npm</goal>
                                </goals>
                                <configuration>
                                    <arguments>install</arguments>
                                </configuration>
                            </execution>
                            <execution>
                                <id>npm run build</id>
                                <goals>
                                    <goal>npm</goal>
                                </goals>
                                <configuration>
                                    <arguments>run build</arguments>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <!-- The plugin below is for copying the build folder into the target static folder (maven) -->
                    <plugin>
                        <artifactId>maven-resources-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>copy-build-folder</id>
                                <phase>process-classes</phase>
                                <goals>
                                    <goal>copy-resources</goal>
                                </goals>
                                <configuration>
                                    <resources>
                                        <resource>
                                            <directory>src/frontend/build</directory>
                                        </resource>

                                    </resources>
                                    <outputDirectory>${basedir}/target/classes/static</outputDirectory>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

</project>

最佳答案

更新(01/20/2022):已发布包含错误修复的新 Jib 版本。升级 Jib 将修复它。

但是,几年后当你使用 Java 18+ 左右时,你可能会再次遇到这个问题。即便如此,还是有解决方法。


基本上,这是一个 bug在 Jib 中。

Jib 使用 ASM 库检查已编译的 Java 字节码以自动推断主类(即定义了 public static void main() 的类)。这样,如果您只有一个这样的类,Jib 可以自动推断并将该类用于图像入口点。

这种情况的原因是,Jib 目前没有使用能够识别和理解较新 Java 版本的字节码的最新 ASM 库。 Jib 团队需要升级库并制作新的 Jib 版本。

解决方法:为防止 Jib 进行自动推理,您可以通过 <container><mainClass> 手动设置所需的主类。 ,例如 <container><mainClass>com.example.your.Main</mainClass> .与其他 Jib 参数一样,这可以通过属性或命令行设置,例如 -Dcontainer.mainClass=... .


请注意,虽然在这种情况下错误是由于 ASM 引起的,但当然也可能由于其他原因而出现此错误。你可能想用 -e 运行 Maven或 -X获取完整的堆栈跟踪以查看错误的来源。

关于java - dockerBuild 失败导致不支持的类文件主要版本 61 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69798822/

相关文章:

eclipse - m2e 给出了高深莫测的 "project read error"

mysql - 在 docker 容器中将 mysql max_connections 增加到 1024

java - 在非 AWT 线程中更新 AbstractTableModel 中的数据的最佳实践

java - 如何使用 servlet 访问 Restful Web 服务?

java - 如何在一定的时间间隔后重复调用一个方法?

docker - 如何为安装了Bazel,Kubectl和Gcloud的Cloud Build创建Slim Docker镜像?

python - 使用 python 代码在 Docker 容器之间共享卷

java - Spring boot RESTful - 三层架构

java - 使用maven在java应用程序中运行两个版本的elasticsearch

java - 使用 Rest 客户端的 Elasticsearch 批量插入