Java UnsupportedClassVersionError(51),但仅在从远程计算机执行命令时

时间:2016-05-19 10:29:26

标签: java virtual-machine alm hp-quality-center system-variable

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

2 个答案:

答案 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>