はじめに

MacやLinuxでJavaの開発をしている人ならば、SDKMAN!を利用している人が多いと思う。SDKMAN!を使うと、JDKのディストリビューションやバージョン、さらにGradleなどの開発ツールのバージョンを簡単に切り替えられる。ただし、Windowsでは標準のSDKMAN!をそのままPowerShellで使うことはできず、一般的にはWSLを利用することになる。そこで今回は、PowerShell向けに利用できるPosh-SDKManを使って、PowerShell上でSDKMAN!のような操作を行う方法を試してみる。

環境

  • Windows 11
  • PowerShell 5.1

Posh-SDKManのインストール

Posh-SDKManREADMEにあるように、Install-Moduleコマンドでインストールした。READMEのコマンドをそのまま実行すると、管理者権限が必要になるため、以下のように-Scope CurrentUserを付けている。

Install-Module -Name Posh-SDKMan -Scope CurrentUser

NuGetがない場合、以下確認がでるため、エンターを押し、NuGetをインストールする。

続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\<ユーザー名>\AppData\Local\PackageManagement\ProviderAssemblies' に配置する必要があります。'Install-PackageProvider
-Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet プロバイダーをインストールすることもできます。今すぐ
PowerShellGet で NuGet プロバイダーをインストールしてインポートしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y

PSGalleryを初めて利用する環境では、PSGalleryが信頼されていないリポジトリとして設定されているため、以下警告が出ると思う。Yを入力後、エンターを押し、Posh-SDKManをインストールする。

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y

Posh-SDKManのインポート

PowerShell上でImport-Moduleを実行することで、Posh-SDKManを使えるようになる。ただし、自分の環境では、以下のエラーが出て、インポートできなかった。

Import-Module : ファイル C:\Users\<ユーザー名>\Documents\WindowsPowerShell\Modules\Posh-SDKMan\2.0.0\Posh-SDKMan.psm1 を読み込
めません。ファイル C:\Users\<ユーザー名>\Documents\WindowsPowerShell\Modules\Posh-SDKMan\2.0.0\Posh-SDKMan.psm1 はデジタル署名
されていません。このスクリプトは現在のシステムでは実行できません。スクリプトの実行および実行ポリシーの設定の詳細につい
ては、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ Import-Module Posh-SDKMan
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) [Import-Module]、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess,Microsoft.PowerShell.Commands.ImportModuleCommand

これは、読み込もうとしているPosh-SDKMan.psm1にデジタル署名がされておらず、PowerShellの実行ポリシーで、未署名のスクリプト実行が禁止されているためのようだ。

Posh-SDKMan.psm1のデジタル署名確認は以下コマンド。Posh-SDKMan.psm1のStatusがNotSignedであることが分かる。

Get-AuthenticodeSignature "$env:USERPROFILE\Documents\WindowsPowerShell\Modules\Posh-SDKMan\2.0.0\Posh-SDKMan.psm1"

出力例:

    ディレクトリ: C:\Users\<ユーザー名>\Documents\WindowsPowerShell\Modules\Posh-SDKMan\2.0.0


SignerCertificate                         Status                                 Path
-----------------                         ------                                 ----
                                          NotSigned                              Posh-SDKMan.psm1

自身のPowerShellの実行ポリシー確認は以下コマンド。CurrentUserのExecutionPolicyAllSigned、もしくは、CurrentUserのExecutionPolicyUndefinedかつLocalMachineのExecutionPolicyAllSignedだった場合に、未署名のスクリプトは実行できないようだ。

Get-ExecutionPolicy -List

出力例:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       AllSigned

解決策として、今回はCurrentUserのExecutionPolicyRemoteSignedにする。CurrentUserスコープのみ変更しているため、影響は現在のユーザーに限定される。

# CurrentUserのExecutionPolicyをRemoteSignedにする
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# CurrentUserのExecutionPolicyがRemoteSignedになったことを確認する
Get-ExecutionPolicy -List

この状態で、Import-Moduleを実行し、Posh-SDKManを使えるようにする。

Import-Module Posh-SDKMan
# Posh-SDKManがインポートされていることを確認する
Get-Module Posh-SDKMan
# Posh-SDKManが動くか確認
sdk help

Import-Moduleは現在のPowerShellセッションでのみ有効で、新しくPowerShellを立ち上げると、Import-Module実行前の環境に戻る。常にPosh-SDKManを使いたい場合は、PowerShellのプロファイルにImport-Module Posh-SDKManを追記する必要がある。

Posh-SDKManの利用

裏側ではSDKMAN!のAPIを叩いており、使い方は基本的にSDKMAN!と同じである。公式のドキュメントを参考にする。

今回、javaをインストールしてみる。

# 今使用しているjavaのバージョンを表示
java -version
# インストールできるjavaの一覧を表示する
sdk list java
# 今使っているJavaとは違うバージョンをインストールしてみる。
sdk install java 26-tem
# インストールしたjavaに切り替える
sdk use java 26-tem
# Posh-SDKManでインストールした、javaになっていることを確認
java -version

インストールされたjavaはデフォルトでは%USERPROFILE%\.posh_sdk\javaに置かれる。

Posh-SDKManのアンインストール

以下コマンドでPosh-SDKManをアンインストールできる。

# 今のセッション上でインポートしていない場合は、Remove-Moduleしなくてもいい
Remove-Module Posh-SDKMan
# Posh-SDKManをアンインストール
Uninstall-Module -Name Posh-SDKMan
# Posh-SDKManモジュールが見つからなければアンインストール完了
Get-InstalledModule -Name Posh-SDKMan

Posh-SDKManでインストールしたJava等を消したい場合は、%USERPROFILE%\.posh_sdkフォルダを削除する。

また、CurrentUserの元々の実行ポリシーがUndefinedで、戻したい場合は、以下コマンドも実行する。

# CurrentUserのExecutionPolicyがRemoteSignedであることを確認する
Get-ExecutionPolicy -List
# CurrentUserのExecutionPolicyをUndefinedにする
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
# CurrentUserのExecutionPolicyがUndefinedになったことを確認する
Get-ExecutionPolicy -List

おわりに

今回は、WindowsのPowerShell上でSDKMAN!のような操作を行うために、Posh-SDKManを試してみた。標準のSDKMAN!はそのままではPowerShellで使えないが、Posh-SDKManを利用することで、JDKやGradleなどのバージョン切り替えをPowerShell上で行えることが分かった。

WSLを使わずにPowerShell上で完結させたい場合には、Posh-SDKManは十分試す価値のある選択肢だと思う。