版本号无效:版本号可能为负数或大于 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>

发布于 https://academy.jahia.com/training-kb/knowledge-base/invalid-version-number-version-number-may-be-negative-or-greater-than-255

原因 很有可能在重启前,你的JDK已经升级到大于255的版本,导致库icu4J出现已知bug(cf internal ticketQA-13064)。

解决方案 如果您无法升级到 OpenJDK 11,请对每个节点执行以下步骤:

  1. 停止你的节点
  2. 重命名库 TOMCAT_HOME/webapps/ROOT/WEB-INF/lib/icu4j-4.0.1.jar 带后缀 .bak
  3. 在同一文件夹中,添加库 icu4j-67.1.jar
  4. 启动你的节点

如果您只是升级 Java 子版本,这也适用。例如从 1.8.0_211 到 1.8.0_311