Featured image of post Linux 开发环境搭建:JDK 8 / Maven 3.9 / NVM 与 Node 多版本管理

Linux 开发环境搭建:JDK 8 / Maven 3.9 / NVM 与 Node 多版本管理

2022 视角下的 Linux 后端/前端开发环境——JDK 8u371 安装与 JAVA_HOME、Maven 3.9.3 仓库与 settings.xml、NVM 0.39.3 装 Node 14 多版本、npm/yarn 镜像配置、Node 多版本共存与 PATH 切换、systemd 启动 Java 服务

一、为什么是 2022 年这一份

2022 年这个时间点,Linux 后端/前端开发环境进入"标准化"阶段:

  • JDK 8 仍是企业主流(Spring Boot 2.x、Solr、大数据生态全靠它)
  • JDK 17 在 2021-09 发布后逐步成新项目首选
  • Maven 3.9(2023-01 发布)已经稳定,3.8 系列成为过去
  • NVM 0.39.x(2021-2022 系列)稳定,Node 14/16/18 三版本并行
  • npm 镜像 经历 npm.taobao.org → npmmirror.com 的迁移(2022-05)
  • systemd 全面接管 Java 服务启动

这一篇覆盖 JDK 8 / Maven / NVM 三大主力工具的安装、镜像、版本管理、与 systemd 集成——后端/前端开发者的"装机手册"。

阅读建议:本文是"工具栈"性质——按"装什么 → 配什么 → 用什么"组织。

二、JDK 8 安装(2022 仍主流)

2.1 下载与解压

1
2
3
4
5
6
7
# 下载 jdk-8u371-linux-x64.tar.gz
cd /usr/local
mkdir jdk
cd jdk
tar -xf jdk-8u371-linux-x64.tar.gz

# 解压到 /usr/local/jdk/jdk1.8.0_371

关于 8u371:Oracle JDK 8u371 是 2023-04 发布的。如果坚持 2022 时间线,可以选 8u341(2022-04)或 8u351(2022-10)。

2.2 环境变量

1
vim /etc/profile
1
2
3
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_371
export CLASSPATH=$JAVA_HOME/bin:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=.:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
1
source /etc/profile

2.3 验证

1
2
3
4
java -version
# java version "1.8.0_371"
# Java(TM) SE Runtime Environment (build 1.8.0_371-b11)
# Java HotSpot(TM) 64-Bit Server VM (build 25.371-b11, mixed mode)

三、Maven 3.9 安装

3.1 下载与解压

1
2
3
4
5
6
7
8
cd /usr/local/maven

# 3.9.2(2023-01 发布的 3.9.2 仍是很多 CI 的稳定选择)
wget https://archive.apache.org/dist/maven/maven-3/3.9.2/binaries/apache-maven-3.9.2-bin.tar.gz
tar -xf apache-maven-3.9.2-bin.tar.gz

# 改名
mv apache-maven-3.9.2 apache-maven-3.9.2

3.2 更换 settings.xml

把默认的 conf/settings.xml 替换成公司/个人定制的(国内镜像、代理、私服等)。

1
2
3
4
5
6
# 备份
cp /usr/local/maven/apache-maven-3.9.2/conf/settings.xml \
   /usr/local/maven/apache-maven-3.9.2/conf/settings.xml.bak

# 替换
vim /usr/local/maven/apache-maven-3.9.2/conf/settings.xml

3.3 环境变量

1
vim /etc/profile
1
2
export MAVEN_HOME=/usr/local/maven/apache-maven-3.9.2
export PATH=$MAVEN_HOME/bin:$PATH
1
source /etc/profile

3.4 验证

1
2
3
4
5
6
mvn -v
# Apache Maven 3.9.2 (21122926829f1ead511c958d89bd2f672198ae9f)
# Maven home: /usr/local/maven/apache-maven-3.9.2
# Java version: 1.8.0_371, vendor: Oracle Corporation, runtime: /usr/local/jdk/jdk1.8.0_371/jre
# Default locale: en_US, platform encoding: UTF-8
# OS name: "linux", version: "5.19.0-46-generic", arch: "amd64", family: "linux"

四、NVM 装 Node 多版本

4.1 下载 NVM 0.39.3

1
wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.3.tar.gz

4.2 安装

1
2
3
4
cd ~
mkdir .nvm
tar -zxvf v0.39.3.tar.gz --strip-components 1 -C /root/.nvm
rm -rf v0.39.3.tar.gz

4.3 环境变量

1
vim /etc/profile
1
2
3
4
export NVM_BIN="/root/.nvm/versions/node"
export NVM_DIR="/root/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
1
2
3
4
source /etc/profile
source ~/.zshrc

nvm --version

4.4 设置镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Windows
nvm node_mirror https://npm.taobao.org/mirrors/node/
nvm npm_mirror https://npm.taobao.org/mirrors/npm/

# 2023-07-19 之后:原 taobao.org 改为 npmmirror.com
nvm node_mirror https://npmmirror.com/mirrors/node/
nvm npm_mirror https://npmmirror.com/mirrors/npm/

# Linux 改环境变量
vim /etc/profile
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node/

# 测试
curl $NVM_NODEJS_ORG_MIRROR

关于 npm 镜像迁移:2022-05-31 之后 npm.taobao.org 域名失效,全部迁移到 npmmirror.com。新项目必须用新域名

4.5 装 Node 14

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 查可用版本
nvm ls-remote

# 装 Node 14.21.3
nvm install v14.21.3

# 验证
whereis node
# node: /root/.nvm/versions/node/v14.21.3/bin/node

node -v
# v14.21.3

npm -v
# 6.14.18

4.6 多版本共存

1
2
3
4
5
6
7
8
9
# 装第二个版本
nvm install v14.17.3

# 切换
nvm use v14.21.3

# 把 nvm 整体迁移到数据盘
mv /root/.nvm /data/jenkins/
# 改 NVM_DIR 路径

4.7 npm 镜像与 yarn

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 设 sass 镜像
npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass

# 设 registry 镜像
npm config set registry https://registry.npmmirror.com

# 装 nrm(registry 切换器)
npm install -g nrm
nrm ls
nrm use taobao

# 装 yarn
npm i -g yarn
yarn -v
# 1.22.19

# 临时使用镜像
SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass npm install node-sass

五、zsh 下 Node 多版本切换

1
2
3
4
vim ~/.zshrc

export NODE_HOME=/data/jenkins/.nvm/versions/node/v14.17.3
export PATH=$NODE_HOME/bin:$PATH

六、Jenkins 跑前端项目

1
2
3
4
5
6
7
8
9
killall -9 node_modules || true
source /etc/profile
cd /home/docker/jenkins/workspace/safe-frontend-dev
rm -rf node_modules
npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass
npm config set registry https://registry.npm.taobao.org/
npm -g i yarn
yarn
nohup yarn run serve > /dev/null 2>&1 &

七、用 systemd 启动 Java 微服务

7.1 准备启动脚本

1
2
# 写微服务启动脚本
vim /home/project/safety/sh/gateway.sh
1
2
3
4
5
6
7
#!/bin/bash
# gateway.sh 示例
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_371
export PATH=$JAVA_HOME/bin:$PATH

cd /home/project/safety
java -jar gateway.jar --spring.profiles.active=prod
1
chmod +x /home/project/safety/sh/gateway.sh

7.2 写 service 文件

1
vim /etc/systemd/system/gateway.service
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description=Gateway Service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/home/project/safety/sh/gateway.sh
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

7.3 启动与管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
systemctl daemon-reload

# 启动
systemctl start gateway

# 开机启动
systemctl enable gateway

# 状态
systemctl status gateway

# 停止
systemctl stop gateway

# 失败重置
systemctl reset-failed gateway

# 卸载
rm -rf /etc/systemd/system/gateway.service

八、Java 反代启动命令

1
2
3
4
5
# 远程调试
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5003 \
     -Xverify:none \
     -cp /jar/xjrsoft-base/lib/*:/jar/xjrsoft-base/config \
     com.xjrsoft.BaseApplication

关于 jdwp 端口:调试端口要开放给开发机,不能开放在公网。生产环境记得移除 jdwp 参数

九、envsubst 模板化配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 模板 t.yaml
cat << "EOF" > t.yaml
systeminfo:
  OS: $OS
  user: $USER
  home: $HOME
  args:
    [
      "$args"
    ]
EOF

# 脚本 t.sh
cat << "EOF" > t.sh
#!/usr/bin/env bash
export OS=$(uname -s)
export args="/wait.sh 10.8.33.127:8848 -t 0"
ports=(100 200 300)
nodePort=30000
for p in ${ports[*]}; do
  nodePort=$[$nodePort+1]
  sed -i "8a \    - name: port$p\n      port: $p\n      targetPort: $p\n      nodePort: $nodePort" t.yaml
done
envsubst < t.yaml > t1.yaml
EOF

bash t.sh

场景:用一份模板 + 环境变量生成 K8s manifest / docker-compose / nginx 配置。

十、前置知识 / 下一步

  • 想看 JDK 17/21 新特性 → 翻本系列《JDK 升级与新特性》
  • 想看 Maven 私服(Nexus / Artifactory)→ 翻本系列《Maven 私服搭建》
  • 想看 Node 微前端构建优化 → 翻独立文章
  • 想看 systemd 高级用法(target、socket 激活)→ 翻本系列《Linux 监控与系统性能工具》

十一、参考资源


2024 视角:JDK 21 LTS 已经发布,Node 20/22 时代来了

2022 年写的那套"JDK 8 + Maven 3.9 + NVM + Node 14"在 2024 仍然可用,但新项目已经普遍升级

一、JDK:JDK 17 已是新项目主流,JDK 21 LTS 已发布

  • JDK 21 LTS(2023-09 发布)是 2024 新项目首选——虚拟线程(Virtual Threads)正式 GA

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    // 虚拟线程写法(替代传统 Thread / ExecutorService)
    try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
        IntStream.range(0, 10_000).forEach(i -> {
            executor.submit(() -> {
                Thread.sleep(Duration.ofSeconds(1));
                return i;
            });
        });
    }
    
  • JDK 17 LTS(2021-09 发布)仍是 2024 大量"半新"项目的目标版本。

  • JDK 8(2014)已 2022-03 进入"个人免费但商业收费"模式(Oracle),2024 新项目不应该用 Oracle JDK 8——改用:

    • Adoptium Eclipse Temurin 8(免费、长期维护)
    • Amazon Corretto 8(AWS 维护)
    • Alibaba Dragonwell 8(国内阿里维护,对 JVM 调优有特化)
  • 装新版:

    1
    2
    3
    4
    5
    
    # Adoptium Temurin 21 (推荐)
    apt install -y wget gnupg
    wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor -o /usr/share/keyrings/adoptium.gpg
    echo "deb [signed-by=/usr/share/keyrings/adoptium.gpg] https://packages.adoptium.net/artifactory/deb $(lsb_release -sc) main" > /etc/apt/sources.list.d/adoptium.list
    apt update && apt install -y temurin-21-jdk
    

二、Maven 3.9 仍主流,但 Gradle 在 K8s / 云原生时代更受宠

  • Maven 3.9.6(2024-02 发布)是 2024 的稳定版,mvn -v 默认输出包含 Java version: 21.x
  • Gradle 8.x(2023-10 起)支持 Java 21 + Kotlin 2.0,新项目可以选 Gradle
  • Bazel(Google)和 Pants(Twitter)是更大规模 monorepo 项目的选择,但 2024 仍小众。

三、Node 20 LTS / 22 LTS 时代

  • Node 18(2022 LTS)2025-04 EOL,Node 20 LTS(2023-04)是 2024 主流,Node 22 LTS(2024-10 发布)开始被新项目采用。
  • NVM 0.39.7+ 仍是主流(但 2024 出现了 fnm 替代品,用 Rust 写、速度快 10 倍)。
  • Node 22 内置 --experimental-strip-types(原生运行 TypeScript,无需 ts-node 编译)。
1
2
3
4
5
# 2024 推荐:用 fnm 替代 nvm
curl -fsSL https://fnm.vercel.app/install | bash
fnm install 22
fnm use 22
node -v  # v22.x.x

四、cn 镜像的变化

  • registry.npmmirror.com 仍是 2024 首选 npm 镜像。

  • 新增 https://registry.npmmirror.com/-/binary/ 提供 Node 二进制镜像(替代 taobao 老的 npm.taobao.org/dist/)。

  • corepack(Node 16+ 内置)一站式管理 yarn / pnpm:

    1
    2
    
    corepack enable
    corepack prepare yarn@stable --activate
    

五、systemd 启动 Java 服务的"v2 写法"

  • 2024 推荐加 cgroup v2 资源限制 + 安全沙箱
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[Service]
Type=simple
User=appuser
ExecStart=/usr/local/jdk/bin/java -jar /opt/app.jar
Restart=always
RestartSec=10
# 资源限制
CPUQuota=200%
MemoryMax=2G
MemoryHigh=1G
# 安全加固
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
# 现代化:动态用户
DynamicUser=yes
# 日志
StandardOutput=journal
StandardError=journal

六、容器化时代的开发环境

2024 大量新项目**不再用"装在系统里的 JDK"**这套——直接走容器:

1
2
3
4
5
# 用容器跑 Maven 构建(避免污染系统)
docker run -it --rm \
    -v $PWD:/app -w /app \
    maven:3.9-eclipse-temurin-21 \
    mvn clean package

容器化开发环境的优势

  • JDK 版本随项目走(不用每台机器装多个版本)
  • 团队所有人 build 出来的产物一致
  • CI/CD 用同一镜像

Dev Container(VS Code Remote Containers)+ GitHub Codespaces 是 2024 的"标准动作"——开发机里根本不装 JDK,全在容器里。

使用 Hugo 构建
主题 StackJimmy 设计