Quelle est la version de javac construit mon pot?
Comment puis-je savoir quelle version du compilateur Java a été utilisé pour construire un bocal? J'ai un fichier jar, et il pourrait avoir été construit dans l'un des trois Jdk. Nous avons besoin de savoir exactement lequel, de sorte que nous pouvons certifier la compatibilité. Est le compilateur de la version embedded quelque part dans les fichiers de classe ou un bocal?
- Vous pouvez dire la majeure verson en regardant le fichier de manifeste. Vous pouvez dire la version cible en regardant les fichiers de classe eux-mêmes cependant le Jdk permet de produire des fichiers pour les versions antérieures de java à l'aide de l'option-target, donc en regardant les premiers octets peuvent ne pas être exacts.
- Dans le MANIFESTE.MF vous pouvez trouver quelque chose comme
Created-By: 1.7.0_13 (Oracle Corporation)
- Ressemble Maven 3 est-ce
Created-By: Apache Maven
etBuild-Jdk: 1.8.0_25
- Veuillez vérifier ceci : stackoverflow.com/questions/27065/...
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas savoir le fichier JAR de lui-même, nécessairement.
Télécharger un éditeur hexadécimal et ouvrez l'un des fichiers de classe à l'intérieur du BOCAL et de regarder à l'octet décalages de 4 à 7. Les informations de version est construite dans.
http://en.wikipedia.org/wiki/Java_class_file
Remarque: Comme mentionné dans le commentaire ci-dessous,
Un
jar
est simplement un conteneur. C'est un fichier d'archive à latar
. Alors qu'unjar
peut avoir des informations intéressantes contenues à l'intérieur de son META-INF hiérarchie, il n'a pas l'obligation de préciser la cuvée des classes à l'intérieur de son contenu. Pour cela, on doit examiner laclass
les fichiers qui y sont.Comme Peter Lawrey mentionné en commentaire à la question initiale, vous ne pouvez pas savoir à quel JDK version construit un
class
fichier, mais vous pouvez trouver le code octet version de la classe de laclass
fichier contenu dans unjar
.Oui, cela un peu nul, mais la première étape consiste à extraire un ou plusieurs classes de la
jar
. Par exemple:Sur Linux, Mac OS X ou Windows avec Cygwin installé, le fichier(1) commande connaît la version de la classe.
Ou, alternativement, à l'aide de
javap
à partir du JDK que @jikes.thunderbolt bien des points:Et si vous êtes relégué à un
Windows
environnement sansfile
ougrep
FWIW, je vais d'accord pour dire que
javap
vous en dira beaucoup plus sur unclass
fichier que l'original de la question posée.De toute façon, une autre version de la classe, par exemple:
La version de la classe de numéro majeur correspond à la Java JDK versions:
file
à ne pas montrer, mais j'ai été en mesure de vérifier la classe manuellement avec cette commande:hexdump ~/bin/classes/P.class | head
. Il suffit de regarder le huitième octet et le convertir en décimal.JAR=something.jar ; unzip -p $JAR `unzip -l $JAR | grep '\.class$' | head -1` | file -
file file.class
(5.22-1) n'a pas montré de la classe java cible initialement: "file.class: [architecture=6909806] [architecture=6845039]". Cependantfile -k file.class
fait que: "file.class: [architecture=6909806] [architecture=6845039] Java compilé les données de la classe, la version de 50,0 (Java 1.6)". Il ressemble àfile
ai seulement le premier match de son magicfiles db sans-k
.Ici est de Java façon de trouver cette information.
Windows:
javap -v <class> | findstr major
Unix:
javap -v <class> | grep major
Par exemple:
> javap -v Application | findstr major
major version: 51
<class>
paramètre pour?Application.class
fichier et il s'est avéré être compilé pour Java 7 (major version: 51
).javac
version qui a compilé la .les fichiers de classe, qui est ce qui a été demandé.Le compilateur Java (
javac
) ne permet pas de créer des pots, il traduit les fichiers Java dans des fichiers de classe. Le Pot de l'outil (jar
) crée le réel pots. Si aucun manifeste personnalisé a été spécifié, la valeur par défaut manifeste spécifier la version du JDK utilisé pour créer le jar.Il n'est pas nécessaire de décompresser le POT (si l'un des noms de classe est connu ou est regardé, par exemple, à l'aide de 7zip), sur Windows suivants serait suffisant:
javac
version qui a compilé la .les fichiers de classe, qui est ce qui a été demandé.Depuis que j'ai le nécessaire pour analyser la graisse pots j'ai été intéressé par la version de chaque classe dans un fichier jar. Donc j'ai pris Joe Liversedge approche
https://stackoverflow.com/a/27877215/1497139 et l'a combiné avec David J. Liszewski' https://stackoverflow.com/a/3313839/1497139 classe numéro de version de la table pour créer un script bash jarv pour afficher les versions de tous les fichiers de classe dans un fichier jar.
utilisation
Exemple
Script Bash jarv
head -1
peut être utilisé en conjonction avec le script: en général, il suffit de voir la version de la première classe dans le fichier jar.vous pouvez trouver un compilateur Java version de .les fichiers de classe à l'aide d'un Éditeur Hexadécimal.
L'étape 1:
Extrait de .catégorie fichiers de fichier jar à l'aide d'un zip extractor
étape 2: ouvrir .classe fichier avec un éditeur hexadécimal.(J'ai utilisé notepad++ hex editor plugin. Ce plugin lit les fichier binaire et l'affiche en hexadécimal)
Vous pouvez voir ci-dessous.
Indice 6 et 7 donne le numéro de version majeure de la classe format de fichier utilisé.
https://en.wikipedia.org/wiki/Java_class_file
Java SE 11 = 55 (0x37 hex)
Java SE 10 = 54 (0x36 hex)
Java SE 9 = 53 (0x35 hex)
Java SE 8 = 52 (0x34 hex),
Java SE 7 = 51 (0x33 hex),
Java SE 6.0 = 50 (0x32 hex),
Java SE 5.0 = 49 (0x31 hex),
JDK 1.4 = 48 (0x30 hex),
JDK 1.3 = 47 (0x2F hex),
JDK 1.2 = 46 (0x2E hex),
JDK 1.1 = 45 (0x2D hex).
Vous pouvez dire à la Java version binaire par inspecter les 8 premiers octets (ou à l'aide d'un app qui peut).
Le compilateur lui-même n'a pas, à ma connaissance, insérer l'identification de la signature. Je ne peux pas en place une telle chose dans le fichier VM spec format de toute façon.
javac
version qui a compilé la .les fichiers de classe, qui est ce qui a été demandé.La code posté par Owen peux vous dire que les informations visées par un certain nombre d'autres réponses ici:
Voir aussi cette et cette site. J'ai fini de modifier l'Esprit des Produits code rapidement pour vérifier ce que chacun de mes dépendances a été compilé.
javac
version qui a compilé la .les fichiers de classe, qui est ce qui a été demandé.Un liner (Linux)
unzip -p mylib.jar META-INF/MANIFEST.MF
Ce imprime le contenu de
MANIFEST.MF
fichier sur la sortie standard (j'espère qu'il y en existe une dans votre fichier jar 🙂En fonction de ce qui construit votre colis, vous trouverez la version du JDK dans
Created-By
ouBuild-Jdk
clé.MANIFEST.MF
, ainsi que il n'y a pas d'obligation pour les valeurs correctes (Oui, je l'ai rencontré une fois un.jar
où la valeur est faux).javac
version qui a compilé la .les fichiers de classe, qui est ce qui a été demandé.Chaque fichier de classe a un numéro de version intégré pour le code octet niveau de la JVM utiliser pour voir si elle aime ce byte code chunk ou pas. C'est de 48 pour Java 1.4, 49 pour Java 1.5 et 50 pour Java 6.
De nombreux compilateurs existent qui peuvent générer du code octet à chaque niveau, javac utilise la "cible" option pour indiquer les octets de code pour générer, et la version 6 de Java javac peut générer de byte code pour au moins 1.4, 1.5 et 6. Je ne crois pas que le compilateur insère tout ce qui peut identifier le compilateur lui-même qui est, je pense, ce que vous demandez. Aussi l'Éclipse du compilateur est de plus en plus utilisé, car il est un seul bocal, et qui peut fonctionner avec le JRE seulement.
Dans un fichier jar, il y a généralement de nombreuses classes, et chacun d'eux est indépendant, donc vous avez besoin pour enquêter sur toutes les classes dans le bocal pour être certain sur les caractéristiques du contenu.
Les développeurs et les administrateurs de l'exécution de Bash peut trouver ces fonctions de confort utile:
Vous pouvez coller à pour une utilisation en temps ou de les ajouter à
~/.bash_aliases
ou~/.bashrc
. Les résultats ressembler à quelque chose comme:et
MODIFIER
Comme jackrabbit points, vous ne pouvez pas 100% compter sur le manifeste de vous dire quelque chose d'utile. Si c'était le cas, vous pourriez sortir de votre favori shell UNIX avec
unzip
:Cette .jar n'est pas quelque chose d'utile dans le manifeste sur les classes de contenu.
javac
version qui a compilé la .les fichiers de classe, qui est ce qui a été demandé.Suite sur @David J. Liszewski réponse, j'ai exécuté les commandes suivantes pour extraire le fichier jar est manifeste sur Ubuntu:
unzip -p LiceneSearch.jar META-INF/MANIFEST.MF
javac
version qui a compilé la .les fichiers de classe, qui est ce qui a été demandé.Une bonne affaire de temps, vous pourriez être à la recherche à l'ensemble des fichiers jar, ou la guerre des fichiers qui contiennent plusieurs fichiers jar en plus d'eux-mêmes.
Parce que je ne voulais pas la main de vérifier chaque classe, j'ai écrit un programme en java pour le faire:
https://github.com/Nthalk/WhatJDK
Tout cela ne veut pas dire que la classe a été compilé AVEC l', il détermine ce JDK sera en mesure de CHARGER les classes, ce qui est probablement ce que vous vouliez commencer avec.
De s'étendre sur les Jonathon de Faust et McDowell réponses: Si vous êtes sur un *nix basé sur le système, vous pouvez utiliser
od
(l'un des premiers programmes Unix1, qui devrait être disponible pratiquement partout) pour interroger les.class
fichier sur un niveau binaire:Ce sera de sortie le familier des valeurs entières, par exemple
50
pourJava 5
,51
pourJava 6
et ainsi de suite.1 Citation de https://en.wikipedia.org/wiki/Od_(Unix)
javac
version qui a compilé la .les fichiers de classe, qui est ce qui a été demandé.Vous de vérifier dans le fichier Manifest du jar
exemple:
Manifest-Version: 1.0
Créé Par: 1.6.0 (IBM Corporation)
J'ai ainsi écrit mon propre script bash pour faire un dump de la version de Java requise par tous les pots passé sur la ligne de commande... le Mien est un peu rugueuse, mais qui fonctionne pour moi 😉
exemple d'utilisation
jar_dump_version_of_jvm_required.sh
Sur Windows, procédez de la manière suivante:
Maintenant Éclipse sera l'exacte version principale et secondaire.
J'ai créer un petit script bash (sur github) basé sur Davids suggestion à l'aide de la
file
commande