2016-05-19 12 views
0

У меня есть простая установка TestNG, где я вызываю основной класс из командной строки. Тесты проходят отлично.Java UnsupportedClassVersionError (51), но только при выполнении команды с удаленного компьютера

Я запускаю их из командной строки, потому что мне нужно вызвать выполнение из Центра качества HP. Это также работает, пока QC-клиент запускает командную строку, работает в том же месте, что и скомпилированные тестовые классы.

Однако, если я пытаюсь вызвать командную строку с удаленного хоста, я получаю незначительную значительную ошибку 51. Я знаю, что это означает, что классы были скомпилированы с использованием java 1.7, и попробуйте запустить с использованием более низкого уровня java. Я не понимаю, как и почему он использует более низкую версию java. Командная строка java -version показывает, что исполняющая виртуальная машина имеет java 1.8_91. Раньше у него было 1.6_19, но я обновил его. Я также изменил системные переменные для пути и JAVA_HOME и просмотрел другие системные переменные, не найдя ничего, что выделяется.

Как возможно, что командная строка запускает две разные версии среды выполнения java при выполнении с локального и удаленного хоста? Как я могу исправить это, так что они используют 1.8 в обоих случаях?

PS, понижая скомпилированные классы 1.6 не вариант, так как TestNG является depentend uopn 1,7

здесь исключение брошено:

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 

и сама команда:

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

lib содержит некоторые файлы jar, такие как Selenium и TestNG. testng.xml может содержать конфигурации для того, какие тесты будут выполняться внутри класса, но в этом случае пуст. В папке bin хранится скомпилированная тестовая сцена Java, а также некоторые файлы данных, используемые для параметров.

UPDATE: я, конечно, должен быть запустить простой java -version, с самого начала, но теперь у меня есть, а вот результаты:

При запуске из командной строки непосредственно внутри 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) 

при выполнении из Quality Center Script, из браузера внутри виртуальной машины (здесь мне нужно сохранить в файл, чтобы увидеть фактический выход, и что только кажется, работает при использовании 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 

При выполнение из Quality Center Script, из браузера за пределами виртуальной машины (также 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] 
.... 

После удаления вышеупомянутой папки Java, и все это содержание, вывод команды был полностью пустым , в моем текстовом файле.

этот вопрос, what is shared objects file?, дает мне немного понять в том, что происходит, но я до сих пор не понимаю, почему один конкретное выполнение выбирает другой JRE, чем другие, или как это исправить ...

+0

это может помочь мне думать [ссылка] (HTTP: // stackoverflow.com/questions/10382929/how-to-fix-java-lang-unsupportedclassversionerror-unsupported-major-minor-versi) – viveksinghggits

+0

@viveksinghggits, спасибо, но нет. Я прочитал это сообщение раньше, и это только подтверждает те части, которые я уже описал, что я пробовал. Эта ошибка гораздо более специфична, чем общий случай незначительной серьезной ошибки 51. – KjetilNordin

+0

вам необходимо убедиться, что java, используемая HP QC, точно соответствует той, которая вам нужна (1.7). – ACV

ответ

1

его выполнение с -verbose параметром. Это покажет вам, какие java-файлы действительно используются.

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

Если по какой-то причине другая версия Java используется в среде КК, используйте полный путь для выполнения Java 8.

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

Хорошее предложение! Я попробую это сразу – KjetilNordin

+0

Вы также можете проверить 'java -verbose -version' для любопытства. – tak3shi

+0

К сожалению, это тоже не решает мою проблему. При ручной вводе команды в моем VM CMD-promt я получаю целую кучу java 1.8_91-строк. Но это сработало и раньше. При попытке выполнить командную строку из Quality Center теперь он просто замерзает. У меня нет ошибки, нет успеха, ничего. Он просто останавливается и продолжает говорить «Бег ...». Хотел бы я знать почему. – KjetilNordin

-1

С вашего вопроса кажется, что версия JDK на вашем удаленном хосте - 1,8_91, тогда как версия этого на вашем локальном хосте - 1,7. Поправьте меня если я ошибаюсь.

Вы должны использовать ту же самую версию JDK в тех местах, где вы используете этот код. Кроме того, с помощью плагина Maven компилятора, вы можете убедиться, что код становится составлен в предполагаемому версии:

<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

Файлы java скомпилированы с использованием 1.7. Удаленный хост работает 1,8_91, правильно. В сообщении об ошибке указано, что JRE, используемый для запуска скомпилированных классов Java, меньше 1,7. 1.8 обратно совместим с 1.7 скомпилированными классами. Другими словами, вы могли бы дать много хороших советов, но yuo на самом деле, не отвечая на вопрос. Если вы читаете снова, вы можете видеть, что он ведет себя по-разному, в зависимости от того, откуда я отправляю командную строку. Другими словами, моя настройка 1.8 работает, но в какой-то момент моей установки она использует более старую версию, чем 1.7, и я понятия не имею, где и почему. – KjetilNordin

 Смежные вопросы

  • Нет связанных вопросов^_^