0

J'ai une configuration TestNG simple, où j'appelle une classe principale à partir de la ligne de commande. Les tests fonctionnent parfaitement. Je les lance à partir de la ligne de commande, car j'ai besoin de déclencher l'exécution à partir de HP Quality Center. Cela fonctionne également, aussi longtemps que le client QC qui déclenche la ligne de commande, s'exécute au même endroit que les classes de test compilées. Cependant, si j'essaie de déclencher la ligne de commande à partir d'un hôte distant, j'obtiens une erreur majeure mineure 51. Je sais que cela signifie que les classes ont été compilées en utilisant java 1.7, et essayent de fonctionner en utilisant un niveau inférieur de Java. Ce que je ne comprends pas, c'est comment et pourquoi il utilise une version inférieure de Java. une ligne de commande java -version montre que la machine virtuelle en cours d'exécution a un Java 1.8_91 en cours d'exécution. J'avais l'habitude d'avoir un 1.6_19, mais je l'ai amélioré. J'ai aussi changé les variables système pour path et JAVA_HOME, et j'ai regardé d'autres variables système, sans trouver quoi que ce soit qui se démarque.Java UnsupportedClassVersionError (51), mais uniquement lors de l'exécution d'une commande depuis une machine distante

Comment est-il possible que la ligne de commande déclenche deux versions différentes de runtime Java, lorsqu'il est exécuté à partir de l'hôte local et distant? Comment puis-je résoudre ce problème, de sorte qu'ils utilisent 1.8 dans les deux cas?

PS, déclasser les classes compilées à 1,6 est pas une option, comme TestNG est depentend uopn 1.7

ici est l'exception levée:

Error Number: 8 
Source: executeCommand 
Description: java.lang.UnsupportedClassVersionError: org/testng/TestNG : Unsupported major.minor version 51.0 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(Unknown Source) 
    at java.lang.ClassLoader.defineClass(Unknown Source) 
    at java.security.SecureClassLoader.defineClass(Unknown Source) 
    at java.net.URLClassLoader.defineClass(Unknown Source) 
    at java.net.URLClassLoader.access$000(Unknown Source) 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
Could not find the main class: org.testng.TestNG. Program will exit. 
Exception in thread "main" While executing command: java -cp c:\test\Execution\lib\*;c:\test\Execution\bin org.testng.TestNG c:\test\Execution\testng.xml 

et la commande elle-même:

C:\Users\myUser>java -cp C:\test\Execution\lib\*;C:\test\Execution\bin org.testng.TestNG C:\test\Execution\testng.xml 

lib inclut certains fichiers jar, comme Selenium et TestNG. testng.xml peut contenir des configurations pour exactement quels tests exécuter dans une classe, mais est vide dans ce cas. Le dossier bin contient le fichier de test java compilé lui-même et certains fichiers de données, utilisés pour les paramètres.

MISE À JOUR: Je bien sûr ai couru un java -version simple, dès le début, mais maintenant je dois, et voici les résultats:

Effectué à partir commandline directement, à l'intérieur VM:

java version "1.8.0_91" 
Java(TM) SE Runtime Environment (build 1.8.0_91-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode) 

lorsqu'il est exécuté à partir du script Quality Center, depuis le navigateur dans la machine virtuelle (ici je dois enregistrer le fichier pour voir la sortie réelle, et qui semble ne fonctionner que lors de l'utilisation java -verbose -version):

[Opened D:\java\JDK 1.8.0_91\lib\rt.jar] 
[Loaded java.lang.Object from D:\java\JDK 1.8.0_91\lib\rt.jar] 
[Loaded java.io.Serializable from D:\java\JDK 1.8.0_91\lib\rt.jar] 
... etc 

Lorsqu'il est exécuté à partir du script Quality Center, à partir du navigateur en dehors de la machine virtuelle (également java -verbose -version):

[Loaded java.lang.Object from shared objects file] 
[Loaded java.io.Serializable from shared objects file] 
[Loaded java.lang.Comparable from shared objects file] 
.... 
[Opened C:\Program Files (x86)\Java\jre6\lib\rt.jar] 
.... 

Après avoir supprimé le dossier Java mentionné ci-dessus, et tout son contenu, la sortie de la commande était complètement vide , dans mon fichier texte.

cette question, what is shared objects file?, me donne un petit aperçu de ce qui se passe, mais je ne comprends toujours pas pourquoi une exécution particulière sélectionne un autre JRE que les autres, ou comment le réparer ...

+0

cela peut aider, je pense que [lien] (http: // stackoverflow.com/questions/10382929/how-to-fix-java-lang-unsupportedclassversionerror-unsupported-major-minor-versi) – viveksinghggits

+0

@viveksinghggits, merci, mais non. J'ai lu ce post auparavant, et cela ne fait que confirmer les parties que j'ai déjà décrites que j'ai essayées. Cette erreur est beaucoup plus spécifique que le cas général d'une erreur mineure majeure. – KjetilNordin

+0

vous devez vous assurer que le java utilisé par HP QC est précisément celui dont vous avez besoin (1.7). – ACV

Répondre

1

Execute avec le paramètre verbose. Cela vous montrera quels fichiers Java sont vraiment utilisés.

java -verbose -cp C:\test\Execution\lib\*;C:\test\Execution\bin org.testng.TestNG C:\test\Execution\testng.xml 

Si pour une raison quelconque une autre version Java est utilisé dans votre environnement QC, utilisez le chemin complet pour exécuter java 8.

%java_home%/bin/java -cp C:\test\Execution\lib\*;C:\test\Execution\bin org.testng.TestNG C:\test\Execution\testng.xml 
+0

Belle suggestion! Je vais essayer tout de suite – KjetilNordin

+0

Vous pouvez également vérifier 'java -verbose -version' pour la curiosité. – tak3shi

+0

Malheureusement, cela ne résout pas non plus mon problème. Tout en tapant manuellement la commande dans mon VM CMD-promt, j'obtiens tout un tas de java 1.8_91-lignes. Mais cela a fonctionné aussi bien auparavant. Lorsque vous essayez d'exécuter la ligne de commande à partir de Quality Center, il se fige maintenant. Je n'ai pas d'erreur, pas de succès, rien. Il s'arrête juste, et continue à dire "Running ...". J'aimerais savoir pourquoi. – KjetilNordin

-1

De votre question, il semble que la version JDK de votre hôte distant est 1.8_91, alors que la version de votre hôte local est 1.7. Corrige moi si je me trompe.

Vous devez utiliser exactement la même version de JDK dans les endroits où vous exécutez ce code. En outre, en utilisant le plugin compilateur maven, vous pouvez vous assurer que le code est compilé se dans votre version destinée:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.5.1</version> 
    <inherited>true</inherited> 
    <configuration> 
     <source>1.8</source> 
     <target>1.8</target> 
    </configuration> 
</plugin> 
+0

Les fichiers java sont compilés en utilisant 1.7 correct. L'hôte distant est en cours d'exécution 1.8_91, correct. Le message d'erreur indique que le JRE utilisé pour exécuter les classes Java compilées est inférieur à 1.7. 1.8 est rétrocompatible avec 1.7 classes compilées. En d'autres termes, vous pourriez donner beaucoup de bons conseils, mais en fait, vous ne répondez pas à la question. Si vous relisez, vous pouvez voir qu'il se comporte différemment, en fonction de l'endroit d'où j'ai envoyé la ligne de commande. En d'autres termes, mon installation de 1.8 fonctionne, mais à un moment donné dans ma configuration, il utilise une version plus ancienne que 1.7, et je n'ai aucune idée où et pourquoi. – KjetilNordin