版本号无效:版本号可能为负数或大于 255
Invalid version number: Version number may be negative or greater than 255
当我尝试访问我的应用程序中的页面时出现以下错误。
SEVERE: Servlet.service() for servlet [jsp] threw exception
java.lang.IllegalArgumentException: Invalid version number: Version number may be negative or greater than 255
at com.ibm.icu.util.VersionInfo.getInstance(VersionInfo.java:191)
at com.ibm.icu.impl.ICUDebug.getInstanceLenient(ICUDebug.java:65)
at com.ibm.icu.impl.ICUDebug.<clinit>(ICUDebug.java:69)
我认为这是由于某些版本不匹配造成的。我如何追踪问题?该应用程序未经过 mavenized,因此我不确定如何检查该问题。至少,如果我知道是哪个 jarfile 出了问题,那就更好了。
我将 java 版本降级后问题已解决。
好吧,我知道这是一个肮脏的 hack,但是将“java.version”属性 设置为不包含数字 >255 的版本对我有用:
System.setProperty("java.version", "1.8.0_254");
在加载class之前设置(第一次访问),然后恢复原始值。并向库的作者提交错误,因为这只是一种解决方法。
TLDR;用 latest version.
替换你的 icu4j.jar
文件
这可能是由于您的 class 路径中的 ICU4J 版本较旧所致。 VersionInfo
class 被限制为 2 个字符的版本号,将限制设置为 255。由于 Java 8 现在是 1.8。0_291,291
超过 2 个字符的限制,导致 ICU4J VersionInfo 异常。
ICU-21219固定在ICU4J:68.1
如果您不想升级 ICU,只需在调用 ICU 内容之前调用这个小辅助函数即可:
/**
* There is a bug in an old ICU version that stops ICU from working when the JDK patch version is larger than
* 255 (like in jdk 1.8.0_261). To work around that we change the local version number, init ICU and change it
* back then.
*/
private void icuHack() {
String javaVersion = System.getProperty("java.version");
int idxOfUnderscore = javaVersion.indexOf('_');
if( idxOfUnderscore == -1 ) {
return;
}
int patchVersion = Integer.parseInt(javaVersion.substring(idxOfUnderscore+1));
if( patchVersion < 256 ) {
return;
}
log.info("Java version '"+javaVersion+"' contains patch version >255, need to do ICU hack.");
System.setProperty("java.version", "1.8.0_254");
new com.ibm.icu.impl.ICUDebug();
System.setProperty("java.version", javaVersion);
}
我通过排除旧的icu4j包解决了这个问题,例如:
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
<exclusions>
<exclusion>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
</exclusion>
</exclusions>
</dependency>
然后参考最新的icu4j包:
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>68.2</version>
</dependency>
我从 8.0.0.0 更新到 9.1.0.0 解决了这个问题
<dependency>
<groupId>com.ibm.ctg</groupId>
<artifactId>ctgclient</artifactId>
<version>9.1.0.0</version>
</dependency>
原因
很有可能在重启前,你的JDK已经升级到大于255的版本,导致库icu4J出现已知bug(cf internal ticketQA-13064)。
解决方案
如果您无法升级到 OpenJDK 11,请对每个节点执行以下步骤:
- 停止你的节点
- 重命名库
TOMCAT_HOME/webapps/ROOT/WEB-INF/lib/icu4j-4.0.1.jar 带后缀
.bak
- 在同一文件夹中,添加库 icu4j-67.1.jar
- 启动你的节点
如果您只是升级 Java 子版本,这也适用。例如从 1.8.0_211 到 1.8.0_311
当我尝试访问我的应用程序中的页面时出现以下错误。
SEVERE: Servlet.service() for servlet [jsp] threw exception
java.lang.IllegalArgumentException: Invalid version number: Version number may be negative or greater than 255
at com.ibm.icu.util.VersionInfo.getInstance(VersionInfo.java:191)
at com.ibm.icu.impl.ICUDebug.getInstanceLenient(ICUDebug.java:65)
at com.ibm.icu.impl.ICUDebug.<clinit>(ICUDebug.java:69)
我认为这是由于某些版本不匹配造成的。我如何追踪问题?该应用程序未经过 mavenized,因此我不确定如何检查该问题。至少,如果我知道是哪个 jarfile 出了问题,那就更好了。
我将 java 版本降级后问题已解决。
好吧,我知道这是一个肮脏的 hack,但是将“java.version”属性 设置为不包含数字 >255 的版本对我有用:
System.setProperty("java.version", "1.8.0_254");
在加载class之前设置(第一次访问),然后恢复原始值。并向库的作者提交错误,因为这只是一种解决方法。
TLDR;用 latest version.
替换你的icu4j.jar
文件
这可能是由于您的 class 路径中的 ICU4J 版本较旧所致。 VersionInfo
class 被限制为 2 个字符的版本号,将限制设置为 255。由于 Java 8 现在是 1.8。0_291,291
超过 2 个字符的限制,导致 ICU4J VersionInfo 异常。
ICU-21219固定在ICU4J:68.1
如果您不想升级 ICU,只需在调用 ICU 内容之前调用这个小辅助函数即可:
/**
* There is a bug in an old ICU version that stops ICU from working when the JDK patch version is larger than
* 255 (like in jdk 1.8.0_261). To work around that we change the local version number, init ICU and change it
* back then.
*/
private void icuHack() {
String javaVersion = System.getProperty("java.version");
int idxOfUnderscore = javaVersion.indexOf('_');
if( idxOfUnderscore == -1 ) {
return;
}
int patchVersion = Integer.parseInt(javaVersion.substring(idxOfUnderscore+1));
if( patchVersion < 256 ) {
return;
}
log.info("Java version '"+javaVersion+"' contains patch version >255, need to do ICU hack.");
System.setProperty("java.version", "1.8.0_254");
new com.ibm.icu.impl.ICUDebug();
System.setProperty("java.version", javaVersion);
}
我通过排除旧的icu4j包解决了这个问题,例如:
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
<exclusions>
<exclusion>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
</exclusion>
</exclusions>
</dependency>
然后参考最新的icu4j包:
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>68.2</version>
</dependency>
我从 8.0.0.0 更新到 9.1.0.0 解决了这个问题
<dependency>
<groupId>com.ibm.ctg</groupId>
<artifactId>ctgclient</artifactId>
<version>9.1.0.0</version>
</dependency>
原因 很有可能在重启前,你的JDK已经升级到大于255的版本,导致库icu4J出现已知bug(cf internal ticketQA-13064)。
解决方案 如果您无法升级到 OpenJDK 11,请对每个节点执行以下步骤:
- 停止你的节点
- 重命名库 TOMCAT_HOME/webapps/ROOT/WEB-INF/lib/icu4j-4.0.1.jar 带后缀 .bak
- 在同一文件夹中,添加库 icu4j-67.1.jar
- 启动你的节点
如果您只是升级 Java 子版本,这也适用。例如从 1.8.0_211 到 1.8.0_311