What version of javac built my jar?

前端 未结 20 893
孤街浪徒
孤街浪徒 2020-11-27 09:48

How can I tell what version of the Java compiler was used to build a jar? I have a jar file, and it could have been built in any one of three JDKs. We need to know exactly

20条回答
  •  粉色の甜心
    2020-11-27 10:30

    I as well wrote my own bash script to dump the Java version required by all the jars passed at the command line... Mine is a bit rough, but works for me ;-)

    example usage

    $ jar_dump_version_of_jvm_required.sh *.jar
    JVM VERSION REQUIRED: 46.0, /private/tmp/jars/WEB-INF/lib/json-simple-1.1.jar
    JVM VERSION REQUIRED: 49.0, /private/tmp/jars/WEB-INF/lib/json-smart-1.1.1.jar
    JVM VERSION REQUIRED: 50.0, /private/tmp/jars/WEB-INF/lib/jsontoken-1.0.jar
    JVM VERSION REQUIRED: 50.0, /private/tmp/jars/WEB-INF/lib/jsr166y-1.7.0.jar
    

    jar_dump_version_of_jvm_required.sh

    #!/bin/bash
    
    DIR=$(PWD)
    function show_help()
    {
      ME=$(basename $0)
      IT=$(cat <  VERSION: 50.0     myFile.jar
    
      Java versions are:
      54 = Java 10
      53 = Java 9
      52 = Java 8
      51 = Java 7
      50 = Java 6
      49 = Java 5
      48 = Java 1.4
      47 = Java 1.3
      46 = Java 1.2
      45.3 = Java 1.1
    
    EOF
      )
      echo "$IT"
      exit
    }
    
    if [ "$1" == "help" ]
    then
      show_help
    fi
    if [ -z "$1" ]
    then
      show_help
    fi
    
    function unzipJarToTmp()
    {
      JAR=$1
      CLASS_FILE=$(jar -tf "$JAR" | grep \.class$ | grep -v '\$' | head -n1 | awk '{print $NF}')
      OUT_FILE="$CLASS_FILE"
      #echo "J=$JAR C=$CLASS_FILE O=$OUT_FILE"
      jar xf "$JAR" "$CLASS_FILE"
    
      MAJOR=$(javap -v "$OUT_FILE" 2>&1 | grep major | awk -F' ' '{print $3'})
      MINOR=$(javap -v "$OUT_FILE" 2>&1 | grep minor | awk -F' ' '{print $3'})
      if [ -z "$MAJOR" ]
      then
        echo "JVM VERSION REQUIRED: NA as no classes in $JAR"
      else
        echo "JVM VERSION REQUIRED: $MAJOR.$MINOR, $JAR"
      fi
    }
    
    # loop over cmd line args
    for JAR in "$@"
    do
      cd "$DIR"
      JAR_UID=$(basename "$JAR" | sed s/.jar//g)
      TMPDIR=/tmp/jar_dump/$JAR_UID/
      mkdir -p "$TMPDIR"
      JAR_ABS_PATH=$(realpath $JAR)
    
      cd "$TMPDIR"
    
      #echo "$JAR_ABS_PATH"
      unzipJarToTmp "$JAR_ABS_PATH"
      #sleep 2
    done
    

提交回复
热议问题