Creating a portable JDK with PowerShell

March 2, 2015

At times, I’ve found myself wanting to have a specific JDK available without installing another version of Java. Past reasons include wanting to test multiple Java versions on the same system or needing to use a Java tool (ex. JConsole) without installing additional software.

With a small PowerShell script and 7-Zip installed*, you can easily create a stand-alone JDK from a JDK installer.

param
  (
      [string] $jdkPath = $(throw "-jdkPath is required."),
      [string] $outputPath = $(throw "-outputPath is required.")
  )
  if (Test-Path "$env:ProgramFiles\7-Zip\7z.exe")
  {
      set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"
  }
  else
  {
      throw "$env:ProgramFiles\7-Zip\7z.exe needed"
  }
  function Extract-File($file, $destination)
  {
      sz x "$file" "-o$destination" -y
  }
  function Unpack($directory)
  {
      $files = Get-ChildItem $directory -recurse -filter "*.pack"
      foreach ($file in $files)
      {
          $oldFile = $file.fullname
          $newFile = $oldFile.substring(0, $oldFile.length - 5) + ".jar"
          
          Write-Host "Unpacking $newFile"
          Start-Process "$directory\bin\unpack200" "$oldFile $newFile" -NoNewWindow -Wait
      }
  }
  function Print-Version($directory)
  {
      Start-Process "$directory\bin\java.exe" "-version" -NoNewWindow -Wait
  }
  $toolsZip = Join-Path -path $outputPath -childPath 'tools.zip'
  Extract-File -file $jdkPath -destination $outputPath
  Extract-File -file $toolsZip -destination $outputPath
  Unpack -directory $outputPath
  Remove-Item $toolsZip
  Print-Version $outputPath

This script has been tested with Java 1.7 and 1.8 JDK installers.

  • – The implementation assumes that 7-zip is available (to enable extraction of the Java binaries from the JDK installer).

Build awesome things for fun.

Check out our current openings for your chance to make awesome things with creative, curious people.

Explore SEP Careers »

You Might Also Like