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