众所周知,我们在面对同一个 SDK 的不同版本时,需要使用到不同的工具来管理,例如:

  • Java:JEnv
  • NodeJs:nvm
  • ...

它们的原理都是基于系统的软连接,让环境变量指向一个软连接来实现切换的效果。那么有没有一个通用的工具,能够管理软连接,从而实现所有 SDK 的切换呢?

有!它就是:

symbolic-link-manager

这个工具专门用于管理软连接,最大程度上进行了抽象,理论上可以管理所有类型的 SDK 版本。

安装

进入 GitHub Releases 中,下载对应系统的可执行文件,然后将其放到任意空文件夹中。

将可执行文件重命名为 slm.exe (Windows) / slm (Linux),之后添加如下环境变量:

SLINK_MANAGER_HOME: 可执行文件所在目录。

使用样例

切换 Java 版本

假设在系统中有两个 Java 版本:

  • C:\Program Files\Java\jdk-17
  • C:\Program Files\Java\jdk8u432-b06

依次使用下列命令来管理这两个版本:

# 声明一个(软)链接,名称为 java
slm add link java # 为链接打标签
slm add tag java 17 "C:\Program Files\Java\jdk-17"
slm add tag java 8 "C:\Program Files\Java\jdk8u432-b06" # 切换版本
slm use java 17

此时将会在 $SLINK_MANAGER_HOME/app/ 目录创建一个名称为 java 的软连接。之后你需要将 JAVA_HOME 的值设置为对应的软连接路径:

  • Windows: %SLINK_MANAGER_HOME%\app\java
  • Linux: $SLINK_MANAGER_HOME/app/java

这里还需确保你已经添加了 %JAVA_HOME%/bin (Windows) / $JAVA_HOME/bin (Linux) 到 Path 中。

仅第一次设置时需要重新打开终端才会生效,之后切换版本时不需要再重新打开。

设置完成后,查看 Java 版本:

当切换 Java 版本后自带切换 Maven 版本

除了单纯的切换某个 SDK 版本外,还支持“连锁切换”。

例如在 Java17 下使用 Maven 3.8.8,在 Java8 下使用 Maven 3.6.3。在切换 Java 版本时能够同时切换 Maven 版本。

Maven 目录:

  • D:\DevelopmentTool\apache-maven-3.6.3
  • D:\DevelopmentTool\apache-maven-3.8.8

管理这两个版本:

# 声明一个(软)链接,名称为 maven
slm add link maven # 为链接打标签
slm add tag maven 3.6 "D:\DevelopmentTool\apache-maven-3.6.3"
slm add tag maven 3.8 "D:\DevelopmentTool\apache-maven-3.8.8" # 和 Java 绑定(Java 的链接需要提前创建)
slm add bind java:17 maven:3.8
slm add bind java:8 maven:3.6 # 先使用一次,不然不会创建软连接
slm use maven 3.6

执行完成后,将环境变量 MAVEN_HOME 设置为 %SLINK_MANAGER_HOME%\app\maven (Windows).

此时完成设置,切换 Java 版本将会跟着切换 Maven 版本:

切换 NodeJs 版本

同样的,你也可以管理 NodeJs 版本,相比与 nvm,主要是少了自动下载功能。

NodeJS 目录:

  • D:\DevelopmentTool\symbolic-link-manager\sdk\nodejs\node-v22.11.0-win-x64
  • D:\DevelopmentTool\symbolic-link-manager\sdk\nodejs\node-v20.18.0-win-x64

    管理这两个版本:
slm add link node

slm add tag node 20 "D:\DevelopmentTool\symbolic-link-manager\sdk\nodejs\node-v20.18.0-win-x64"
slm add tag node 22 "D:\DevelopmentTool\symbolic-link-manager\sdk\nodejs\node-v22.11.0-win-x64" slm use node 20

添加环境变量(Path): %SLINK_MANAGER_HOME%\app\node (Windows).

总结

理论上该工具支持所有 SDK,原理我们在前面也已经说过了,就是一个软连接管理工具,欢迎大家使用,提意见!

一个工具管理你的所有 SDK 版本!的更多相关文章

  1. 版本工具管理之----git

    如何查看隐藏文件夹: 如果你看不到.git目录,你需要让隐藏的文件可见.具体做法就是打开一个Terminal窗口,输入以下命令: defaults write com.apple.finder App ...

  2. npm 是node.js下带的一个包管理工具

    npm 是node.js下带的一个包管理工具          npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...

  3. 找了一个api管理工具

    找了一个工具,https://github.com/nutsteam/apiManager选择了如下方式,进行了安装. ● 下载https://git.oschina.net/zhoujingjie/ ...

  4. ubuntu问题: 同时只能有一个软件管理工具在运行

    或者是: 只能同时运行一个更新管理器 打开终端输入命令:sudo dpkg –configure -a 运行,系统问题就解决了

  5. 使用 Xcode 和 Android Studio 管理 iOS 和 Android 项目版本

    在移动应用开发和运营的过程中,版本管理是一个老生常谈的基础问题,一些版本的基本概念也常常会困扰我们的研发和运营人员.同时,手动管理软件版本,也常常会因为不小心导致后续的发布和更新问题. 这里,我准备了 ...

  6. 写markdown博客如何截图并快速上传到图床——记一个工具插件的实现

    1. 背景 写博客有一个自己的图床是不错的选择,如果不借助工具,在markdown博客中添加图片的步骤如下: 截取图片,保存到本地(得来回点对话框,选择保存路径,选择文件类型,输入文件名). 上传到图 ...

  7. 代码管理工具:使用github和git工具管理自己的代码

    一.git工具和账户创建 1.1 安装 Git 是 Linus Torvalds 最近实现的源代码管理软件."Git 是一个快速.可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系 ...

  8. 写markdown博客如何将截图快速上传到图床——记一个工具插件的实现(windows版 开源)

    打造一个上传图片到图床利器的插件(Mac版 开源)(2018-06-24 19:44) 更新于2018年2月 做了以下改动: 1.修复了一个bug,把服务器区域做成可配: 七牛有华北,华东,华南以及美 ...

  9. Android开发工具Android Studio、Android SDK和Genymotion完全配置

    所谓“工欲善其事,必先利其器”.Android Studio 是谷歌推出一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提 ...

  10. 使用Git版本控制工具管理GitHub

      使用Git版本控制工具管理GitHu Git是一个分步式的管理系统:只要上传操作得当,所有的都可以相当于是中央服务器,成员代码共享,A写的代码B也有,一般把一个人当做主机,其他人通过该主机拼装代码 ...

随机推荐

  1. SpringSecurity5(14-Gateway整合)

    MVC 与 WebFlux 关系 SpringSecurity 设置要采用响应式配置,基于 WebFlux 中 WebFilter 实现,与 Spring MVC 的 Security 是通过 Ser ...

  2. ubantu&windows搭建gis开发环境(qt+osg+osgearth+osgqt)

    一.ubantu22.04中搭建地图开发环境(qt5.15.2 + osg3.7.0 + osgearth3.7.1 + osgqt) (1)下载安装qt5.15.2 : (2)下载编译安装osg3. ...

  3. RL · Exploration | 使用时序距离构造 intrinsic reward,鼓励 agent 探索

    论文标题:Episodic Novelty Through Temporal Distance. ICLR 2025,8 8 6 5 poster. arxiv:https://arxiv.org/a ...

  4. AbstractAutoProxyCreator#postProcessBeforeInstantiation

    一.定义 postProcessBeforeInstantiation 是 Spring AOP 动态代理的核心扩展点,通过提前创建代理对象优化性能,并支持丰富的自定义逻辑(如事务.安全) 二.代码分 ...

  5. 在MaxKB中实现准确的Chat TO SQL(BI)

    主要面向考试成绩管理系统(目前支持旭日图.仪表盘柱状图.桑基图.漏斗图.河流图.数据聚合图.散点图.南丁格尔玫瑰图.饼状图.环形图.堆叠柱状图.堆叠折线图.堆叠面积图.面积图.折线图) 主要思路: 第 ...

  6. 关于Cesium渲染PrimitiveCollection和图层的树状管理的问题

    原文:关于Cesium渲染PrimitiveCollection和图层的树状管理的问题 - 搜栈网 (seekstack.cn)

  7. 【doctrine/orm】findBy用法

    用法: //$condition array('表字段对应的entity的属性'=>'值') //$orderBy array('表字段'=>'ASC/DESC') //$count in ...

  8. AspNetCore 请求产生 FreeSql 所有操作 SQL 日志输出到前端

    第一步:定义注入类型 public class CurdAfterLog : IDisposable { public static AsyncLocal<CurdAfterLog> Cu ...

  9. 在AI大爆发的背景下,企业管理软件有什么冲击

    今天与同行开会提到在AI大爆发的背景下,未来企业管理软件究竟有什么冲击? 我和同事对此问题进行了探讨,一些拙见,与大家分享.先直接说观点:在未来的5到10年,制造业的管理软件市场将几乎消失.下面我来聊 ...

  10. CTF_RSA解密学习

    CTF_RSA解密学习 00X00 .先看了一边李永乐老师的视频 https://www.bilibili.com/video/av26639065/ 00X01.对称.非对称算法了解 对称算法,加解 ...