一、Maven打包时遇到错误: 不支持发行版本 21
在打包一个 Springboot 项目 (版本号如下XML配置)时遇到一个问题
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
在本地使用21版本运行正常,但是在使用Maven 构建时出现错误:Fatal error compiling: 错误: 不支持发行版本 21 -> [Help 1]
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile (default-compile) on project gaotie-api: Fatal error compiling: 错误: 不支持发行版本 21 -> [Help 1]
问题点到底出在哪呢?因为一个前提是我在本地能正常运行,但是就是在打包的时候提示 错误: 不支持发行版本 21 。但我一再检查了一下项目设置中的JDK版本、IDEA中的各项JDK版本设置,均是21。打包的时候加载的东西和我在本地运行时的差异?
带着这个问题,我尝试进行了一下版本切换,使用常用的稳定的JDK8版本来尝试,于是各个版本设置的地方都改成了JDK 1.8,但是打包时又开始报一个新的错误: 类文件具有错误的版本 61.0, 应为 52.0的解决方法。
好像有一点眉目了。其中提示的 52.0 即是对应 Java 8的类文件版本,而61.0即是 Java 17的类文件版本。从提示来看我的整个程序中有 JDK17 的版本的支持需要,因此使用 JDK8 编译不能成功,而这应该就是我使用 21版本JDK打包失败的地方,于是我下载了一个 17版本的JDK,开始进行打包。果然成功。
总结:项目出现不支持发行版本 21,首先可以使用JDK8来试试,看报错中提示类文件具有错误的版本的版本号,而这个版本应该就是项目能使用的最高JDK版本。附一下我此时用的依赖,以后有时间或再次有类似情况时以参考。
二、Springboot 3.3.5 打包后部署 Could not find or load main class
Springboot 项目本地正常开发完成后,打成 jar 包,放至服务器 docker 下运行出现报错:Could not find or load main class,提示很明显是未找到主类。Spring中的主类设置可以在 pom.xml中实现。配置如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>cn.test.TestApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
除此之外,也可以直接在docker 容器启动的时候使用选项指定启动类。如下所示:
java -jar yourapp.jar --spring.main.class=com.example.MyApp
之后业务就能正常运行了,不过有一个要注意的地方,就是出现 Could not find or load main class 不一定是程序、配置中的问题,在docker容器技术启动脚本上也可能。如下方的容器启动脚本 sh -c java 这行缺少 -jar 就会导致这个错误提示,而且不好排查。
root@iZ2ze2shmjtZ:/opt/containerd/shell# cat container.sh
docker run -d --name api \
-v /opt/htdocs/api-0.0.1-SNAPSHOT.jar:/app/api-0.0.1-SNAPSHOT.jar \
-p 8080:8080 \
openjdk:17 \
sh -c "java /app/api-0.0.1-SNAPSHOT.jar"
# 上述脚本中sh -c java 这行缺少 -jar 会导致这个错误提示
也看到有的人提到升级到springboot 3.2 这个版本之后,之前的分层打包启动后会报一下错误 Error: Could not find or load main class org.springframework.boot.loader.JarLauncher。和这个地方的报错是不一样的。
三、关于Docker镜像https://index.docker.io报错问题
今天来下载镜像时就出现报错如下:
Error response from daemon: Get "https://index.docker.io/v1/search?q=KEY&n=25": dial tcp 10.21.15.10:443: connect: connection refused
只能改成阿里或者国内的源了,阿里源需要使用账号登录其平台从里面的镜像管理中复制每个人的域名地址,不过网上也有很多公开的源地址。如下所示:
1. 编辑 /etc/docker/daemon.json 添加镜像地址
root@iZ2ze2qyxshmjtZ:~# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://****.mirror.aliyuncs.com",
"https://reg-mirror.qiniu.com",
"https://docker.mirrors.ustc.edu.cn",
"https://dockerhub.azk8s.cn",
"https://hub-mirror.c.163.com",
"https://xxxxxxxx.mirror.aliyuncs.com",
"https://xxxxxx.mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://registry.docker-cn.com",
"https://docker.m.daocloud.io",
"https://mirror.baidubce.com",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn"
]
}
但我在添加了很多源及个人阿里源之后发现依然报错:Error response from daemon: Get "https://index.docker.io": : connect: connection refused,但使用 docker info 查看它的源确实已经换过了的。
2. 编辑 vim /etc/default/docker
添加一行配置内容,如下非注释那行
# Docker Upstart and SysVinit configuration file
#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
# Please see the documentation for "systemd drop-ins":
# https://docs.docker.com/engine/admin/systemd/
#
# Customize location of Docker binary (especially for development testing).
#DOCKERD="/usr/local/bin/dockerd"
# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
DOCKER_OPTS=" --registry-mirror=https://****.mirror.aliyuncs.com"
# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"
# This is also a handy place to tweak where Docker's temporary files go.
#export DOCKER_TMPDIR="/mnt/bigdrive/docker-tmp"
但是依然不行。使用docker info 查看是已经更新了的。
3. 编辑 vim /etc/default/docker
这个文件/etc/sysconfig/docker 默认应该不存在,新增加了后添加了一行配置,用参数 --registry-mirror=镜像地址
root@iZ2z9j8xshmjtZ:~# cat /etc/sysconfig/docker
OPTIONS=' –selinux-enabled–log-driver=journald --registry mirror=https://*****.mirror.aliyuncs.com'
这是在阿里云服务器上呢,可这些都不管用。后来发现我是使用 docker search 命令来看镜像是否能下载,然后再用了一下 pull 发现,镜像竟然能下载了,但是 search 命令就是不行!问了一下客服反馈: Docker Search 异常有可能使 加速地域配置异常。或者 docker官方限制了国内IP的访问 ,导致搜索超时。至少能下载镜像了,也算基本满足需求了,搜索以后就试试到网页上去搜。
针对镜像源地址,客服建议使用如下镜像:
{
"registry-mirrors": [
"https://docker.211678.top",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://docker.m.daocloud.io",
"https://do.nark.eu.org",
"https://dockerpull.com",
"https://dockerproxy.cn",
"https://docker.awsl9527.cn"
]
}