Linux服务器Java环境部署全攻略:从JDK安装到Spring Boot服务化
1. 从零到一为什么你的Linux服务器需要一个专属的Java环境如果你刚接手一台崭新的Linux服务器或者准备在云上部署一个Java应用第一件事很可能就是安装JDK和部署JAR包。这听起来像是开发运维的“Hello World”但很多人恰恰在这里踩了最多的坑。我见过太多人直接从搜索引擎里复制粘贴命令结果环境变量配错、版本冲突、权限不足一个简单的部署流程能折腾大半天。今天我们不谈那些泛泛而谈的教程而是从一个一线运维的角度拆解在Linux上搭建Java生产环境的完整链路、背后的原理以及那些只有踩过坑才知道的细节。核心目标很明确在一台干净的Linux服务器上安全、可靠地安装指定版本的Java开发工具包并让一个Spring Boot之类的JAR包应用能够稳定运行甚至具备基本的服务化管理能力。这个过程不仅仅是执行几条命令它涉及到系统路径的理解、用户权限的规划、服务生命周期的管理以及后续维护的便利性。无论是用于开发测试还是正式的生产部署一个清晰的步骤和知其所以然的理解都能为你节省大量时间避免低级错误。2. JDK选型、获取与安装避开官网下载的“陷阱”安装JDK是整个流程的基石。你的第一个决策点就是用哪个版本从哪里下2.1 OpenJDK vs Oracle JDK社区与商业的抉择目前主流的选择是OpenJDK。它是Java SE平台的开源参考实现由社区和各大厂商如Red Hat, Amazon, Adoptium共同维护。自从Oracle调整了JDK的授权协议后对于生产环境OpenJDK几乎成了默认且安全的选择。它的功能与Oracle JDK在绝大多数场景下完全一致。那么该从哪里下载OpenJDK直接访问OpenJDK官网可能会让你困惑因为它更多是源码仓库。对于普通用户我强烈推荐通过以下几个可靠的渠道获取预编译好的二进制包Adoptium原AdoptOpenJDK这是Eclipse基金会旗下的项目提供经过严格测试、多平台兼容的OpenJDK二进制发行版包括HotSpot和OpenJ9两种JVM实现。它的网站清晰下载速度快是社区最信任的来源之一。操作系统厂商的仓库例如Ubuntu/Debian系的aptCentOS/RHEL系的yum或dnf。这种方式安装最便捷版本通常较稳定但可能不是最新版本。例如在Ubuntu 22.04上你可以用sudo apt install openjdk-11-jdk来安装JDK 11。云厂商的镜像如果你在国内从Oracle或Adoptium官网直接下载速度可能很慢。这时可以寻找国内高校或大厂的镜像站。例如清华大学开源软件镜像站、华为云镜像站都提供了OpenJDK的镜像下载速度会有质的提升。一个关键建议对于生产环境尽量避免使用操作系统仓库里过于陈旧的版本比如CentOS 7默认的JDK 1.8.0_181也谨慎使用某些第三方打包的、来历不明的JDK。从Adoptium或主流Linux发行版的官方仓库获取是平衡了便捷性、安全性和时效性的最佳实践。2.2 实操安装两种路径的深度解析假设我们决定为生产服务器安装OpenJDK 11。这里提供两种最主流的方法并解释其背后的管理逻辑。方法一使用包管理器安装以Ubuntu/Debian为例这是最“系统化”的方式适合希望保持系统整洁、依赖关系清晰的环境。# 首先更新软件包列表确保获取到最新的源信息 sudo apt update # 搜索可用的OpenJDK 11相关包 apt search openjdk-11 # 安装JDK包含JRE和开发工具 sudo apt install openjdk-11-jdk # 安装完成后验证安装 java -version背后的原理apt安装的JDK会被分散到系统的标准目录中例如/usr/lib/jvm/java-11-openjdk-amd64。包管理器会自动为你配置一个“替代方案”系统。你可以通过sudo update-alternatives --config java来管理系统中多个Java版本的切换。这种方式的好处是卸载和升级都由apt统一管理非常规范。缺点是安装目录结构固定且版本可能非最新。方法二手动下载并解压安装更灵活、更通用这是我更推荐的方式尤其是在你需要特定小版本、或者需要将JDK放置于自定义目录如/opt时。它让你对Java环境拥有完全的控制权。# 1. 进入一个临时目录用于下载 cd /tmp # 2. 使用wget从Adoptium下载OpenJDK 11 (示例URL请访问Adoptium官网获取最新链接) # 这里以Linux x64架构的HotSpot JVM tar.gz包为例 wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20%2B8/OpenJDK11U-jdk_x64_linux_hotspot_11.0.20_8.tar.gz # 3. 创建目标目录通常将第三方软件放在/opt下 sudo mkdir -p /opt/java # 4. 解压下载的压缩包到目标目录 sudo tar -xzf OpenJDK11U-jdk_x64_linux_hotspot_11.0.20_8.tar.gz -C /opt/java/ # 5. 查看解压后的目录名并为其创建一个通用的软链接便于后续版本升级 cd /opt/java ls # 假设解压出来的目录是 jdk-11.0.208 sudo ln -s jdk-11.0.208 current_jdk至此JDK的二进制文件已经就位位于/opt/java/current_jdk。但系统还不知道它的存在下一步就是关键的环境变量配置。3. 环境变量配置让系统“认识”你的Java环境变量是操作系统和Shell用来定位可执行文件、库文件以及配置运行时行为的一套键值对。对于Java最重要的两个环境变量是JAVA_HOME和PATH。JAVA_HOME指向JDK的安装根目录。很多Java应用服务器如Tomcat、构建工具如Maven、Gradle都依赖这个变量来找到Java编译器和其他工具。PATH是一个用冒号分隔的目录列表。当你在终端输入一个命令如java或javac时系统会按照PATH中目录的顺序依次查找对应的可执行文件。配置环境变量也有多种方式不同的方式影响范围不同。3.1 配置方式的选择用户级 vs 系统级修改~/.bashrc或~/.bash_profile这是用户级别的配置。只对当前用户生效且只在登录Shell或交互式Shell中生效。适合开发机或个人服务器。修改/etc/profile或/etc/profile.d/下的脚本这是系统级别的配置。对所有用户生效。适合生产服务器确保任何用户如用来运行服务的appuser都能正确使用Java。对于生产部署我通常采用系统级配置在/etc/profile.d/目录下创建一个独立的脚本文件这样管理起来更清晰也避免了直接修改全局/etc/profile文件的风险。# 使用vim或nano创建配置文件 sudo vim /etc/profile.d/java.sh在打开的文件中添加以下内容#!/bin/bash # 设置JAVA_HOME指向我们之前创建的软链接 export JAVA_HOME/opt/java/current_jdk # 将JDK的bin目录添加到PATH变量最前面 export PATH$JAVA_HOME/bin:$PATH关键细节解析export命令用于设置环境变量并使其在当前Shell及其子进程中可用。PATH$JAVA_HOME/bin:$PATH这个赋值语句将$JAVA_HOME/bin放在了$PATH的前面。这意味着当系统查找java命令时会优先使用我们自定义的JDK版本而不是系统可能自带的旧版本。文件权限确保这个脚本是可执行的sudo chmod x /etc/profile.d/java.sh。3.2 使配置生效与验证新打开的终端会话会自动加载/etc/profile.d/下的脚本。对于当前已登录的Shell需要手动“source”一下配置文件或者直接注销再登录。# 在当前Shell会话中加载配置 source /etc/profile.d/java.sh # 现在进行验证 echo $JAVA_HOME # 应该输出/opt/java/current_jdk java -version # 应该显示 OpenJDK 11.0.20 等信息证明PATH配置正确 javac -version # 应该显示Java编译器版本证明JDK而不仅仅是JRE安装成功一个常见的坑如果你按照教程配置了JAVA_HOME和PATH但java -version显示的仍然是旧版本。这几乎可以肯定是PATH顺序问题。使用which java命令可以查看当前生效的java命令的完整路径它会明确告诉你系统最终找到的是哪个目录下的java。如果不对检查你的PATH赋值语句确保自定义的路径在旧路径之前。4. JAR包部署实战超越java -jar的简单启动假设你有一个名为myapp-1.0.0.jar的Spring Boot应用JAR包。最简单的运行方式是java -jar myapp-1.0.0.jar但这存在几个严重问题1) 终端关闭应用就停止2) 输出混在控制台难以排查3) 没有自动重启机制。对于生产环境这完全不可接受。4.1 创建专用系统用户首先从安全角度永远不要使用root用户来运行你的应用。应该创建一个权限受限的专用用户。# 创建一个名为‘myapp’的系统用户且不创建家目录(-M)并指定不可登录的Shell(-s /sbin/nologin) sudo useradd -M -s /sbin/nologin myapp # 创建应用部署目录并更改所有者为myapp用户 sudo mkdir -p /opt/myapp sudo chown -R myapp:myapp /opt/myapp4.2 将JAR包和配置文件放置到位将你的myapp-1.0.0.jar上传到服务器/opt/myapp/目录下。同时Spring Boot应用通常支持外置的application.properties或application.yml配置文件我们可以将其放在JAR包同级目录下或者一个专门的config子目录里这样比打包在JAR内更易于修改。# 假设文件已通过scp或sftp上传到用户家目录 sudo cp ~/myapp-1.0.0.jar /opt/myapp/ sudo cp ~/application-prod.yml /opt/myapp/config/ sudo chown -R myapp:myapp /opt/myapp4.3 使用Systemd管理服务实现开机自启与状态监控Systemd是现代Linux发行版的标准服务管理器。将我们的JAR包配置为Systemd服务可以获得最完善的生命周期管理。创建服务单元文件sudo vim /etc/systemd/system/myapp.service写入以下配置内容每一部分都有其重要作用[Unit] DescriptionMy Spring Boot Application Afternetwork.target syslog.target # After指令定义了启动顺序确保在网络和系统日志就绪后再启动本服务 [Service] Typesimple # 使用simple类型Systemd认为服务进程启动后即准备就绪 Usermyapp Groupmyapp # 指定运行服务的用户和组至关重要 WorkingDirectory/opt/myapp # 设置工作目录这样相对路径的配置文件如./config/才能正确读取 ExecStart/opt/java/current_jdk/bin/java -Xms512m -Xmx1024m -jar myapp-1.0.0.jar --spring.config.locationfile:./config/application-prod.yml # ExecStart是核心启动命令。 # -Xms和-Xmx设置了JVM堆内存的初始大小和最大大小必须根据应用实际需求调整。 # --spring.config.location 指定外部配置文件的位置。 SuccessExitStatus143 # Spring Boot应用在收到SIGTERM信号时默认以143退出告诉Systemd这是正常停止。 Restartalways # 定义重启策略任何原因退出都重启。还可设为on-failure仅失败时重启。 RestartSec10 # 重启前等待10秒避免频繁重启循环。 StandardOutputjournal StandardErrorjournal # 将标准输出和错误输出重定向到Systemd的日志系统journal方便用journalctl查看。 EnvironmentJAVA_HOME/opt/java/current_jdk # 显式设置环境变量确保服务进程能正确找到JAVA_HOME。 [Install] WantedBymulti-user.target # 定义在哪个“运行级别”启用服务multi-user.target对应多用户命令行模式。配置解读与避坑点内存设置-Xms, -Xmx这是JVM调优的基础。-Xms设置初始堆大小-Xmx设置最大堆大小。通常设置为相同值可以避免运行时的堆内存扩容收缩带来的性能波动。具体数值需要通过监控应用实际使用情况来定。配置文件路径--spring.config.location的file:前缀指定文件系统路径。使用./config/这样的相对路径时必须正确设置WorkingDirectory。用户权限User和Group必须设置这是安全基线。确保/opt/myapp目录对该用户可读可执行对JAR包可读。日志管理使用journalctl -u myapp.service -f可以实时跟踪服务日志。这对于排查启动失败、运行时异常至关重要。4.4 启动、管理与监控服务配置完成后需要让Systemd重新加载配置然后启动服务。# 重新加载systemd配置使新的服务单元文件生效 sudo systemctl daemon-reload # 启动myapp服务 sudo systemctl start myapp.service # 设置开机自启 sudo systemctl enable myapp.service # 查看服务状态 sudo systemctl status myapp.service # 实时查看服务日志 sudo journalctl -u myapp.service -f # 停止服务 sudo systemctl stop myapp.service # 重启服务例如更新JAR包后 sudo systemctl restart myapp.service状态查看技巧systemctl status命令会显示服务是否活跃active、是否启用enabled、以及最近的部分日志。如果服务启动失败状态为 failed这里会给出第一线索。结合journalctl -u myapp.service --no-pager -n 50查看最近50行完整日志是定位问题的标准操作。5. 进阶部署考量与故障排查指南基础的安装和部署完成后为了应对更复杂的生产场景我们还需要考虑一些进阶问题。5.1 多版本JDK共存与管理服务器上可能需要同时运行依赖不同Java版本的应用。手动解压配合环境变量管理会变得混乱。此时可以使用工具来管理。使用update-alternatives如果你通过包管理器安装了多个JDK这个工具是系统自带的。你可以用它来全局切换javajavac等命令的默认版本。# 注册一个Java版本到alternatives系统以手动安装的JDK为例 sudo update-alternatives --install /usr/bin/java java /opt/java/current_jdk/bin/java 1000 sudo update-alternatives --install /usr/bin/javac javac /opt/java/current_jdk/bin/javac 1000 # 交互式选择默认版本 sudo update-alternatives --config java更优雅的方案SDKMAN!如果你是服务器的管理员并且需要频繁切换或安装多个版本SDKMAN! 是一个基于bash的工具专为管理多个SDK版本而生支持Java, Groovy, Scala等。它允许你轻松安装、切换、列出和移除版本并且所有版本都安装在用户主目录下互不干扰。只需在用户级别安装和配置即可。5.2 JAR包依赖问题排查“未解析的依赖项”你提供的热词中有一条典型的Maven依赖错误未解析的依赖项: org.springframework.boot:spring-boot-starter-web:jar:2.7.14。这个问题通常不会发生在部署阶段而是发生在项目构建阶段。本地构建时出现这通常意味着你的本地Maven仓库~/.m2/repository缺少这个jar包或者网络问题无法从远程仓库如Maven Central下载。解决方法是检查网络或者尝试手动指定仓库镜像在settings.xml中配置国内镜像如阿里云然后执行mvn clean install -U-U强制更新快照依赖。在服务器上构建时出现如果你在服务器上用Maven编译项目同样需要配置好Maven和网络。对于生产部署更常见的做法是在本地或CI/CD服务器上完成构建生成一个“可执行的JAR包”Executable Jar或“胖JAR包”Fat Jar即包含所有依赖的JAR然后将这个完整的JAR包上传到生产服务器。这样服务器只需要有JRE/JDK来运行它而不需要Maven和网络去解析依赖。Spring Boot的spring-boot-maven-plugin默认就会打包成一个可执行的胖JAR。确保你的pom.xml中正确配置了该插件并运行mvn clean package在target目录下生成的*.jar文件就是可以独立运行的。5.3 端口占用、权限与资源限制端口占用Spring Boot应用默认端口是8080。如果启动失败日志中可能出现“Address already in use”。使用sudo netstat -tlnp | grep :8080查看哪个进程占用了端口然后决定是停止该进程还是修改你应用的端口通过--server.port8081参数或配置文件。文件权限确保运行服务的用户如myapp对JAR包、配置文件、以及应用可能写入的日志目录如/var/log/myapp拥有正确的读写权限。权限不足会导致Permission denied错误。资源限制在systemd的[Service]部分你还可以配置资源限制如LimitNOFILE最大文件打开数这对于高并发应用很重要。如果应用日志中出现“too many open files”就需要调整这个值。5.4 容器化部署的思考热词中提到了docker部署jar包。这确实是现代部署的另一个主流方向。将JAR包和JDK或更小的JRE一起打包进Docker镜像可以实现环境的高度一致性和隔离性。Dockerfile示例# 使用官方的Eclipse Temurin即AdoptiumJDK 11镜像作为基础 FROM eclipse-temurin:11-jre-jammy # 创建一个非root用户 RUN useradd -m -s /bin/bash appuser USER appuser # 设置工作目录 WORKDIR /app # 将构建好的胖JAR包复制到镜像中 COPY --chownappuser:appuser target/myapp-1.0.0.jar app.jar # 暴露应用端口 EXPOSE 8080 # 定义容器启动命令 ENTRYPOINT [java, -jar, app.jar]使用Docker部署你就不再需要在宿主机上手动安装JDK和配置环境变量了。所有的依赖都被封装在镜像里。通过docker run命令或docker-compose编排即可启动服务。这种方式在微服务架构和云原生环境中优势明显。6. 部署后的维护与监控服务跑起来不是终点如何知道它运行得好不好日志监控如前所述journalctl -u myapp.service -f是查看实时日志的最佳工具。对于历史日志可以使用--since--until等参数过滤或者将日志导出到文件。更专业的做法是使用ELKElasticsearch, Logstash, Kibana或LokiGrafana等日志聚合系统。进程与资源监控使用top或htop命令查看进程的CPU和内存占用。使用jpsJDK自带可以列出当前所有Java进程。使用jstack pid可以抓取线程快照用于分析死锁或高CPU问题。健康检查Spring Boot Actuator提供了/actuator/health端点。你可以在Systemd服务配置中结合curl命令编写一个简单的健康检查脚本或者在Docker中配置HEALTHCHECK指令。JVM监控对于更深入的性能分析可以使用jstat查看GC情况jmap导出堆内存快照用于分析内存泄漏。生产环境通常会集成APM工具如Prometheus Grafana通过Micrometer暴露指标或SkyWalking、Pinpoint等。回过头看从安装JDK到部署JAR包每一步的选择都体现了对系统环境、安全规范和可维护性的理解。手动安装JDK并配置系统级环境变量提供了清晰的控制使用Systemd管理服务则赋予了应用以守护进程的可靠性。理解这些步骤背后的“为什么”远比记住命令本身更重要。当遇到问题时从日志、权限、资源、网络这几个维度去排查思路就会清晰很多。最后随着你对部署流程越来越熟悉自然会走向更自动化的CI/CD流水线或者更云原生的容器化部署但这一切的基础仍然是今天所讨论的这些核心概念和实操技能。

相关新闻

AI副驾驶如何赋能产品经理:从需求分析到数据验证的实战指南

AI副驾驶如何赋能产品经理:从需求分析到数据验证的实战指南

1. 从“产品经理”到“产品驾驶员”:为什么我们需要一个副驾驶?最近和几个老朋友吃饭,聊起各自的工作,发现一个挺有意思的现象:无论是大厂还是创业公司的产品经理,大家的口头禅都变成了“太卷了”。这种“卷…

2026/9/27 2:56:37 阅读更多 →
OpenClaw智能体框架实战:从架构解析到Ubuntu部署与飞书集成

OpenClaw智能体框架实战:从架构解析到Ubuntu部署与飞书集成

1. 从“大脑”到“手脚”:为什么我们需要AI智能体 最近几个月,我身边不少搞AI应用开发的朋友,聊天时都绕不开一个词:智能体。大家不再满足于让大语言模型(LLM)当一个只会“动嘴皮子”的聊天机器人&#xf…

2026/9/29 21:24:31 阅读更多 →
构建健壮数据清洗管道:从乱码处理到安全校验的工程实践

构建健壮数据清洗管道:从乱码处理到安全校验的工程实践

在实际开发中,我们经常需要处理各种来源的数据,其中可能包含非预期的字符、格式错误或潜在的注入风险。一个典型的场景是,从用户输入、第三方API或日志文件中获取的原始字符串,可能混杂着特殊符号、乱码、甚至恶意构造的脚本片段。…

2026/9/28 20:34:21 阅读更多 →

最新新闻

硅基流动+Chatbox:零运维AI应用落地方案

硅基流动+Chatbox:零运维AI应用落地方案

简介:本资源是一份面向初级开发者与个人AI实践者的低成本大模型应用搭建指南,聚焦如何利用硅基流动平台的DeepSeek API与开源跨平台AI助手Chatbox,构建稳定、免费且响应流畅的本地化AI应用。方案兼顾经济性与实用性,特别适合个人研…

2026/10/9 3:36:15 阅读更多 →
六合一外挂接口对接实战:47个接口调用规范与避坑指南

六合一外挂接口对接实战:47个接口调用规范与避坑指南

简介:这份《六合一综合平台外挂系统接口使用手册》面向交通管理综合应用平台的对接开发者与系统集成人员,聚焦外挂系统请求服务平台的接口调用规范,帮助读者理解查询类与写入类接口的调用方式、参数含义及 XML 文档格式要求。资源为单个 PDF …

2026/10/9 3:36:15 阅读更多 →
ESP8266心率监测实战:从传感器到KiwisIoT远程监控

ESP8266心率监测实战:从传感器到KiwisIoT远程监控

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 3:36:15 阅读更多 →
OpenCV+Python人脸识别实战:从环境配置到实时检测

OpenCV+Python人脸识别实战:从环境配置到实时检测

上周有个朋友发了一张截图给我,ModuleNotFoundError: No module named cv2,说自己照着网上教程做OpenCV人脸识别,第一步就卡住了。这其实是我见过最高频的问题——教程一上来就让人跑人脸检测,但环境本身就装了十分钟,…

2026/10/9 3:36:15 阅读更多 →
短信发送流程全解析:从接口调用到状态报告,避开五条血泪坑

短信发送流程全解析:从接口调用到状态报告,避开五条血泪坑

简介:这份《短信发送流程学习教案》PPT面向通信工程、网络运维方向的初学者与IT从业者,系统梳理短信在移动网络中的端到端传递机制,帮助读者理解各网元交互逻辑、排查短信收发异常。资源共1个pptx文件,压缩包约158KB,以…

2026/10/9 3:36:15 阅读更多 →
GESP六级动态规划核心:01背包问题从入门到优化

GESP六级动态规划核心:01背包问题从入门到优化

1. 为什么GESP六级绕不开01背包GESP六级的大纲里,动态规划是重头戏,而动态规划的考题里,背包问题出现的频率又出奇地高。我刷过不少往年的六级真题和模拟题,发现一个规律:要么直接考背包模型,要么把背包问题…

2026/10/9 3:35:15 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →