我有一个简单的TestNG设置,我从命令行调用主类。测试运行完美。
我从命令行运行它们,因为我需要从HP Quality Center触发执行。只要QC客户端触发命令行,它也可以在与编译的测试类相同的位置运行。
但是,如果我尝试从远程主机触发命令行,则会出现轻微的51大错误。我知道这意味着这些类是使用java 1.7编译的,并尝试使用较低级别的java运行。我不明白的是它是如何以及为什么使用较低版本的java。命令行java -version
表示正在执行的VM正在运行java 1.8_91。它曾经有1.6_19,但我升级了它。我还改变了路径和JAVA_HOME的系统变量,并查看了其他系统变量,但没有找到任何突出的东西。
当从本地和远程主机执行时,命令行如何触发两个不同版本的运行时java?我如何解决这个问题,以便在两种情况下都使用1.8?
PS,将已编译的类降级为1.6不是一种选择,因为TestNG依赖于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-folder包含已编译的java测试用例本身,以及一些用于参数的数据文件。
更新
我当然应该从一开始就运行一个简单的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执行时,从VM内部的浏览器执行(这里我需要保存到文件以查看实际输出,并且在使用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脚本执行时,从VM外部的浏览器(也是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不同的JRE,或者如何修复它...
答案 0 :(得分:1)
使用-verbose参数执行它。这将显示实际使用的是哪些java文件。
java -verbose -cp C:\test\Execution\lib\*;C:\test\Execution\bin org.testng.TestNG C:\test\Execution\testng.xml
如果由于某种原因在QC环境中使用了不同的java版本,请使用完整路径来执行java 8.
%java_home%/bin/java -cp C:\test\Execution\lib\*;C:\test\Execution\bin org.testng.TestNG C:\test\Execution\testng.xml
答案 1 :(得分:-1)
根据您的问题,您的远程主机中的JDK版本似乎是1.8_91,而本地主机中的JDK版本是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>