Install and invoke SDKMAN!

0.2.0

The utility methods for installing and invoking SDKMAN! are available in cli-assured-sdkman artifact:

<dependency>
  <groupId>org.cli-assured</groupId>
  <artifactId>cli-assured-sdkman</artifactId>
  <version><!-- Use the latest --></version>
</dependency>

Find the latest version on Maven Central.

Install SDKMAN! or assert it is installed

0.2.0

To obtain an instance of org.cliassured.sdkman.Sdk representing the sdk command, you need to install SDKMAN! first or at least assert that it is installed.

If you are fine with default SDKMAN! installation directory (~/.sdkman) and default URL of the SDKMAN! installation script (https://get.sdkman.io?rcupdate=false), you may use any of the following methods for that:

  • Sdkman.install() - install SDKMAN!

  • Sdkman.installIfNeeded() - install SDKMAN! unless it is installed

  • Sdkman.assertInstalled() - assert SDKMAN! is installed

All of the above methods return an instance of org.cliassured.sdkman.InstalledSdkman

Install SDKMAN! to a custom directory

0.2.0

If you prefer not to interfere with the default local installation of SDKMAN! in ~/.sdkman, you may want to install it into a custom directory.

import java.nio.file.Path;
import java.nio.file.Paths;
import org.cliassured.sdkman.Sdkman;

Path customHome = Paths.get("target/sdkman").toAbsolutePath().normalize();
// Install SDKMAN! to customHome
Sdkman.home(customHome)
    // Install SDKMAN! if needed
    .installIfNeeded()
    // Get the sdk command
    .sdk()
    // Call `sdk version`
    .args("version")
    .then()
        .stdout()
            .log()
            .hasLinesContaining(
                    "SDKMAN!",
                    "script:",
                    "native:")
    .execute()
    .assertSuccess();

Install SDKMAN! using custom installation script

0.2.0

If you prefer to install SDKMAN! in a special way, be it by adding or removing URL parameters from the default URL https://get.sdkman.io?rcupdate=false or by serving your own script, you can use Sdkman.installationScriptUrl(String) or SdkmanSpec.installationScriptUrl(String):

import java.nio.file.Path;
import java.nio.file.Paths;
import org.cliassured.sdkman.Sdkman;

// Install SDKMAN! using a custom local script
Path customInstallationScript = Paths.get("target/test-classes/custom-get-sdkman.sh").toAbsolutePath().normalize();
Sdkman.installationScriptUrl(customInstallationScript.toUri().toString())
    // Install SDKMAN! if needed
    .installIfNeeded()
    // Get the sdk command
    .sdk()
    // Call `sdk version`
    .args("version")
    .then()
        .stdout()
            .log()
            .hasLines("Custom SDKMAN! version 1.2.3")
    .execute()
    .assertSuccess();

Install a candidate and call its commands

0.2.0

Use Sdk.installCandidateIfNeeded(String candidate, String version) to install any SDKMAN!-managed tool (such as maven, java, gradle, etc.) at a specific version. The method returns an InstalledCandidate that provides access to the candidate’s commands in its bin directory.

import org.cliassured.sdkman.InstalledCandidate;
import org.cliassured.sdkman.Sdkman;

// Install a specific version of a candidate
InstalledCandidate maven_3_9_11 = Sdkman
    // Install SDKMAN! if needed
    .installIfNeeded()
    // calls `sdk install maven 3.9.11`
    .sdk().installCandidateIfNeeded("maven", "3.9.11");

// Invoke the mvn binary from the installed candidate's bin folder
maven_3_9_11
    .bin("mvn") // You may need to use "mvn.cmd" on Windows
    .args("--version")
    .stderrToStdout()
    .then()
        .stdout()
            .hasLines("Apache Maven 3.9.11 (3e54c93a704957b63ee3494413a2b544fd3d825b)")
    .execute()
    .assertSuccess();

Run sdk commands

0.2.0

Use Sdk.args(String...) to run arbitrary sdk subcommands, such as version, list, uninstall, upgrade, etc. Sdk.args(String...) returns a CommandSpec, so the rest is standard CLI Assured code.

import java.nio.file.Path;
import java.nio.file.Paths;
import org.cliassured.sdkman.Sdkman;

Sdkman
    // Install SDKMAN! if needed
    .installIfNeeded()
    // Get the sdk command
    .sdk()
    // Call `sdk version`
    .args("version")
    .then()
        .stdout()
            .log()
            .hasLinesContaining(
                    "SDKMAN!",
                    "script:",
                    "native:")
    .execute()
    .assertSuccess();