如何在Ubuntu上永久设置sdkman和通过sdkman安装的JDK路径

3
我按照https://sdkman.io/install的说明安装了sdkman,安装完成后一切都正常。我可以使用sdk version查看正确的版本,也可以安装各种Java版本。但是这些只能在当前shell会话中使用。一旦我关闭并打开新的shell会话,就无法获取sdkman或已安装的JDK。我可以在~/.sdkman/candidates/java中查看所有JDK。我必须始终运行source "$HOME/.sdkman/bin/sdkman-init.sh"来使用sdkman和JDK。
如何将sdkman以及JDK设置为系统永久性呢?
2个回答

3
当您运行sdkman时,它会打印一些指令,告诉您将一些行添加到您的shell rc文件中,以便在所有shell中启用它。
例如,我在我的~/.zshrc(可能与bash不同)末尾加上了这个。
export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

2
以上内容与我的工作目录下的 ~/.bashrc 文件相同。 - Nigel Savage
将上述内容粘贴到我的树莓派的~/.profile中,它就可以工作了。 - Praveen E

-1

我为此编写了一个Python程序。它将打印出需要运行的命令,以将您的本地JDK指向未分类供应商,但允许您重用通常位于/Users/{username}/Library/Java/JavaVirtualMachines目录中的JDK,这在安装SDKMan之前可能是情况。

在按照下面图像所示的方式运行程序后,您的本地JDK将与SDKMan链接。

"""
What this program does? Links locally available java directories inside /Users/{username}/Library/Java/JavaVirtualMachines directory to sdkman local installations.
https://i.imgur.com/NaSXX99.png
"""


import os
import subprocess
import getpass

def nameValidation(i):
    j = ''
    if len(i) > 15:
            shortName = i.split('-')
            # print(f'{shortName[0]} : {shortName}')
            if(shortName[0] == 'corretto'):
                shortName[0] = 'amzn'
            elif shortName[0] == 'temurin':
                shortName[0] = 'tem'
            elif shortName[0] == 'gluon':
                shortName[0] = 'gln'
            elif shortName[0] == 'graalvm':
                shortName[0] = 'grl'
            elif shortName[0] == 'java.net':
                shortName[0] = 'open'
            elif shortName[0] == 'liberica':
                shortName[0] = 'librca'
            elif shortName[0] == 'libericanik':
                shortName[0] = 'nik'
            elif shortName[0] == 'microsoft':
                shortName[0] = 'ms'
            elif shortName[0] == 'oracle':
                shortName[0] = 'oracle'
            elif shortName[0] == 'sapmachine':
                shortName[0] = 'sapmchn'
            elif shortName[0] == 'semeru':
                shortName[0] = 'sem'
            elif shortName[0] == 'zulu':
                shortName[0] = 'zulu'
            j = f'{shortName[1]}-{shortName[0]}'
            return j
    else:
        return i
        
    


def printCommandsToLinkJDKWithSDKMan(jdkList,baseDirectoryAddress):
    listToReturn = []
    for i in jdkList:
        name = nameValidation(i)
        listToReturn.append(f'sdk install java {name} {baseDirectoryAddress}/{i}')
        # print(f'Adding: {listToReturn[-1]}')
    return listToReturn

def runCommand (command):
    output=subprocess.run(
        command,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,shell=True)

    if output.returncode != 0:
        raise RuntimeError(
            output.stderr.decode("utf-8"))

    return output

username = getpass.getuser()
chd = f"/Users/{username}/Library/Java/JavaVirtualMachines" # add the absolute path where your JDKs are present here

os.chdir(chd) # Change to parent directory where all your JDKs are present to extract names of JDK in a list
# 
allInstalledExternalJavaJDKs = [name for name in os.listdir(".") if os.path.isdir(name)]
# print(allInstalledExternalJavaJDKs) # prints list of directories of all installed JDKs

outputList = printCommandsToLinkJDKWithSDKMan(allInstalledExternalJavaJDKs,chd) # send the list to method
print('Commands to run to link local JDKs: \n\n')
for cmd in outputList:
    print(cmd)

Output

Command Printed for all local JDKs to link to SDKman


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接