জাভা এর কোন সংস্করণ আমার জারটি তৈরি করেছিল?


212

আমি কীভাবে বলতে পারি জাভা তৈরির জন্য জাভা সংকলনের কোন সংস্করণ ব্যবহৃত হয়েছিল? আমার কাছে একটি জার ফাইল রয়েছে এবং এটি তিনটি জেডিকে যেকোন একটিতে তৈরি করা যেতে পারে। আমাদের ঠিক কোনটি জানতে হবে, তাই আমরা সামঞ্জস্যতা প্রমাণ করতে পারি। সংকলক সংস্করণটি ক্লাসের ফাইল বা জারে কোথাও এম্বেড করা আছে?


8
আপনি মেনিফেস্ট ফাইলটি দেখে প্রধান ভার্সনকে বলতে পারেন। আপনি নিজেরাই ক্লাস ফাইলগুলি লক্ষ্য করে লক্ষ্য সংস্করণটি বলতে পারেন তবে জেডিকে-জাগতিক বিকল্পগুলি ব্যবহার করে জাভাটির পূর্ববর্তী সংস্করণগুলির জন্য ক্লাস ফাইল তৈরি করতে পারে, তাই প্রথম বাইটগুলি অনুসন্ধান করা সঠিক নাও হতে পারে।
পিটার লরি

15
MANIFEST.MF এ আপনি এমন কিছু খুঁজে পেতে পারেনCreated-By: 1.7.0_13 (Oracle Corporation)
hko19

1
দেখে মনে হচ্ছে ম্যাভেন 3 এটি করে Created-By: Apache MavenএবংBuild-Jdk: 1.8.0_25
নিল জিয়নগ

উত্তর:


89

আপনি জেআর ফাইল থেকে নিজেই বলতে পারবেন না, অগত্যা।

একটি হেক্স সম্পাদক সম্পাদনা করুন এবং জারের অভ্যন্তরে ক্লাসের একটি ফাইল খুলুন এবং বাইট অফসেটগুলি 4 থেকে 7 দেখুন look সংস্করণ তথ্যটি অন্তর্নির্মিত।

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

দ্রষ্টব্য: নীচে মন্তব্যে উল্লিখিত হিসাবে,

এই বাইটগুলি আপনাকে জানায় যে ক্লাসটি কোন সংস্করণটির জন্য সংকলিত হয়েছে, কোন সংস্করণটি এটি সংকলিত হয়নি।


41
পেডেন্টিক হতে, সেই বাইটগুলি আপনাকে বলে যে ক্লাসটি কোন সংস্করণটির জন্য সংকলিত হয়েছে, কোন সংস্করণটি এটি সংকলিত হয়নি। জাভা আপনাকে কোডটি সংকলন করতে দেয় যাতে তারা জাভার আগের সংস্করণগুলির সাথে সামঞ্জস্য হয়। তবে এটি কেবল বাইট কোড এবং ফর্ম্যাটের ক্ষেত্রে প্রযোজ্য। এটি আনন্দের সাথে কোডটি সংকলন করবে যা উদাহরণস্বরূপ, JDK 6 লাইব্রেরিকে একটি জেডিকে 5 ফর্ম্যাটে রেফারেন্স করে। জেডি কে ৫ ক্লাসটি লোড করবে, তবে এটি চালাতে পারবে না কারণ জেডিকে 5 লাইব্রেরিতে কোডটি জেডিকে 6 থেকে রেফারেন্স করা নেই
উইল হার্টং

6
আমরা এটিকে ম্যানিফেস্ট ফাইলটিতে সৃজিত দ্বারা তৈরি করতে পেরেছি: 1.7.0_21-বি 11 (ওরাকল কর্পোরেশন)
কৃষ্ণ

8
অন্যান্য উত্তর কিভাবে কম্যান্ড লাইনের মাধ্যমে সহজ চেক বলে
mgarciaisaia

313

jarকেবলমাত্র একটি ধারক। এটি একটি ফাইল সংরক্ষণাগার tar। লা । যদিও jarএর মাইটা-আইএনএফ শ্রেণিবিন্যাসের মধ্যে একটি আকর্ষণীয় তথ্য থাকতে পারে , তবে এর বিষয়বস্তুগুলির মধ্যে ক্লাসগুলির মদ নির্দিষ্ট করার কোনও বাধ্যবাধকতা নেই। তার জন্য, একজনকে অবশ্যই classএতে ফাইলগুলি পরীক্ষা করতে হবে ।

পিটার লরি যেমন মূল প্রশ্নের মন্তব্যে উল্লেখ করেছেন, আপনি জেডিকে কোন রিলিজ একটি প্রদত্ত 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জেডিকে থেকে @ jike.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প্রশ্ন দেওয়া মূল প্রশ্নটির চেয়ে একটি প্রদত্ত ফাইল সম্পর্কে সম্পূর্ণ আরও অনেক কিছু জানাবে will

যাইহোক, একটি পৃথক শ্রেণীর সংস্করণ, উদাহরণস্বরূপ:

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

শ্রেণীর সংস্করণের প্রধান সংখ্যাটি নিম্নলিখিত জাভা জেডিকে সংস্করণের সাথে মিলেছে:

  • 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
এফওয়াইআই'র ফাইলটি জাভা সংস্করণের উপর নির্ভর করে বলে মনে হচ্ছে এটি জেডিকে সংস্করণটি প্রদর্শন করবে কিনা। সেন্টোস / ওরাকল লিনাক্স এবং একটি জাভা comp সংকলিত ক্লাসে আমি "জাভা শ্রেণীর ডেটা সংকলিত, সংস্করণ ৫০.০ (জাভা ১. Java) পেয়েছি" তবে আমি জাভা with এর সাথে সংকলিত একটি ক্লাসে চালিত হলে আমি জেনেরিক সংস্করণটি "জাভা শ্রেণীর সংকলিত সংকলিত তথ্য পেয়েছি, 51.0 সংস্করণ "
ড্যান হেইনেস

1
JAR=something.jar ; unzip -p $JAR `unzip -l $JAR | grep '\.class$' | head -1` | file -
র্যান্ডল হুইটম্যান

3
@ জ্যারেটমিলার্ড আমার সাইগউইন file file.class(৫.২২-১) প্রাথমিকভাবে জাভা শ্রেণীর লক্ষ্য দেখায়নি: "ফাইলক্লাস: [আর্কিটেকচার = 6909806] [আর্কিটেকচার = 6845039]"। তবে file -k file.classএটি করেছেন: "file.class: [আর্কিটেকচার = 6909806] [আর্কিটেকচার = 6845039] জাভা শ্রেণীর ডেটা সংকলিত, সংস্করণ 50.0 (জাভা 1.6)"। দেখে মনে হচ্ছে fileএটি কেবলমাত্র তার ম্যাজিক ফাইলে ডিবি ছাড়া প্রথম ম্যাচ পেয়েছে -k
অস্পষ্ট

1
"জাভ্যাপ-পি <ক্লাস> | গ্রেপ মেজর" ব্যবহার করা নির্ভরযোগ্য নয়। যদি কোনও পম.এক্সএমএল এর উত্স / লক্ষ্যমাত্রা 1.7 থাকে, জাভাপ সর্বদা আপনাকে "প্রধান সংস্করণ: 51" দেবে আপনি নির্ধারণের জন্য জেডিকে 1.7, জেডিকে 1.8 বা জেডিকে 1.9 ব্যবহার করুন না কেন।
ব্যবহারকারী 2569618

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
@ আপনি "সংস্করণ" ফাইলটির সংস্করণ সন্ধান করার চেষ্টা করছেন। তার উদাহরণে, তার কাছে একটি Application.classফাইল রয়েছে এবং এটি জাভা 7 ( major version: 51) এর জন্য সংকলিত হয়েছে ।
inanutshellus

1
এই কমান্ডগুলি লক্ষ্য JVM সংস্করণ সরবরাহ করে, javac.class ফাইলগুলি সংকলন করে এমন সংস্করণ নয় , যা জন্য বলা হয়েছিল।
লার্নের মারকুইস

15

জেআর আনপ্যাক করার দরকার নেই (যদি শ্রেণীর কোনও একটি নাম পরিচিত হয় বা উদাহরণস্বরূপ 7 জীপ ব্যবহার করা হয়), তবে উইন্ডোজটিতে নিম্নলিখিতগুলি যথেষ্ট হবে:

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

1
এটি লিনাক্সেও কাজ করে (আপনি যদি ফাইন্ডাস্ট্রের পরিবর্তে গ্রেপ ব্যবহার করেন তবে)
মাইকেল রাশ

1
এই কমান্ডগুলি লক্ষ্য JVM সংস্করণ সরবরাহ করে, javac.class ফাইলগুলি সংকলন করে এমন সংস্করণ নয় , যা জন্য বলা হয়েছিল।
লার্নের মারকুইস

15

জাভা সংকলক ( javac) জার তৈরি করে না, এটি জাভা ফাইলগুলিকে ক্লাস ফাইলে অনুবাদ করে। জার সরঞ্জাম ( jar) আসল জারগুলি তৈরি করে। যদি কোনও কাস্টম ম্যানিফেস্ট নির্দিষ্ট না করা থাকে, ডিফল্ট ম্যানিফেস্ট জারকে তৈরি করতে জেডিকে কোন সংস্করণ ব্যবহৃত হয়েছিল তা নির্দিষ্ট করে।


3
সত্য হওয়ার সময় এটি প্রশ্নের উত্তর দেয় না।
zb226

2
@ zb226 আমি যতদূর জানি ক্লাস কম্পাইল ব্যবহৃত কম্পাইলার সংস্করণ বর্গ ফাইল, শুধুমাত্র যে সংস্করণটি শ্রেণীর সংকলিত করা হয়েছে থেকে প্রাপ্ত করা যাবে না জন্য । আমি যে তথ্য দিয়েছি তা কেবলমাত্র (মানক) তথ্য সরবরাহ করে যা সংস্করণটি কী তৈরি করেছিল সে সম্পর্কে উপলব্ধ। যদি এটিই জিজ্ঞাসা করা হয় না, তবে প্রশ্নটি পুনরায় করা উচিত।
jackrabbit

ঠিক আছে, আমি এটি একটি বাস্তববাদী দৃষ্টিকোণ থেকে
দেখছিলাম

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
...

বাশ স্ক্রিপ্ট jarv

#!/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
দুর্দান্ত স্ক্রিপ্ট! আমি জারের জাভা সংস্করণগুলি পরীক্ষা করতে সক্ষম হয়েছি।
আরকে

স্ক্রিপ্ট ভাগ করে নেওয়ার জন্য আপনাকে অনেক ধন্যবাদ! আমার দিক থেকে একটি ইঙ্গিত। head -1স্ক্রিপ্টের সাথে একত্রে ব্যবহৃত হতে পারে: সাধারণত, জার ফাইলটিতে প্রথম শ্রেণির সংস্করণটি দেখার জন্য এটি যথেষ্ট।
সের্গেই ব্রুনোভ

7

আপনি একটি হেক্স সম্পাদক ব্যবহার করে .class ফাইলগুলি থেকে জাভা সংকলক সংস্করণটি পেতে পারেন।

পদক্ষেপ 1: জিপ এক্সট্র্যাক্টর ব্যবহার করে জার ফাইল থেকে .class ফাইলগুলি বের করুন

পদক্ষেপ 2: একটি হেক্স সম্পাদক দিয়ে .class ফাইল খুলুন ((আমি নোটপ্যাড ++ হেক্স সম্পাদক প্লাগইন ব্যবহার করেছি This এই প্লাগইনটি বাইনারি হিসাবে ফাইলটি পড়ে এবং এটি হেক্সে দেখায়) আপনি নীচে দেখতে পারেন। এখানে চিত্র বর্ণনা লিখুন

সূচক 6 এবং 7 ক্লাস ফাইল ফর্ম্যাটটি ব্যবহার করা হচ্ছে এর প্রধান সংস্করণ নম্বর দেয়। https://en.wikipedia.org/wiki/Java_class_file

জাভা SE 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 hex),

JDK 1.2 = 46 (0x2E hex),

জেডিকে 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.

সম্পাদনা সম্পাদনা করুন জ্যাকরাবিট হিসাবে , আপনি দরকারী কিছু বলতে 100% ম্যানিফেস্টের উপর নির্ভর করতে পারবেন না। যদি এটি হয় তবে আপনি এটির সাহায্যে এটি আপনার পছন্দের ইউনিক্স শেলটিতে টেনে আনতে পারেন 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স্টাডআউটে ফাইলের বিষয়বস্তু মুদ্রণ করে (আশা করি আপনার জার ফাইলটিতে একটি রয়েছে :)

আপনার প্যাকেজটি কী তৈরি করেছে তার উপর নির্ভর করে আপনি জেডিকে সংস্করণ Created-Byবা Build-Jdkকী খুঁজে পাবেন।


3
মনে রাখবেন যে এই ক্ষেত্রগুলিতে উপস্থিত MANIFEST.MFথাকার জন্য কোনও বাধ্যবাধকতা নেই, পাশাপাশি মানগুলি সঠিক হওয়ার জন্য কোনও বাধ্যবাধকতা নেই (হ্যাঁ, আমি একবার এমন একটি মুখোমুখি হয়েছি .jarযেখানে মানটি বোগাস ছিল)।
zb226

এই কমান্ডগুলি লক্ষ্য JVM সংস্করণ সরবরাহ করে, javac.class ফাইলগুলি সংকলন করে এমন সংস্করণ নয় , যা জন্য বলা হয়েছিল।
লার্নের মারকুইস

2

প্রতিটি শ্রেণীর ফাইলটিতে বাইট কোড স্তরটির জন্য এম্বেড করা একটি সংস্করণ নম্বর থাকে যা জেভিএম এটি নির্দিষ্ট বাইট কোড খণ্ড পছন্দ করে কিনা তা দেখতে ব্যবহার করে। এটি জাভা 1.4 এর 48, জাভা 1.5 এর 49 এবং জাভা 6 এর 50 টি।

অনেক সংকলক উপস্থিত রয়েছে যা প্রতিটি স্তরে বাইট কোড উত্পন্ন করতে পারে, জাভা্যাক "-রগার্ট" বিকল্পটি ব্যবহার করে কোন বাইট কোড স্তরটি উত্পন্ন করতে পারে তা নির্দেশ করতে এবং জাভা 6 জাভ্যাক কমপক্ষে 1.4, 1.5 এবং 6 এর জন্য বাইট কোড উত্পন্ন করতে পারে I আমি না বিশ্বাস করুন যে সংকলক এমন কোনও কিছু সন্নিবেশ করায় যা সংকলক নিজেই সনাক্ত করতে পারে যা আমি মনে করি যা আপনি জিজ্ঞাসা করেছেন। এছাড়াও একটিগ্রাহী সংকলকটি ক্রমবর্ধমানভাবে ব্যবহৃত হচ্ছে, কারণ এটি একক জার যা কেবল জেআরই দিয়ে চলতে পারে।

একটি জার ফাইলে সাধারণত অনেকগুলি ক্লাস থাকে এবং সেগুলির প্রতিটি স্বতন্ত্র, সুতরাং সামগ্রীগুলির বৈশিষ্ট্যগুলি সম্পর্কে নিশ্চিত হওয়ার জন্য আপনাকে জারের সমস্ত শ্রেণীর তদন্ত করতে হবে।


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
ওগ্রে গীতসংহিতা 33

এই কমান্ডগুলি লক্ষ্য 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.wikedia.org/wiki/Od_( ইউনিক্স থেকে 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 (আইবিএম কর্পোরেশন)


-1

উইন্ডোজে নিম্নলিখিতটি করুন:

  1. উইনজিপ / জাভা জআআআআআআর কমান্ড ব্যবহার করে আনজিপ করুন বা জেআর ফাইলটি বের করুন।
  2. আপনার Eclipse Java প্রকল্পে ক্লাসের একটি ফাইল টেনে আনুন g
  3. ক্লাস ফাইল খুলুন।

এখন Eclipse সঠিক এবং গৌণ সংস্করণ প্রদর্শন করবে।


-1

কমান্ডটি ব্যবহার করে ডেভিডের পরামর্শের ভিত্তিতে আমি একটি সামান্য বাশ স্ক্রিপ্ট (গিথুব উপর) তৈরি করিfile

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.