在树莓派上开发SpringBoot 之使用VSCode远程开发

一些运行在ARM单板电脑上的IoT应用通常会提供RESTful风格的API接口。本次的文章记录如何在本地电脑上通过VS Code的远程开发功能,在树莓派端创建一个SpringBoot工程,并实现调试和运行。

因为之前已经实现了在X86_64平台上用VS Code新建SpringBoot工程使用VS Code的远程开发功能在树莓进行开发。所以这次我们主要参考之前的经验,完成下面的工作。

准备工作

在树莓派上安装JDK11或更高版本

本步骤是在树莓派上执行的安装

如之前文章所述,我的树莓派2B板子的镜像是ubuntu 21.04,因此我要先检查下系统中的java版本:

$ java -version

如果你的系统显示的java jdk版本为11或者更高,可以跳过本步骤。但我的系统提示我未安装任何java程序,好在ubuntu系统给了一些安装提示,因此我只需根据提示输入想要安装的版本命令即可(其他系统可以根据实际情况安装,需要注意是需要安装JDK而非JRE):

$ sudo apt-get install -y openjdk-11-jdk-headless

安装好后再次查看java版本,已经满足要求:

$ java -version
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.21.10)
OpenJDK Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.21.10, mixed mode)

如果之前已经安装了其他版本的Java,则可以在安装新的Java版本后通过update-alternatives命令切换Java版本。

安装VSCode远程服务器端的扩展

本步骤在本地电脑使用VSCode的远程开发能力连接到树莓派端后再进行

首先要用VSCode远程连接到树莓派。然后在Extensions功能下安装扩展到树莓派服务器端。

需要安装的远程扩展分别是Extension Pack for JavaSpring Boot Extension Pack

如图我已经在本地端安装过Extension Pack for Java了,因此我要点击Install in SSH: x.x.x.x我的树莓派端。同理安装Spring Boot Extension Pack扩展到树莓派端。

Extension Pack for Java扩展

安装完这两个扩展后切换到ExtensionsSSH: x.x.x.x-INSTALLED分组可以查看远程终端上安装好的扩展。因为这两个扩展包会包含许多其他扩展,因此你会看到下列扩展都已经被自动安装上了。

树莓派终端上安装好的VSCode扩展

在树莓派上调试SpringBoot

在安装好树莓派上的Java JDK11和相关的远程VSCode扩展后,就可以像在本地开发SpringBoot工程一样进行工作了。我们可以选择从零新建一个SpringBoot工程,或者git clone一个在其他平台已经开发好的工程。

在开发SpringBoot时我们经常遇到国外Maven仓库源下载速度慢的问题,可以通过修改为国内源解决。

在树莓派端从零新建一个SpringBoot起始工程

大体步骤与之前的文章一致:Ubuntu下使用VS Code创建Spring Boot工程

  • 在VSCode远程连接到树莓派端后,打开命令台(Ctrl+Shift+PF1),输入spring会显示可用的SpringBoot命令,选择Spring Initializr: Create a Maven Project即可。
  • 选择SpringBoot版本,根据需求选择即可,这里我选的是2.5.9,也可以选择较高的版本,只是我比较担心有些依赖会不支持较高的版本。
  • 接下来选择开发语言,我用的是java
  • 然后设置包名和项目名(GroupId和ArtifactID),分别代表项目组织唯一标识符项目唯一的标识符
  • 选择打包类型未Jar
  • 选择Java版本为11,当然也有其他选项,由于VSCode的SpringBoot扩展包要求最低版本为11,因此我之前选择配置JDK11。这个版本限制可以通过安装低版本的扩展解决。
  • 接下来选择初始工程的依赖,根据需求选择即可。
  • 最后选择工程保存的目录以完成创建。啰嗦下哈:这里选择的目录是树莓派端的保存目录,虽然我们此时是在本地电脑上的VSCode界面,但是实际正在远程连接树莓派端

树莓派终端上新建SpringBoot

或者打开一个已有的工程

也可以直接clone我之前在x86_64平台系统上创建的示例工程,然后直接打开:

$ git clone https://github.com/congtou001/springboot-demo.git

树莓派终端上打开已有SpringBoot工程

由于该工程引用了Lombok依赖,并且使用了@Data注释,打开该工程后发现注释无法正常使用。可能时你的VSCode远程服务器端没有安装Lombok扩展,需要安装该扩展后才可以正常使用注解。

调试并运行SpringBoot

这里的步骤和在本地VSCode界面一致。在EXPLORERSPRING BOOT DASHBOARD分组下找到打开的的SpringBoot项目,点击项目名右侧的Debug按钮即可开始调试。待项目编译完并开始运行后,便可以在本地的任意浏览器打开该项目的页面了。

下图显示了在本地电脑上远程调试树莓派项目的界面。由于项目的编译和运行均是在树莓派端运行,而我的树莓派又是比较旧的2B版本,因此速度会慢不少。

可能遇到的问题: 我在第一次调试该项目的时候直接导致树莓派的1G内存瞬间跑满,结果卡死了远程服务。我的解决方案是为树莓派的ubuntu系统创建了一个1G大小的swap交换内存

树莓派终端调试SpringBoot

下图是在树莓派2B端运行SpringBoot demo工程的api接口返回结果

SpringBoot demo工程的api接口返回结果

遇到的问题

修改maven源镜像到国内

由于Maven默认的settings.xml使用官方仓库地址,因此国内下载依赖很慢,可以按照以下步骤配置为国内镜像地址。

首先找到默认的settings.xml文件,如果是linux系统下,一般是在用户目录的.m2文件夹内:~/.m2/settings.xml。如果没有,可以新建一个。

然后打开或新建该.xml配置文件来设定国内镜像地址,在\<mirrors>标签内配置:

<mirror>
    <id>aliyun-public</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun public</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

<mirror>
    <id>aliyun-central</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun central</name>
    <url>https://maven.aliyun.com/repository/central</url>
</mirror>

<mirror>
    <id>aliyun-spring</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun spring</name>
    <url>https://maven.aliyun.com/repository/spring</url>
</mirror>

<mirror>
    <id>aliyun-spring-plugin</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun spring-plugin</name>
    <url>https://maven.aliyun.com/repository/spring-plugin</url>
</mirror>

<mirror>
    <id>aliyun-apache-snapshots</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun apache-snapshots</name>
    <url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>

<mirror>
    <id>aliyun-google</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun google</name>
    <url>https://maven.aliyun.com/repository/google</url>
</mirror>

<mirror>
    <id>aliyun-gradle-plugin</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun gradle-plugin</name>
    <url>https://maven.aliyun.com/repository/gradle-plugin</url>
</mirror>

<mirror>
    <id>aliyun-jcenter</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun jcenter</name>
    <url>https://maven.aliyun.com/repository/jcenter</url>
</mirror>

<mirror>
    <id>aliyun-releases</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun releases</name>
    <url>https://maven.aliyun.com/repository/releases</url>
</mirror>

<mirror>
    <id>aliyun-snapshots</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun snapshots</name>
    <url>https://maven.aliyun.com/repository/snapshots</url>
</mirror>  

<mirror>
    <id>aliyun-grails-core</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun grails-core</name>
    <url>https://maven.aliyun.com/repository/grails-core</url>
</mirror>

<mirror>
    <id>aliyun-mapr-public</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun mapr-public</name>
    <url>https://maven.aliyun.com/repository/mapr-public</url>
</mirror>

重新编译或调试就会从国内maven镜像仓库下载依赖了。

为树莓派端新建SWAP交换内存

添加swap文件:

$ mkdir swap
$ cd swap
$ sudo dd if=/dev/zero of=sfile bs=1024 count=1000000

转化并激活为swap文件:

$ sudo mkswap sfile
$ sudo swapon sfile

@Data注解无效

若添加了Lombok依赖后依然无法使用@Data等注解自动生成Setter和Getter,则可能是VSCode忘了安装扩展Lombok Annotations Support for VS Code。在Extensions中安装该扩展即可。注意区分是安装到本地还是远程。

本文参考

发表评论

您的电子邮箱地址不会被公开。