运行时 MQ 和 Java 版本不匹配问题
Runtime MQ and Java version mismatch issue
我的 Java 代码在 jdk 1.6 中编译。
我在我的项目构建路径中使用 MQ jar 文件(来自 MQ 版本 8.0)。
我的应用程序服务器运行 jdk 1.6。
服务器安装了MQ 8.0版本。
现在,当我在服务器中部署我的应用程序时,出现如下错误:
java.lang.UnsupportedClassVersionError" and errors related to major
version 50, 51 etc.
我理解版本的概念,但我有点困惑为什么在运行时会发生版本不匹配,因为在类路径中它引用与项目构建期间相同的 JAR 文件。是因为 MQ jar 是在 51 中编译的,它的版本比 50 高吗?请告知这里可以做什么。
要使用 IBM MQ v8 和更高版本附带的 jar 文件,您必须使用 Java 7 或更高版本。 IBM 文档表明,从 MQ v8 及更高版本开始,用于 Java 和 JMS 的 IBM MQ classes 是使用 Java 构建的 7. Oracle 文档表明 classes 使用 [=32] 构建=] 7 不能与 Java 6 一起使用。请参阅下面的参考资料:
在MQ v8.0 KC页面中:IBM MQ 8.0.0>IBM MQ>Product overview>What's changed in IBM MQ Version 8.0.0>Java: changes for Java 7
The IBM MQ classes for Java and IBM MQ classes for JMS are now built
with Java 7.
The Java 7 runtime environment supports running earlier class file
versions.
在MQ v9.0 KC页面中:IBM MQ 9.0.x>IBM MQ>Technical overview>IBM MQ Java language interfaces
From IBM MQ Version 8.0, the IBM MQ classes for Java and IBM MQ classes for
JMS are built with Java 7. The Java 7 runtime
environment supports running earlier class file versions.
Oracle 文档指出 Java 7 class 文件不能与以下页面中的 Java 6 一起使用:
Oracle Java SE 7 and JDK 7 Compatibility -> Binary Compatibility 声明如下:
The class file version for Java SE 7 is 51, as per the JVM
Specification, because of the invokedynamic byte code introduced by
JSR 292. Version 51 class files produced by the Java SE 7 compiler
cannot be used in Java SE 6.
@JoshMc 对 java 和 mq jar 以及所有版本不匹配的解释是绝对正确的。
我想补充一点,虽然我可以通过看到 51 和 50 之间的不匹配来理解错误发生时的情况,但我的问题是以某种方式连接到 MQ 并使应用程序 运行 而无需更改现有装置。这就是我无法将 java 升级到 JDK 1.7 的原因。
但是我通过在 Weblogic Server 的类路径中使用旧的 MQ 7 jar 解决了我的问题。因为我的应用程序表现得像客户端,所以在使用 java 6 构建的 MQ jar 连接到版本 8 的 MQ 服务器时不会有任何问题。所以我刚刚复制了旧的 MQ 7 jar一个文件夹并在我的 Weblogic CLASSPATH 引用中使用该路径,这解决了我的问题。
我的 Java 代码在 jdk 1.6 中编译。
我在我的项目构建路径中使用 MQ jar 文件(来自 MQ 版本 8.0)。
我的应用程序服务器运行 jdk 1.6。
服务器安装了MQ 8.0版本。
现在,当我在服务器中部署我的应用程序时,出现如下错误:
java.lang.UnsupportedClassVersionError" and errors related to major version 50, 51 etc.
我理解版本的概念,但我有点困惑为什么在运行时会发生版本不匹配,因为在类路径中它引用与项目构建期间相同的 JAR 文件。是因为 MQ jar 是在 51 中编译的,它的版本比 50 高吗?请告知这里可以做什么。
要使用 IBM MQ v8 和更高版本附带的 jar 文件,您必须使用 Java 7 或更高版本。 IBM 文档表明,从 MQ v8 及更高版本开始,用于 Java 和 JMS 的 IBM MQ classes 是使用 Java 构建的 7. Oracle 文档表明 classes 使用 [=32] 构建=] 7 不能与 Java 6 一起使用。请参阅下面的参考资料:
在MQ v8.0 KC页面中:IBM MQ 8.0.0>IBM MQ>Product overview>What's changed in IBM MQ Version 8.0.0>Java: changes for Java 7
The IBM MQ classes for Java and IBM MQ classes for JMS are now built with Java 7.
The Java 7 runtime environment supports running earlier class file versions.
在MQ v9.0 KC页面中:IBM MQ 9.0.x>IBM MQ>Technical overview>IBM MQ Java language interfaces
From IBM MQ Version 8.0, the IBM MQ classes for Java and IBM MQ classes for JMS are built with Java 7. The Java 7 runtime environment supports running earlier class file versions.
Oracle 文档指出 Java 7 class 文件不能与以下页面中的 Java 6 一起使用: Oracle Java SE 7 and JDK 7 Compatibility -> Binary Compatibility 声明如下:
The class file version for Java SE 7 is 51, as per the JVM Specification, because of the invokedynamic byte code introduced by JSR 292. Version 51 class files produced by the Java SE 7 compiler cannot be used in Java SE 6.
@JoshMc 对 java 和 mq jar 以及所有版本不匹配的解释是绝对正确的。
我想补充一点,虽然我可以通过看到 51 和 50 之间的不匹配来理解错误发生时的情况,但我的问题是以某种方式连接到 MQ 并使应用程序 运行 而无需更改现有装置。这就是我无法将 java 升级到 JDK 1.7 的原因。
但是我通过在 Weblogic Server 的类路径中使用旧的 MQ 7 jar 解决了我的问题。因为我的应用程序表现得像客户端,所以在使用 java 6 构建的 MQ jar 连接到版本 8 的 MQ 服务器时不会有任何问题。所以我刚刚复制了旧的 MQ 7 jar一个文件夹并在我的 Weblogic CLASSPATH 引用中使用该路径,这解决了我的问题。