【问题标题】:Invalid version number: Version number may be negative or greater than 255版本号无效:版本号可能为负数或大于 255
【发布时间】:2021-01-10 09:08:28
【问题描述】:

当我尝试访问应用程序中的页面时出现以下错误。

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)

我认为这是由于某些版本不匹配造成的。如何追踪问题?该应用程序未经过验证,因此我不确定如何检查该问题。至少如果我知道哪个 jarfile 有问题,那就太好了。

【问题讨论】:

  • 如果findjar.com 工作正常,您可以使用findjar com.ibm.icu.util.VersionInfo 查看该类通常在哪些jar 文件中找到(在本例中为icu4j.jar)。后续搜索 'icu4j invalid java version' 可能会导致错误报告ICU-21219 或使用mvnrepository.com/artifact/com.ibm.icu/icu4j 可以找到并下载最新版本。

标签: java version illegalargumentexception


【解决方案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);
}

【讨论】:

  • 不漂亮;一点也不漂亮(所以谢谢,现在去洗你的嘴!)。但我可以确认这确实有效。实际上,我将 java.version 更改为 hackVersion = javaVersion.substring(0, idxOfUnderscore+1) + "254";,这可能是一种“做正确的事”的奇特尝试。当然,真正的正确的事情是让我重写,避免依赖于这个古老版本的 icu4j 的库。也许以后...
【解决方案2】:

TLDR;用latest version 替换您的icu4j.jar 文件。

这可能是由您的类路径中的旧版本 ICU4J 引起的。 VersionInfo 类被限制为 2 个字符的版本号,将限制设置为 255。由于 Java 8 现在是 1.8.0_291,291 超过了 2 个字符的限制,导致 ICU4J VersionInfo 异常。

ICU-21219 已在 ICU4J:68.1 中修复

【讨论】:

    【解决方案3】:

    好吧,我知道这是一个肮脏的 hack,但将“java.version”属性设置为不包含数字 >255 的版本对我有用:

    System.setProperty("java.version", "1.8.0_254");
    

    只需在加载类之前设置它(第一次访问),然后恢复原始值。并向库的作者提交错误,因为这只是一种解决方法。

    【讨论】:

      【解决方案4】:

      当我降级我的 java 版本时问题得到解决。

      【讨论】:

      • 你降级到哪个版本?
      • @sanketpatel 1.8.0_261 到 1.8.0.252 ,目前我正在使用 openjdk。
      • @torno 是的,没错。但是上面的问题是为了理解这个问题,我不知道哪个代码给出了问题。
      • 问题出在icu4j.jar - 用更新的版本(68.1 或更高版本)替换类路径中的那个 jar。
      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 2021-10-12
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2014-09-30
      相关资源
      最近更新 更多