Java UnsupportedClassVersionError (51),但仅当从远程机器执行命令时
Java UnsupportedClassVersionError (51), but only when executing command from remote machine
我有一个简单的 TestNG 设置,我从命令行调用主程序 class。测试 运行s 完美。
我从命令行 运行 它们,因为我需要从 HP Quality Center 触发执行。这也有效,只要触发命令行的 QC 客户端 运行ning 在与编译测试相同的位置 classes.
但是,如果我尝试从远程主机触发命令行,我会收到一个次要的主要 51 错误。我知道这意味着 classes 是使用 java 1.7 编译的,并尝试 运行 使用较低级别的 java。我不明白的是它如何以及为什么使用较低版本的 java。命令行 java -version
显示正在执行的 VM 有一个 java 1.8_91 运行ning。它曾经有一个 1.6_19,但我已经升级了它。我还更改了路径和 JAVA_HOME 的系统变量,并查看了其他系统变量,但没有发现任何突出的东西。
当从本地和远程主机执行时,命令行如何触发两个不同版本的 运行time java?我该如何解决这个问题,以便他们在两种情况下都使用 1.8?
PS,将编译后的 classes 降级到 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[=11=]0(Unknown Source)
at java.net.URLClassLoader.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 可以包含 class 中 运行 的确切测试的配置,但在这种情况下为空。 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)
当从 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,或者如何解决它...
从你的问题来看,你的远程主机中的 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>
使用-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
我有一个简单的 TestNG 设置,我从命令行调用主程序 class。测试 运行s 完美。
我从命令行 运行 它们,因为我需要从 HP Quality Center 触发执行。这也有效,只要触发命令行的 QC 客户端 运行ning 在与编译测试相同的位置 classes.
但是,如果我尝试从远程主机触发命令行,我会收到一个次要的主要 51 错误。我知道这意味着 classes 是使用 java 1.7 编译的,并尝试 运行 使用较低级别的 java。我不明白的是它如何以及为什么使用较低版本的 java。命令行 java -version
显示正在执行的 VM 有一个 java 1.8_91 运行ning。它曾经有一个 1.6_19,但我已经升级了它。我还更改了路径和 JAVA_HOME 的系统变量,并查看了其他系统变量,但没有发现任何突出的东西。
当从本地和远程主机执行时,命令行如何触发两个不同版本的 运行time java?我该如何解决这个问题,以便他们在两种情况下都使用 1.8?
PS,将编译后的 classes 降级到 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[=11=]0(Unknown Source)
at java.net.URLClassLoader.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 可以包含 class 中 运行 的确切测试的配置,但在这种情况下为空。 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)
当从 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,或者如何解决它...
从你的问题来看,你的远程主机中的 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>
使用-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