Java Jar Class File Version ermitteln

Wenn man die Class-File-Version eines Jars herausfinden möchte, kann man das Jar entpacken und mit javap eine beliebige *.class-Datei aus dem entpackten Jar untersuchen. Um diesen Prozess zu beschleunigen, habe ich ein kleines Powershell-Skript geschrieben. Es funktioniert entweder mit der Windows-Powershell als auch mit der neuen Powershell-Core. Natürlich muss auch ein JDK installiert sein. Es werden alle Jars im aktuellen Verzeichnis untersucht.

# Dieses Skript muss in das Verzeichnis mit den Jars, die untersucht
# werden sollen, hineinkopiert werden oder im Pfad verfügbar sein.
# Die gefundenen Jars werden nacheinander in ein Temp-Verzeichnis 
# entpackt und die erste gefundene *.class-Datei
# wird mit javap auf ihre Version überprüft.

# Hier steht der Name des Temp-Verzeichnisses, 
# in das die Jars nacheinander entpackt werden
$NAME_OF_TEMP_DIR = "Temp"

$IS_POWERSHELL_CORE = $PSVersionTable::PSEdition -eq "Core"

Write-Host $IS_POWERSHELL_CORE

$javaVersions = @{
  46 = "Java 1.2"
  47 = "Java 1.3"
  48 = "Java 1.4"
  49 = "Java 5"
  50 = "Java 6"
  51 = "Java 7"
  52 = "Java 8" 
  53 = "Java 9" 
  54 = "Java 10"
  55 = "Java 11"
  56 = "Java 12"
  57 = "Java 13"
  58 = "Java 14"
  59 = "Java 15"
  60 = "Java 16"
  61 = "Java 17"
}

function getAllClassFiles {
  param (
    $path
  )
  get-ChildItem -Path $path\* -Recurse -Include *.class
}

function getJavaVersion {
  param (
    $classFile,
    $file
  )
  Write-Host "Untersuche Jar" $file "-> Klasse" $classFile
  $versionString = (javap -v $classFile |
                    Select-String -Pattern "major version").ToString()
  [int]($versionString.SubString($versionString.Length - 2))
}

$jars = Get-ChildItem -Path .\* -Include *.jar

$jarFiles = @{}

foreach ($jar in $jars) {
  $file = $jar.Name
  if (-not $IS_POWERSHELL_CORE) {
    $fileTemp = $file + ".zip"
    Copy-Item $file $fileTemp
    Expand-Archive -Path $fileTemp -DestinationPath $NAME_OF_TEMP_DIR > $null
  } else {
    Expand-Archive -LiteralPath $file -DestinationPath $NAME_OF_TEMP_DIR > $null
  }
  $classFiles = getAllClassFiles $NAME_OF_TEMP_DIR
  if ($classFiles -is [System.IO.FileSystemInfo]) {
    $classFile = $classFiles.FullName
  } else {
    $classFile = $classFiles[0]
  }
  $jarFiles.add($file, $javaVersions[(getJavaVersion $classFile $file)])
  Remove-Item -Force -Recurse $NAME_OF_TEMP_DIR
  if (-not $IS_POWERSHELL_CORE) {
    Remove-Item -Force $fileTemp
  }
}

$jarFiles | Format-Table -AutoSize

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.