我有一个简单的 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 文件夹包含已编译的 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)
当从质量中心脚本执行时,从 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
从质量中心脚本执行时,从 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 文件夹及其所有内容后,该命令的输出在我的文本文件中完全是空白的。
这个问题,什么是共享对象文件?,让我对正在发生的事情有一点了解,但我仍然不明白为什么一个特定的执行选择了与其他执行不同的 JRE,或者如何修复它......