L’application de la version minimale de Java à l’exécution avec “java -version: ” ne fonctionne pas sous Windows

Je souhaite appliquer la version minimale de JVM sur laquelle mon application doit être exécutée à la version 1.6 ou supérieure (par exemple, 1,6+). Ma compréhension est que vous pouvez le faire en utilisant l’argument de ligne de commande “-version:”. Je l’ai essayé et il semblait fonctionner correctement sous Linux mais pas sous Windows.

LINUX

J’ai une version JDK 1.6.0_21 installée sur une machine Linux. Les variables d’environnement $ JAVA_HOME et $ PATH ont été définies sur ce qu’elles devraient être.

J’ai couru le suivant:

$ java -version:1.6+ -version java version "1.6.0_21" Java(TM) SE Runtime Environment (build 1.6.0_21-b06) Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode) $ java -version:1.5+ -version java version "1.6.0_21" Java(TM) SE Runtime Environment (build 1.6.0_21-b06) Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode) $ java -version:1.7+ -version Unable to locate JRE meeting specification "1.7+" 

Tout semblait être prévu. “version: 1.6+” et “version: 1.5+” devraient fonctionner car JDK 1.6.0_21 est installé et “version: 1.7+” ne doit pas être installé car je ne dispose pas de JDK 1.7.

LES FENÊTRES

J’ai la même version JDK 1.6.0_21 installée sur une machine Windows (Windows 7 étant plus spécifique). Les variables d’environnement% JAVA_HOME% et% PATH% ont été définies sur ce qu’elles devraient être.

J’ai couru le suivant:

 $ java -version:1.6+ -version Unable to locate JRE meeting specification "1.6+" $ java -version:1.5+ -version Unable to locate JRE meeting specification "1.5+" $ java -version:1.7+ -version Unable to locate JRE meeting specification "1.7+" 

J’ai eu une erreur pour chaque exécution.

  • Quelqu’un peut-il expliquer pourquoi le même argument de ligne de commande fonctionne sous Linux, mais pas sous Windows? Est-ce une fonctionnalité ou un bug?

  • Que puis-je faire pour le contourner ou le contourner? Autant que possible, je souhaite que les mêmes arguments de ligne de commande soient appliqués à Linux et à Windows, donc je n’ai pas besoin de spécifier un argument “-version:” différent pour Linux et un autre différent pour Windows.

Merci.

  • Quelqu’un peut-il expliquer pourquoi le même argument de ligne de commande fonctionne sous Linux, mais pas sous Windows? Est-ce une fonctionnalité ou un bug?

Je ne pense pas que cela soit lié à Linux ou à Windows, mais plutôt à des dissortingbutions particulières – je peux maintenant l’exécuter correctement avec Windows avec le JDK Oracle, c’est-à-dire le successeur du JDK Sun (via PowerShell ou CMD):

 PS> java -version:1.7+ -version java version "1.7.0_45" Java(TM) SE Runtime Environment (build 1.7.0_45-b18) Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode) 

Au contraire, il échoue pour moi sur Ubuntu 12.04 LTS avec OpenJDK:

 $ java -version java version "1.7.0_51" OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.12.04.2) OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode) $ java -version:1.7+ -version Error: Unable to locate JRE meeting specification "1.7+" 

Une courte recherche révèle les problèmes peu concluants suivants:

  • java -version: l’option de publication ne fonctionne pas comme documenté (JDK-8011079)
  • java -version: 1.6+ refuse de travailler (JDK-6558219)
    • Cela semble faire allusion aux spécificités de la dissortingbution, et il y a en effet Java -version: la spécification ne fonctionne pas (# 1050911) pour Ubuntu 12.04 LTS

J’ai confirmé que ceci serait toujours cassé avec OpenJDK 6/7 sur Ubuntu 13.10 et aussi sur Amazon Linux 2013.09.2, donc je suggère d’expérimenter une dissortingbution OpenJDK différente ou un fournisseur JDK, au cas où ce problème serait répandu – c’est définitivement un étrange question, esp. étant donné qu’OpenJDK est entre-temps l’ implémentation officielle de Java SE 7 .

Pourquoi ne pas faire en Java?

 Ssortingng java = System.getProperty("java.specification.version"); double version = Double.valueOf(java); if (version < 1.6) { // Exit }