java 无效的版本号码:版本号可能为负数或大于255

yshpjwxd  于 2022-11-27  发布在  Java
关注(0)|答案(8)|浏览(1450)

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

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是给问题,那么它将是好的。

fwzugrvs

fwzugrvs1#

TLDR;将您的icu4j.jar文件替换为latest version
这可能是由于类路径中的ICU4J版本较旧所致。VersionInfo类的版本号限制为2个字符,即限制为255。由于Java 8现在是1.8.0_291,因此291超出了2个字符的限制,从而导致ICU 4J VersionInfo异常。
ICU-21219已在ICU 4J中修复:68.1

llmtgqce

llmtgqce2#

问题解决了,因为我降级了我的java版本。

n3h0vuf2

n3h0vuf23#

如果你不想升级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);
}
jtjikinw

jtjikinw4#

好吧,我知道这是一个肮脏的黑客,但将“java.version”属性设置为不包含大于255的数字的版本对我来说是有效的:

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

只需在加载类之前设置它(第一次访问),然后恢复原始值。并向库的作者提交一个bug,因为这只是一个变通办法。

mqxuamgl

mqxuamgl5#

我通过排除旧的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>
tquggr8v

tquggr8v6#

我通过从www.example.com更新到www.example.com解决了该问题8.0.0.09.1.0.0

<dependency>
  <groupId>com.ibm.ctg</groupId>
  <artifactId>ctgclient</artifactId>
  <version>9.1.0.0</version>
</dependency>
lb3vh1jj

lb3vh1jj7#

https://academy.jahia.com/training-kb/knowledge-base/invalid-version-number-version-number-may-be-negative-or-greater-than-255上所示

原因在重新启动之前,您的JDK很可能已升级到255以上的版本,从而导致库icu 4J中出现已知错误(cf internal ticket QA-13064)。
解决方案如果无法升级到OpenJDK 11,请对每个节点执行以下步骤:

1.停止节点
1.将库重命名为TOMCAT_HOME/webapps/ROOT/WEB-INF/lib/icu4j-4.0.1.jar,并添加后缀.巴克
1.在同一文件夹中,添加库icu4j-67.1.jar
1.启动节点
如果您只是升级Java子版本,也可以这样做。例如,从1.8.0_211升级到1.8.0_311

vxf3dgd4

vxf3dgd48#

我可以通过切换到与Jenkins兼容的Java版本来解决这个问题。请注意,以下步骤仅在您的系统上安装了多个Java版本时才有效。以下是采取的步骤:
1.使用以下命令检查其他Java版本:sudo更新替代项--配置java
1.选择兼容的java版本
1.重新启动jenkins
希望它有帮助!请让我知道,如果你需要进一步的澄清。

相关问题