जावा के किस संस्करण ने मेरा जार बनाया?


212

मैं यह कैसे बता सकता हूं कि जार बनाने के लिए जावा कंपाइलर के किस संस्करण का उपयोग किया गया था? मेरे पास एक जार फ़ाइल है, और इसे तीन JDK में से किसी एक में बनाया जा सकता है। हमें यह जानना चाहिए कि वास्तव में कौन सा है, इसलिए हम संगतता को प्रमाणित कर सकते हैं। संकलक संस्करण कहीं वर्ग फ़ाइलों या जार में एम्बेडेड है?


8
आप मैनिफ़ेस्ट फ़ाइल को देखकर प्रमुख verson बता सकते हैं। आप स्वयं को वर्ग फ़ाइलों को देखकर लक्ष्य संस्करण बता सकते हैं, हालांकि JDK, java के पुराने संस्करणों के लिए -tgetget विकल्प का उपयोग करके कक्षा फ़ाइलों का उत्पादन कर सकते हैं, इसलिए पहले बाइट्स को देखना सटीक नहीं हो सकता है।
पीटर लॉरी

15
MANIFEST.MF में आप कुछ इस तरह पा सकते हैंCreated-By: 1.7.0_13 (Oracle Corporation)
hko19

1
ऐसा लगता है कि मावेन 3 ऐसा करता है Created-By: Apache MavenऔरBuild-Jdk: 1.8.0_25
नील ज़ियोन्ग

कृपया इसे देखें: stackoverflow.com/questions/27065/…
Abheek Dutta

जवाबों:


89

जरूरी नहीं कि आप JAR फाइल से ही बताएं।

एक हेक्स संपादक डाउनलोड करें और जार के अंदर एक वर्ग फाइल खोलें और बाइट ऑफ़सेट 4 को 7 के माध्यम से देखें। संस्करण जानकारी अंदर निर्मित है।

http://en.wikipedia.org/wiki/Java_class_file

नोट: जैसा कि नीचे टिप्पणी में बताया गया है,

वे बाइट्स आपको बताते हैं कि किस वर्जन के लिए क्लास को संकलित किया गया है, न कि किस संस्करण को संकलित किया गया है।


41
पांडित्यपूर्ण होने के लिए, वे बाइट्स आपको बताते हैं कि किस संस्करण के लिए कक्षा संकलित की गई है, न कि किस संस्करण ने इसे संकलित किया है। जावा आपको कोड संकलित करने की अनुमति देता है ताकि वे जावा के पुराने संस्करणों के साथ संगत हों। हालाँकि, यह केवल बाइट कोड और प्रारूप पर लागू होता है। यह खुशी से कोड संकलित करेगा जो JDK 6 पुस्तकालयों को JDK 5 प्रारूप में संदर्भित करता है, उदाहरण के लिए। JDK 5 कक्षा को लोड करेगा, लेकिन इसे नहीं चला सकता क्योंकि JDK 5 लाइब्रेरी में JDK 6 से संदर्भित कोड नहीं है
होगा

6
हम इसे प्रकट फ़ाइल के रूप में निर्मित करके देख सकते हैं: 1.7.0_21-b11 (Oracle Corporation)
कृष्ण

8
अन्य उत्तर बताता है कि कमांड लाइन के माध्यम से आसान जांच कैसे की जाती है
मर्गिसैसिया

313

A jarकेवल एक कंटेनर है। यह एक फ़ाइल संग्रह है tar। हालांकि jarइसके भीतर मौजूद दिलचस्प जानकारी मेटा-इन पदानुक्रम हो सकती है, लेकिन इसमें सामग्री के साथ पुरानी कक्षाओं को निर्दिष्ट करने का कोई दायित्व नहीं है। उसके लिए, किसी को classफाइलों की जांच करनी चाहिए ।

जैसा कि पीटर लॉरी ने मूल प्रश्न के बारे में टिप्पणी में उल्लेख किया है, आप जरूरी नहीं जान सकते हैं कि JDK रिलीज़ ने किसी दिए गए classफ़ाइल का निर्माण किया है , लेकिन आप classएक में निहित फ़ाइल के बाइट कोड क्लास संस्करण का पता लगा सकते हैं jar

हां, यह थोथा बेकार है, लेकिन पहला कदम एक या एक से अधिक कक्षाओं को निकालना है jar। उदाहरण के लिए:

$ jar xf log4j-1.2.15.jar

लिनक्स पर, मैक ओएस एक्स या विंडोज विथ साइग्विन स्थापित, फ़ाइल (1) कमांड क्लास संस्करण को जानता है।

$ file ./org/apache/log4j/Appender.class
./org/apache/log4j/Appender.class: compiled Java class data, version 45.3

या वैकल्पिक javapरूप से, JDK से @ jikes.thunderbolt के रूप में उपयुक्त रूप से बताते हैं:

$ javap -v ./org/apache/log4j/Appender.class | grep major
 major version: 45

और अगर आप या Windowsतो बिना किसी पर्यावरण के लिए आरोपित हैंfilegrep

> javap -v ./org/apache/log4j/Appender.class | findstr major
 major version: 45

एफडब्ल्यूआईडब्ल्यू, मैं javapएक संपूर्ण classफ़ाइल के बारे में बताऊंगा जो किसी मूल फ़ाइल से पूछे गए प्रश्न के बारे में अधिक बताएगा ।

वैसे भी, एक अलग वर्ग संस्करण, उदाहरण के लिए:

$ file ~/bin/classes/P.class
/home/dave/bin/classes/P.class: compiled Java class data, version 50.0

वर्ग संस्करण प्रमुख संख्या निम्नलिखित जावा JDK संस्करणों से मेल खाती है:

  • 45.3 = जावा 1.1
  • 46 = जावा 1.2
  • 47 = जावा 1.3
  • 48 = जावा 1.4
  • 49 = जावा 5
  • 50 = जावा 6
  • 51 = जावा 7
  • 52 = जावा 8
  • 53 = जावा 9

7
मेरा संस्करण fileऐसा नहीं दिखा, लेकिन मैं इस कमांड के साथ मैन्युअल रूप से कक्षा की जांच करने में सक्षम था hexdump ~/bin/classes/P.class | head:। बस आठवें बाइट को देखें और दशमलव में परिवर्तित करें।
जरीट मिलार्ड

2
FYI करें 'फ़ाइल' जावा संस्करण पर निर्भर करता है कि क्या यह JDK संस्करण भी प्रदर्शित करेगा। CentOS / Oracle Linux और एक जावा 6 संकलित वर्ग पर मुझे "संकलित जावा वर्ग डेटा, संस्करण 50.0 (Java 1.6)" मिलता है, लेकिन जब मैं इसे जावा 7 के साथ संकलित वर्ग पर चलाता हूं तो मुझे सामान्य संस्करण "संकलित जावा वर्ग डेटा" मिलता है, संस्करण 51.0 "
दान हेन्स

1
JAR=something.jar ; unzip -p $JAR `unzip -l $JAR | grep '\.class$' | head -1` | file -
रान्डेल व्हिटमैन

3
@JarettMillard ने मेरा साइबरविन file file.class(5.22-1) शुरू में जावा क्लास का लक्ष्य नहीं दिखाया: "file.class: [आर्किटेक्चर = 6909806] [आर्किटेक्चर = 6845039]"। हालाँकि file -k file.classउसने ऐसा किया: "file.class: [आर्किटेक्चर = 6909806] [आर्किटेक्चर = 6845039] में जावा क्लास डेटा, वर्जन 50.0 (जावा 1.6)" संकलित किया गया। ऐसा लगता है कि fileबिना इसके मैजिकफाइल्स डीबी में केवल पहला मैच मिला -k
मंद

1
"Javap -p <class> | grep major" का उपयोग करना विश्वसनीय नहीं है। यदि pom.xml का स्रोत / लक्ष्य 1.7 है, तो javap आपको हमेशा "प्रमुख संस्करण: 51" देगा चाहे आप JDK 1.7, JDK 1.8 या JDK 1.9 का उपयोग करें।
user2569618

54

यह जानकारी खोजने के लिए जावा का तरीका है।

विंडोज: javap -v <class> | findstr major
यूनिक्स:javap -v <class> | grep major

उदाहरण के लिए:
> javap -v Application | findstr major   major version: 51


3
दिए गए सभी उत्तरों में, आपका उत्तर सबसे संक्षिप्त है और संस्करण की जानकारी जानने के लिए कोड की 10 पंक्तियों को लिखना शामिल नहीं है। इसके लिए +1
थिरुमलाई पार्थसारथी

2
के <class>लिए पैरामीटर क्या है ?
डिम्स

1
@Dims ".class" फ़ाइल आप के संस्करण को खोजने की कोशिश कर रहे हैं। उनके उदाहरण में, उनके पास एक Application.classफ़ाइल है और यह जावा 7 ( major version: 51) के लिए संकलित किया गया है ।
इननट्सहेलुस

1
ये कमांड टारगेट JVM संस्करण देते हैं, न javacकि .class फ़ाइलों को संकलित करने वाला संस्करण, जो कि इसके लिए कहा गया था।
लोर्ने

15

JAR को अनपैक करने की आवश्यकता नहीं है (यदि वर्ग नामों में से एक को जाना जाता है या 7zip का उपयोग करके देखा जाता है), तो विंडोज पर निम्न पर्याप्त होगा:

javap -cp log4j-core-2.5.jar -verbose org.apache.logging.log4j.core.Logger | findstr major

1
यह लिनक्स पर भी काम करता है, (कोर्स की खोज के बजाय आप grep का उपयोग करते हुए भी)
माइकल

1
ये कमांड टारगेट JVM संस्करण देते हैं, न javacकि .class फ़ाइलों को संकलित करने वाला संस्करण, जो कि इसके लिए कहा गया था।
लोर्ने

15

जावा संकलक ( javac) जार का निर्माण नहीं करता है, यह जावा फ़ाइलों को वर्ग फ़ाइलों में अनुवाद करता है। जार टूल ( jar) वास्तविक जार बनाता है। यदि कोई कस्टम मेनिफ़ेस्ट निर्दिष्ट नहीं किया गया था, तो डिफ़ॉल्ट मैनिफ़ेस्ट निर्दिष्ट करेगा कि जार बनाने के लिए JDK के किस संस्करण का उपयोग किया गया था।


3
सच होने के दौरान, यह सवाल का जवाब नहीं देता है।
zb226

2
@ zb226 वर्ग को संकलित करने के लिए उपयोग किए जाने वाले संकलक के संस्करण को क्लास की फाइलों से प्राप्त नहीं किया जा सकता है, केवल वह संस्करण जो कक्षाओं के लिए संकलित किया गया था । मेरे द्वारा दी गई जानकारी केवल (मानक) जानकारी प्रदान करती है जो कि किस संस्करण के निर्माण के बारे में उपलब्ध है। यदि यह नहीं पूछा जा रहा है, तो सवाल को फिर से शुरू किया जाना चाहिए
जैकबिट

ठीक है, मैं एक व्यावहारिक दृष्टिकोण से देख रहा था, लेकिन मैं अब आपकी बात देखता हूं, नीचे हटा दिया गया :)
zb226

9

चूंकि मुझे मोटे जार का विश्लेषण करने की आवश्यकता थी, इसलिए मुझे एक जार फ़ाइल में प्रत्येक व्यक्तिगत वर्ग के संस्करण में दिलचस्पी थी। इसलिए मैंने जो लिवरेज अप्रोच लिया https://stackoverflow.com/a/27877215/1497139 और इसे डेविड जे। लिस्ज़ेव्स्की ' https://stackoverflow.com/a/3313839/1497139 क्लास नंबर वर्जन टेबल के साथ जोड़कर एक बैश स्क्रिप्ट बनाई। जार एक जार फ़ाइल में सभी वर्ग फ़ाइलों के संस्करणों को दिखाने के लिए।

प्रयोग

usage: ./jarv jarfile
 -h|--help: show this usage

उदाहरण

jarv $Home/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar

java 1.4 org.apache.log4j.Appender
java 1.4 org.apache.log4j.AppenderSkeleton
java 1.4 org.apache.log4j.AsyncAppender$DiscardSummary
java 1.4 org.apache.log4j.AsyncAppender$Dispatcher
...

बैश लिपि जारव

#!/bin/bash
# WF 2018-07-12
# find out the class versions with in jar file
# see https://stackoverflow.com/questions/3313532/what-version-of-javac-built-my-jar

# uncomment do debug
# set -x

#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'  
red='\033[0;31m'  
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'

#
# a colored message 
#   params:
#     1: l_color - the color of the message
#     2: l_msg - the message to display
#
color_msg() {
  local l_color="$1"
  local l_msg="$2"
  echo -e "${l_color}$l_msg${endColor}"
}

#
# error
#
#   show an error message and exit
#
#   params:
#     1: l_msg - the message to display
error() {
  local l_msg="$1"
  # use ansi red for error
  color_msg $red "Error: $l_msg" 1>&2
  exit 1
}

#
# show the usage
#
usage() {
  echo "usage: $0 jarfile"
  # -h|--help|usage|show this usage
  echo " -h|--help: show this usage"
  exit 1 
}

#
# showclassversions
#
showclassversions() {
  local l_jar="$1"
  jar -tf "$l_jar" | grep '.class' | while read classname
  do
    class=$(echo $classname | sed -e 's/\.class$//')
    class_version=$(javap -classpath "$l_jar" -verbose $class | grep 'major version' | cut -f2 -d ":" | cut -c2-)
    class_pretty=$(echo $class | sed -e 's#/#.#g')
    case $class_version in
      45.3) java_version="java 1.1";;
      46) java_version="java 1.2";;
      47) java_version="java 1.3";;
      48) java_version="java 1.4";;
      49) java_version="java5";;
      50) java_version="java6";;
      51) java_version="java7";;
      52) java_version="java8";;
      53) java_version="java9";;
      54) java_version="java10";;
      *) java_version="x${class_version}x";;
    esac
    echo $java_version $class_pretty
  done
}

# check the number of parameters
if [ $# -lt 1 ]
then
  usage
fi

# start of script
# check arguments
while test $# -gt 0
do
  case $1 in
    # -h|--help|usage|show this usage
    -h|--help) 
      usage
      exit 1
      ;;
    *)
     showclassversions "$1"
  esac
  shift
done 

1
महान स्क्रिप्ट! मैं जार के जावा संस्करणों की जांच करने में सक्षम था।
ARK

स्क्रिप्ट साझा करने के लिए बहुत-बहुत धन्यवाद! मेरी तरफ से बस एक इशारा। head -1स्क्रिप्ट के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है: आमतौर पर, यह जार फ़ाइल में पहली कक्षा के संस्करण को देखने के लिए पर्याप्त है।
सर्गेई ब्रूनोव

7

आप एक हेक्स संपादक का उपयोग करके .class फ़ाइलों से जावा कंपाइलर संस्करण पा सकते हैं।

चरण 1: एक ज़िप निकालने वाले का उपयोग करके जार फ़ाइल से .class फ़ाइलें निकालें

चरण 2: एक हेक्स संपादक के साथ .class फ़ाइल खोलें। (मैंने नोटपैड ++ हेक्स संपादक प्लगइन का उपयोग किया है। यह प्लगइन बाइनरी के रूप में फ़ाइल पढ़ता है और इसे हेक्स में दिखाता है) आप नीचे देख सकते हैं। यहां छवि विवरण दर्ज करें

इंडेक्स 6 और 7 क्लास फाइल फॉर्मेट का प्रमुख वर्जन नंबर देता है। https://en.wikipedia.org/wiki/Java_class_file

जावा एसई 11 = 55 (0x37 हेक्स)

जावा एसई 10 = 54 (0x36 हेक्स)

जावा एसई 9 = 53 (0x35 हेक्स)

जावा एसई 8 = 52 (0x34 हेक्स),

जावा एसई 7 = 51 (0x33 हेक्स),

जावा एसई 6.0 = 50 (0x32 हेक्स),

जावा एसई 5.0 = 49 (0x31 हेक्स),

JDK 1.4 = 48 (0x30 हेक्स),

JDK 1.3 = 47 (0x2F हेक्स),

JDK 1.2 = 46 (0x2E हेक्स),

JDK 1.1 = 45 (0x2D हेक्स)।


4

आप पहले 8 बाइट्स (या एक ऐप का उपयोग करके ) का निरीक्षण करके जावा बाइनरी संस्करण बता सकते हैं ।

संकलक खुद को मेरे ज्ञान के सर्वश्रेष्ठ के लिए नहीं करता है, किसी भी पहचान हस्ताक्षर को सम्मिलित करें। मैं वैसे भी फ़ाइल वीएम कल्पना वर्ग प्रारूप में ऐसी बात नहीं कर सकता ।


ये कमांड टारगेट JVM संस्करण देते हैं, न javacकि .class फ़ाइलों को संकलित करने वाला संस्करण, जो कि इसके लिए कहा गया था।
लोर्ने

4

कोड ओवेन द्वारा पोस्ट की आपको जानकारी अन्य उत्तर यहाँ की एक संख्या से उल्लेख बता सकते हैं:

public void simpleExample ()
{
    FileInputStream fis = new FileInputStream ("mytest.class");
    parseJavaClassFile ( fis );
}
protected void parseJavaClassFile ( InputStream classByteStream ) throws Exception
{
    DataInputStream dataInputStream = new DataInputStream ( classByteStream );
    magicNumber = dataInputStream.readInt();
    if ( magicNumber == 0xCAFEBABE )
    {
        int minorVer = dataInputStream.readUnsignedShort();
        int majorVer = dataInputStream.readUnsignedShort();
        // do something here with major & minor numbers
    }
}

इसे और इस साइट को भी देखें । मैंने माइंड प्रोडक्ट्स कोड को संशोधित करने के लिए जल्दी से जांच की कि मेरी प्रत्येक निर्भरता के लिए क्या संकलित किया गया था।


ये कमांड टारगेट JVM संस्करण देते हैं, न javacकि .class फ़ाइलों को संकलित करने वाला संस्करण, जो कि इसके लिए कहा गया था।
लोर्ने

3

बैश पर चलने वाले डेवलपर्स और प्रशासक इन सुविधा कार्यों को उपयोगी पा सकते हैं:

jar_jdk_version() {
  [[ -n "$1" && -x "`command -v javap`" ]] && javap -classpath "$1" -verbose $(jar -tf "$1" | grep '.class' | head -n1 | sed -e 's/\.class$//') | grep 'major version' | sed -e 's/[^0-9]\{1,\}//'
}

print_jar_jdk_version() {
  local version
  version=$(jar_jdk_version "$1")
  case $version in 49) version=1.5;; 50) version=1.6;; 51) version=1.7;; 52) version=1.8;; esac
  [[ -n "$version" ]] && echo "`basename "$1"` contains classes compiled with JDK version $version."
}

आप उन्हें एक बार के लिए उपयोग में पेस्ट या उन्हें जोड़ सकते हैं ~/.bash_aliasesया ~/.bashrc। परिणाम कुछ इस तरह दिखते हैं:

$ jar_jdk_version poi-ooxml-3.5-FINAL.jar
49

तथा

$ print_jar_jdk_version poi-ooxml-3.5-FINAL.jar
poi-ooxml-3.5-FINAL.jar contains classes compiled with JDK version 1.5.

EDIT जैकबबिट के रूप में बताते हैं, आप 100% प्रकट पर भरोसा नहीं कर सकते हैं कि आप कुछ भी उपयोगी बता सकते हैं। यदि यह था, तो आप इसे अपने पसंदीदा UNIX शेल में निकाल सकते हैं unzip:

$ unzip -pa poi-ooxml-3.5-FINAL.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 11.3-b02 (Sun Microsystems Inc.)
Built-By: yegor
Specification-Title: Apache POI
Specification-Version: 3.5-FINAL-20090928
Specification-Vendor: Apache
Implementation-Title: Apache POI
Implementation-Version: 3.5-FINAL-20090928
Implementation-Vendor: Apache

इस .jar में निहित वर्गों के बारे में प्रकट में कुछ भी उपयोगी नहीं है।


ये कमांड टारगेट JVM संस्करण देते हैं, न javacकि .class फ़ाइलों को संकलित करने वाला संस्करण, जो कि इसके लिए कहा गया था।
लोर्ने

3

एक लाइनर (लिनक्स)

unzip -p mylib.jar META-INF/MANIFEST.MF

यह MANIFEST.MFफ़ाइल की सामग्री को प्रिंट करने के लिए प्रिंट करता है (उम्मीद है कि आपकी जार फ़ाइल में एक है :)

आपके पैकेज के निर्माण के आधार पर, आपको JDK संस्करण Created-Byया Build-Jdkकुंजी मिलेगी ।


3
ध्यान दें कि इन क्षेत्रों में मौजूद होने के लिए कोई बाध्यता नहीं है MANIFEST.MF, साथ ही मूल्यों के सही होने के लिए कोई बाध्यता नहीं है (हां, मैंने एक बार सामना किया है .jarजहां मूल्य फर्जी था)।
zb226

ये कमांड टारगेट JVM संस्करण देते हैं, न javacकि .class फ़ाइलों को संकलित करने वाला संस्करण, जो कि इसके लिए कहा गया था।
लोर्ने

2

प्रत्येक क्लास फ़ाइल में बाइट कोड स्तर के लिए एक संस्करण संख्या एम्बेडेड होती है जिसे JVM यह देखने के लिए उपयोग करता है कि यह उस विशेष बाइट कोड को पसंद करता है या नहीं। यह जावा 1.4 के लिए 48, जावा 1.5 के लिए 49 और जावा 6 के लिए 50 है।

कई कंपाइलर मौजूद हैं जो प्रत्येक स्तर पर बाइट कोड उत्पन्न कर सकते हैं, जेवैक "-getget" विकल्प का उपयोग करता है यह इंगित करने के लिए कि कौन सी बाइट कोड स्तर उत्पन्न करता है, और जावा 6 जेवैक कम से कम 1.4, 1.5 और 6. के लिए बाइट कोड उत्पन्न कर सकता है। विश्वास है कि संकलक कुछ भी सम्मिलित करता है जो संकलक की पहचान कर सकता है जो मुझे लगता है कि आप के लिए पूछते हैं। इसके अलावा एक्लिप्स कंपाइलर का तेजी से उपयोग किया जा रहा है, क्योंकि यह एक एकल जार है जो केवल JRE के साथ चल सकता है।

जार फ़ाइल में आमतौर पर कई वर्ग होते हैं, और उनमें से प्रत्येक स्वतंत्र होता है, इसलिए आपको सामग्री की विशेषताओं के बारे में निश्चित होने के लिए जार में सभी वर्गों की जांच करने की आवश्यकता होती है।


1

@ जेविद जे लिस्ज़वेस्की के उत्तर के बाद, मैंने उबंटू पर जार फ़ाइल के प्रकटीकरण को निकालने के लिए निम्नलिखित आदेश दिए:

# Determine the manifest file name:
$ jar tf LuceneSearch.jar | grep -i manifest
META-INF/MANIFEST.MF

# Extract the file:
$ sudo jar xf LuceneSearch.jar META-INF/MANIFEST.MF

# Print the file's contents:
$ more META-INF/MANIFEST.MF
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.7.0_25-b30 (Oracle Corporation)
Main-Class: org.wikimedia.lsearch.config.StartupManager

2
या, एक-लाइनर के रूप में:unzip -p LiceneSearch.jar META-INF/MANIFEST.MF
ओगरे Psalm33

ये कमांड टारगेट JVM संस्करण देते हैं, न javacकि .class फ़ाइलों को संकलित करने वाला संस्करण, जो कि इसके लिए कहा गया था।
लोर्ने

1

समय का एक अच्छा सौदा, आप पूरी जार फ़ाइलों, या युद्ध फ़ाइलों को देख सकते हैं जिनमें स्वयं के अलावा कई जार फाइलें होती हैं।

क्योंकि मैं प्रत्येक कक्षा की जांच नहीं करना चाहता था, मैंने ऐसा करने के लिए एक जावा प्रोग्राम लिखा:

https://github.com/Nthalk/WhatJDK

./whatjdk some.war
some.war:WEB-INF/lib/xml-apis-1.4.01.jar contains classes compatible with Java1.1
some.war contains classes compatible with Java1.6

हालांकि यह नहीं कहता है कि वर्ग को किसके साथ संकलित किया गया था, यह निर्धारित करता है कि जेडीके कक्षाओं को लोड करने में सक्षम होगा, जो कि शायद आप के साथ शुरू करना चाहते थे।


1

जोनाथन फॉस्ट के और मैकडॉवेल के उत्तरों पर विस्तार करने के लिए : यदि आप एक * निक्स आधारित प्रणाली पर हैं, तो आप द्विआधारी स्तर पर फ़ाइल को क्वेरी करने के लिए od(जल्द से जल्द यूनिक्स प्रोग्राम 1 जो व्यावहारिक रूप से हर जगह उपलब्ध होना चाहिए) का उपयोग कर सकते हैं .class:

od -An -j7 -N1 -t dC SomeClassFile.class

हो जाएगा ताकि उत्पादन परिचित पूर्णांक मूल्यों, जैसे 50के लिए Java 5, 51के लिए Java 6और इतने पर।

Https://en.wikipedia.org/wiki/Od_(Unix से 1 उद्धरण )


ये कमांड टारगेट JVM संस्करण देते हैं, न javacकि .class फ़ाइलों को संकलित करने वाला संस्करण, जो कि इसके लिए कहा गया था।
लोर्ने

1

मैं के रूप में अच्छी तरह से कमांड लाइन पर पारित सभी जार द्वारा आवश्यक जावा संस्करण को डंप करने के लिए अपनी स्वयं की बैश स्क्रिप्ट लिखी ... मेरा थोड़ा मोटा है, लेकिन मेरे लिए काम करता है ;-)

उदाहरण उपयोग

$ 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 <<EOF

  Dumps the version of the JVM required to run the classes in a jar file

  usage: $ME JAR_FILE

  e.g. 

  $ME myFile.jar    ->  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

1

आप निम्न प्रक्रिया का उपयोग करके कमांड लाइन पर इसे आसानी से कर सकते हैं:

यदि आप जार में किसी भी वर्ग का नाम जानते हैं, तो आप निम्न आदेश का उपयोग कर सकते हैं:

javap -cp jarname.jar -verbose packagename.classname | findstr major

उदाहरण :

    C:\pathwherejarlocated> javap -cp jackson-databind-2.8.6.jar -verbose com.fasterxml.jackson.databind.JsonMappingException | findstr major

आउटपुट:

    major version: 51

त्वरित संदर्भ :

JDK 1.0  major version 45 
DK 1.1  major version 45 
JDK 1.2  major version 46 
JDK 1.3  major version 47 
JDK 1.4  major version 48 
JDK 1.5  major version 49 
JDK 1.6  major version 50 
JDK 1.7  major version 51 
JDK 1.8  major version 52 
JDK 1.9  major version 53 

पुनश्च: यदि आप किसी भी वर्गनाम को नहीं जानते हैं, तो आप जार डिकम्प्रेसर के किसी भी उपयोग करके या जार फ़ाइल को निकालने के लिए केवल निम्नलिखित कमांड का उपयोग करके आसानी से कर सकते हैं:

jar xf myFile.jar

0

आप जार उदाहरण के मेनिफेस्ट फ़ाइल में जाँच करें:

प्रकट-संस्करण: 1.0 निर्मित-द्वारा: 1.6.0 (IBM Corporation)


-1

विंडोज पर निम्न कार्य करें:

  1. WinZip / Java JAR कमांड का उपयोग करके JAR फ़ाइल को अनज़िप या निकालें।
  2. अपने ग्रहण जावा प्रोजेक्ट में कक्षा की फ़ाइलों में से एक को खींचें और छोड़ें।
  3. कक्षा फ़ाइल खोलें।

अब ग्रहण सटीक प्रमुख और मामूली संस्करण दिखाएगा।


-1

मैं कमांड का उपयोग करके डेविड्स के सुझाव के आधार पर थोड़ी सी बैश स्क्रिप्ट (गिथब पर) का निर्माण करता हूंfile

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.