Skip to content

Commit 6d8c498

Browse files
committed
class-version.sh: analyze bare classes, too
And refactor the code to be more DRY.
1 parent 4eca748 commit 6d8c498

File tree

1 file changed

+31
-13
lines changed

1 file changed

+31
-13
lines changed

class-version.sh

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,9 @@
22

33
# class-version.sh - find the Java version which wrote a JAR file
44

5-
for jar in "$@"
6-
do
7-
# find the first class of the JAR
8-
class="$(jar tf "$jar" | grep '\.class' | head -n 1 | sed 's/\//./g' | sed 's/\.class$//')"
9-
10-
if [ -z "$class" ]
11-
then
12-
echo "$jar: No classes"
13-
continue
14-
fi
15-
5+
class_version() {
166
# extract bytes 4-7
17-
info="$(unzip -p "$jar" "$(jar tf "$jar" | grep \.class$ | head -n 1)" | head -c 8 | hexdump -s 4 -e '4/1 "%d\n" "\n"')"
7+
info=$(head -c 8 | hexdump -s 4 -e '4/1 "%d\n" "\n"')
188
minor1="$(echo "$info" | sed -n 1p)"
199
minor2="$(echo "$info" | sed -n 2p)"
2010
major1="$(echo "$info" | sed -n 3p)"
@@ -55,5 +45,33 @@ do
5545
esac
5646

5747
# report the results
58-
echo "$jar: $version ($major.$minor)"
48+
echo "$version ($major.$minor)"
49+
}
50+
51+
first_class() {
52+
jar tf "$1" | grep '\.class' | head -n 1
53+
}
54+
55+
for file in "$@"
56+
do
57+
case "$file" in
58+
*.class)
59+
version=$(cat "$file" | class_version)
60+
;;
61+
*.jar)
62+
class=$(first_class "$file")
63+
if [ -z "$class" ]
64+
then
65+
echo "$file: No classes"
66+
continue
67+
fi
68+
version=$(unzip -p "$file" "$class" | class_version)
69+
;;
70+
*)
71+
>&2 echo "Unsupported file: $file"
72+
continue
73+
esac
74+
75+
# report the results
76+
echo "$file: $version"
5977
done

0 commit comments

Comments
 (0)