はじめに
MacやLinuxでJavaの開発をしている人ならば、SDKMAN!を利用している人が多いと思う。SDKMAN!を使うと、JDKのディストリビューションやバージョン、さらにGradleなどの開発ツールのバージョンを簡単に切り替えられる。ただし、Windowsでは標準のSDKMAN!をそのままPowerShellで使うことはできず、一般的にはWSLを利用することになる。そこで今回は、PowerShell向けに利用できるPosh-SDKManを使って、PowerShell上でSDKMAN!のような操作を行う方法を試してみる。
環境
- Windows 11
- PowerShell 5.1
Posh-SDKManのインストール
Posh-SDKManのREADMEにあるように、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のExecutionPolicyがAllSigned、もしくは、CurrentUserのExecutionPolicyがUndefinedかつLocalMachineのExecutionPolicyがAllSignedだった場合に、未署名のスクリプトは実行できないようだ。
Get-ExecutionPolicy -List
出力例:
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine AllSigned
解決策として、今回はCurrentUserのExecutionPolicyをRemoteSignedにする。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は十分試す価値のある選択肢だと思う。
コメント