0

我有一个简单的 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,或者如何修复它......

4

2 回答 2

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
于 2016-05-23T14:51:29.733 回答
-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>
于 2016-05-23T14:15:25.177 回答