Comment puis-je savoir quelle version du compilateur Java a été utilisée pour créer un fichier JAR? J'ai un fichier jar, et il aurait pu être intégré à l'un des trois JDK. Nous devons savoir exactement lequel, afin de pouvoir certifier la compatibilité. La version du compilateur est-elle incorporée quelque part dans les fichiers de classe ou dans le fichier jar?
Réponses
Trop de publicités?Comme Peter Lawrey mentionné en commentaire à la question initiale, vous ne pouvez pas savoir à quel JDK version construit le fichier de classe, mais vous pouvez trouver le code octet version de la classe.
Sur Linux, Mac OS X ou sous Windows avec Cygwin installé, le fichier(1) de commande connaît la version de la classe. Extrait d'une classe à partir d'un pot et utiliser file
de l'identifier:
$ jar xf log4j-1.2.15.jar
$ file ./org/apache/log4j/Appender.class
./org/apache/log4j/Appender.class: compiled Java class data, version 45.3
Une autre version de la classe, par exemple:
$ file ~/bin/classes/P.class
/home/dave/bin/classes/P.class: compiled Java class data, version 50.0
La version de la classe de numéro majeur correspond à la Java JDK versions:
- 45.3 = Java 1.1
- 46 = Java 1.2
- 47 = Java 1.3
- 48 = Java 1.4
- 49 = Java 5
- 50 = Java 6
- 51 = Java 7
- 52 = Java 8
Vous ne pouvez pas savoir le fichier JAR de lui-même, forcément.
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,
ces octets de vous dire quelle est la version de la classe a été compilé POUR, pas quelle est la version compilée.
Le compilateur Java ( javac
) ne construit pas de fichiers JAR, il convertit les fichiers Java en fichiers de classe. L'outil Jar ( jar
) crée des pots. Si aucun manifeste personnalisé n'a été spécifié, le manifeste par défaut spécifiera quelle version du JDK a été utilisée pour créer le fichier JAR.
Code posté par Owen à http://www.thatsjava.com/java-essentials/30681/ qui peut vous raconter l'info mentionné par un certain nombre d'autres réponses ici:
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
}
}
Voir aussi http://mindprod.com/products1.html#JARCHECK et http://clirr.sourceforge.net/
J'ai fini de modifier l'Esprit des Produits code rapidement pour vérifier ce que chacun de mes dépendances a été compilé.
Vous pouvez dire à la Java version binaire par l'inspection de la première 8 octets (ou à l'aide d'une application 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 de la VM spec format de toute façon.