开发环境搭建 #
一、环境概述 #
1.1 开发环境组成 #
一个完整的Java嵌入式开发环境包括:
text
┌─────────────────────────────────────────────────────────┐
│ 开发环境架构 │
├─────────────────────────────────────────────────────────┤
│ 开发主机(PC/Mac) │
│ ├── JDK(开发用) │
│ ├── IDE(IntelliJ IDEA / Eclipse / VS Code) │
│ ├── 构建工具(Maven / Gradle) │
│ ├── SSH客户端 │
│ └── 交叉编译工具链 │
├─────────────────────────────────────────────────────────┤
│ 目标设备(嵌入式板卡) │
│ ├── JVM(运行用) │
│ ├── 应用程序 │
│ └── 硬件外设 │
└─────────────────────────────────────────────────────────┘
1.2 开发模式选择 #
| 模式 | 描述 | 适用场景 |
|---|---|---|
| 本地开发 | 在目标设备上直接开发 | 学习、简单项目 |
| 交叉开发 | 在PC开发,部署到设备 | 生产项目 |
| 容器开发 | 使用Docker容器 | 团队协作 |
二、开发主机环境配置 #
2.1 JDK安装 #
Linux/macOS
bash
# 使用SDKMAN安装
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
# 安装LTS版本
sdk install java 17.0.9-tem
# 验证安装
java -version
javac -version
Windows
- 下载JDK:https://adoptium.net/
- 选择Temurin 17 LTS版本
- 运行安装程序
- 配置环境变量:
powershell
# 设置JAVA_HOME
setx JAVA_HOME "C:\Program Files\Eclipse Adoptium\jdk-17.0.9"
# 添加到PATH
setx PATH "%PATH%;%JAVA_HOME%\bin"
2.2 IDE选择与配置 #
IntelliJ IDEA(推荐)
-
安装插件:
- Raspberry Pi Support
- SSH Remote Development
-
配置远程部署:
xml
<!-- .idea/deployment.xml -->
<component name="DeploymentConfiguration">
<deploymentConfiguration>
<option name="serverName" value="raspberry-pi" />
<option name="serverType" value="SFTP" />
<option name="host" value="192.168.1.100" />
<option name="port" value="22" />
<option name="username" value="pi" />
</deploymentConfiguration>
</component>
VS Code
-
安装扩展:
- Extension Pack for Java
- Remote - SSH
- Raspberry Pi
-
配置Java环境:
json
// settings.json
{
"java.configuration.runtimes": [
{
"name": "JavaSE-17",
"path": "/usr/lib/jvm/temurin-17-jdk",
"default": true
}
]
}
2.3 构建工具配置 #
Maven配置
xml
<!-- pom.xml 嵌入式项目基础配置 -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>embedded-app</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-core</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Gradle配置
groovy
// build.gradle
plugins {
id 'java'
id 'application'
}
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
application {
mainClass = 'com.example.Main'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'com.pi4j:pi4j-core:2.3.0'
implementation 'com.pi4j:pi4j-plugin-raspberrypi:2.3.0'
implementation 'com.pi4j:pi4j-plugin-pigpio:2.3.0'
}
jar {
manifest {
attributes 'Main-Class': 'com.example.Main'
}
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
三、目标设备环境配置 #
3.1 操作系统安装 #
Raspberry Pi OS安装
-
下载Raspberry Pi Imager:https://www.raspberrypi.com/software/
-
烧录系统:
- 选择操作系统:Raspberry Pi OS Lite(推荐,无桌面环境)
- 选择存储设备:microSD卡
- 高级设置:配置SSH、用户名密码、WiFi
-
首次启动配置:
bash
# 更新系统
sudo apt update && sudo apt upgrade -y
# 配置时区
sudo timedatectl set-timezone Asia/Shanghai
# 配置主机名
sudo hostnamectl set-hostname embedded-java
3.2 JVM安装 #
安装OpenJDK
bash
# 安装JDK 17
sudo apt install openjdk-17-jdk-headless -y
# 验证安装
java -version
安装优化的JVM(可选)
对于资源受限的设备,可以使用优化版JVM:
bash
# 安装Zulu Embedded JDK
wget https://cdn.azul.com/zulu-embedded/bin/zulu17.46.19-ca-jdk17.0.10-linux_aarch32hf.tar.gz
sudo tar -xzf zulu17.46.19-ca-jdk17.0.10-linux_aarch32hf.tar.gz -C /opt
sudo ln -s /opt/zulu17.46.19-ca-jdk17.0.10-linux_aarch32hf /opt/java
# 配置环境变量
echo 'export JAVA_HOME=/opt/java' >> ~/.bashrc
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
3.3 GPIO权限配置 #
bash
# 安装pigpio库(Pi4J依赖)
sudo apt install pigpio -y
# 配置GPIO用户权限
sudo usermod -a -G gpio pi
sudo usermod -a -G spi pi
sudo usermod -a -G i2c pi
sudo usermod -a -G dialout pi
# 配置pigpio服务自启动
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
四、远程开发配置 #
4.1 SSH配置 #
生成SSH密钥
bash
# 在开发主机上生成密钥
ssh-keygen -t ed25519 -C "embedded-dev"
# 复制公钥到目标设备
ssh-copy-id pi@192.168.1.100
# 配置SSH别名
cat >> ~/.ssh/config << EOF
Host rpi
HostName 192.168.1.100
User pi
IdentityFile ~/.ssh/id_ed25519
EOF
免密登录测试
bash
ssh rpi
4.2 远程调试配置 #
IDEA远程调试
- 创建远程运行配置:
xml
<!-- Run/Debug Configuration -->
<configuration name="Remote Debug">
<option name="HOST" value="192.168.1.100" />
<option name="PORT" value="5005" />
<option name="AUTO_START" value="false" />
</configuration>
- 在目标设备启动应用(调试模式):
bash
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar app.jar
VS Code远程开发
json
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Remote Debug",
"request": "attach",
"hostName": "192.168.1.100",
"port": 5005
}
]
}
4.3 文件同步配置 #
使用rsync同步
bash
#!/bin/bash
# sync.sh
SOURCE="./target/"
DEST="pi@192.168.1.100:/home/pi/app/"
rsync -avz --delete \
--exclude '*.log' \
--exclude '*.tmp' \
$SOURCE $DEST
echo "Sync completed at $(date)"
使用Maven部署插件
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>deploy</id>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<scp
file="${project.build.directory}/${project.build.finalName}.jar"
todir="pi@192.168.1.100:/home/pi/app"
keyfile="${user.home}/.ssh/id_ed25519"
trust="yes"/>
</target>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.10.14</version>
</dependency>
</dependencies>
</plugin>
五、开发环境验证 #
5.1 创建测试项目 #
bash
# 创建项目目录
mkdir embedded-hello && cd embedded-hello
# 创建Maven项目
mvn archetype:generate \
-DgroupId=com.example \
-DartifactId=embedded-hello \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
5.2 编写测试代码 #
java
package com.example;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class SystemInfo {
public static void main(String[] args) {
System.out.println("=== Java嵌入式环境检测 ===\n");
printJavaInfo();
printOsInfo();
printMemoryInfo();
printCpuInfo();
printGpioInfo();
}
private static void printJavaInfo() {
System.out.println("【Java环境】");
System.out.println(" Java版本: " + System.getProperty("java.version"));
System.out.println(" JVM名称: " + System.getProperty("java.vm.name"));
System.out.println(" JVM供应商: " + System.getProperty("java.vendor"));
System.out.println(" Java Home: " + System.getProperty("java.home"));
System.out.println();
}
private static void printOsInfo() {
System.out.println("【操作系统】");
System.out.println(" OS名称: " + System.getProperty("os.name"));
System.out.println(" OS版本: " + System.getProperty("os.version"));
System.out.println(" OS架构: " + System.getProperty("os.arch"));
System.out.println();
}
private static void printMemoryInfo() {
System.out.println("【内存信息】");
Runtime runtime = Runtime.getRuntime();
long maxMemory = runtime.maxMemory() / 1024 / 1024;
long totalMemory = runtime.totalMemory() / 1024 / 1024;
long freeMemory = runtime.freeMemory() / 1024 / 1024;
System.out.println(" 最大内存: " + maxMemory + " MB");
System.out.println(" 已分配内存: " + totalMemory + " MB");
System.out.println(" 空闲内存: " + freeMemory + " MB");
System.out.println();
}
private static void printCpuInfo() {
System.out.println("【CPU信息】");
System.out.println(" 可用处理器: " + Runtime.getRuntime().availableProcessors());
try (BufferedReader reader = new BufferedReader(new FileReader("/proc/cpuinfo"))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("model name") || line.startsWith("Model")) {
System.out.println(" CPU型号: " + line.split(":")[1].trim());
break;
}
}
} catch (IOException e) {
System.out.println(" 无法读取CPU信息");
}
System.out.println();
}
private static void printGpioInfo() {
System.out.println("【GPIO状态】");
java.io.File gpioDir = new java.io.File("/sys/class/gpio");
if (gpioDir.exists()) {
String[] exported = gpioDir.list((dir, name) -> name.startsWith("gpio"));
if (exported != null && exported.length > 0) {
System.out.println(" 已导出GPIO: " + String.join(", ", exported));
} else {
System.out.println(" 暂无导出的GPIO");
}
} else {
System.out.println(" GPIO系统不可用");
}
}
}
5.3 编译与部署 #
bash
# 编译项目
mvn clean package
# 部署到目标设备
scp target/embedded-hello-1.0-SNAPSHOT.jar rpi:/home/pi/
# 远程执行
ssh rpi "java -jar /home/pi/embedded-hello-1.0-SNAPSHOT.jar"
5.4 预期输出 #
text
=== Java嵌入式环境检测 ===
【Java环境】
Java版本: 17.0.9
JVM名称: OpenJDK 64-Bit Server VM
JVM供应商: Eclipse Adoptium
Java Home: /usr/lib/jvm/java-17-openjdk-arm64
【操作系统】
OS名称: Linux
OS版本: 6.1.0-rpi4-rpi-v8
OS架构: aarch64
【内存信息】
最大内存: 954 MB
已分配内存: 64 MB
空闲内存: 61 MB
【CPU信息】
可用处理器: 4
CPU型号: ARMv7 Processor rev 3 (v7l)
【GPIO状态】
暂无导出的GPIO
六、常见问题解决 #
6.1 内存不足 #
bash
# 检查内存状态
free -h
# 增加交换空间
sudo dphys-swapfile swapoff
sudo nano /etc/dphys-swapfile
# 修改 CONF_SWAPSIZE=1024
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
6.2 权限问题 #
bash
# GPIO权限
sudo chmod -R 777 /sys/class/gpio
sudo chmod -R 777 /dev/gpiomem
# I2C权限
sudo chmod 666 /dev/i2c-*
# SPI权限
sudo chmod 666 /dev/spidev*
6.3 网络问题 #
bash
# 检查网络连接
ping -c 4 8.8.8.8
# 检查DNS
nslookup google.com
# 重启网络服务
sudo systemctl restart networking
七、总结 #
搭建Java嵌入式开发环境需要配置:
- 开发主机:JDK、IDE、构建工具
- 目标设备:操作系统、JVM、GPIO权限
- 远程开发:SSH、远程调试、文件同步
环境搭建完成后,建议运行系统检测程序验证配置是否正确。下一章我们将编写第一个嵌入式程序,实现LED闪烁功能。
最后更新:2026-03-27