【问题标题】:java.lang.NoSuchMethodError: com.sun.istack.localization.LocalizableMessageFactoryjava.lang.NoSuchMethodError: com.sun.istack.localization.LocalizableMessageFactory
【发布时间】:2021-02-11 07:35:20
【问题描述】:

我在使用 istack-commons-runtime-3.0.11/4.0.0 jar 时遇到错误。还尝试按照一些博客的建议使用较低版本的 JAR,但没有奏效。

错误: java.lang.NoSuchMethodError: com.sun.istack.localization.LocalizableMessageFactory.(Ljava/lang/String;Lcom/sun/istack/localization/LocalizableMessageFactory$ResourceBundleSupplier;)V]

非常感谢任何形式的帮助。

【问题讨论】:

标签: java nosuchmethoderror


【解决方案1】:

NoSuchMethodError 表示您的类路径中有不兼容的版本。

您需要检查类路径中的所有 jar 是否存在重复的类。

JAXB 的问题在于,它被许多供应商为 Java11 重新打包,现在您可以找到多个相互不兼容的实现。这是一个丑陋的任务,尤其是许多第三方库不计后果地声明对特定 JAXB 实现的依赖(在 maven 的情况下,除了“提供”之外的范围)。

我也遇到了同样的问题,在我的例子中,jaxb-impl 根本不应该在类路径中(因为我使用的是更新版本,由 glassfish 打包)。

【讨论】:

    【解决方案2】:

    刚刚遇到了类似的 Kidda 问题,我就是这样解决的。以下步骤是添加库的一种工作方式。我已经正确完成了前两个步骤,但是我没有通过将“.jar”文件直接从文件系统拖到我的 Eclipse 项目的“lib”文件夹中来完成最后一个步骤。此外,我必须从构建路径和“lib”文件夹中删除以前版本的库。

    第 1 步 - 将 .jar 添加到构建路径 在此处输入图片说明

    第 2 步 - 关联源代码和 javadocs(可选) 在此处输入图片说明

    第 3 步 - 实际将 .jar 文件拖入“lib”文件夹(非可选)

    【讨论】:

    • 我已经在 lib 文件夹下添加了 JAR,并且我可以在构建路径中看到它。似乎很少有像 jaxb-core 这样的其他 JAR 包含具有相似名称的类。这导致了类加载器的混乱。如何向类加载器指定我只需要从特定 JAR 加载类?
    【解决方案3】:

    这是istack-commons-runtime-4.0.0的内容:

    如您所见,它有您所需要的。因此,如果您收到 NoSuchMethod 错误,则意味着您的库中某处存在另一个冲突版本。

    /*
     * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
     *
     * This program and the accompanying materials are made available under the
     * terms of the Eclipse Distribution License v. 1.0, which is available at
     * http://www.eclipse.org/org/documents/edl-v10.php.
     *
     * SPDX-License-Identifier: BSD-3-Clause
     */
    
    package com.sun.istack.localization;
    
    import java.util.Locale;
    import java.util.ResourceBundle;
    
    /**
     * @author WS Development Team
     */
    public class LocalizableMessageFactory {
    
        private final String _bundlename;
        private final ResourceBundleSupplier _rbSupplier;
    
        @Deprecated
        public LocalizableMessageFactory(String bundlename) {
            _bundlename = bundlename;
            _rbSupplier = null;
        }
    
        public LocalizableMessageFactory(String bundlename, ResourceBundleSupplier rbSupplier) {
            _bundlename = bundlename;
            _rbSupplier = rbSupplier;
        }
    
        public Localizable getMessage(String key, Object... args) {
            return new LocalizableMessage(_bundlename, _rbSupplier, key, args);
        }
    
        public interface ResourceBundleSupplier {
            /**
             * Gets the ResourceBundle.
             * @param locale the requested bundle's locale
             * @return ResourceBundle
             */
            ResourceBundle getResourceBundle(Locale locale);
        }
    
    }
    

    如果您使用 Maven,请打开您的 IDE(Eclipse/Intellij),打开您的 pom.xml 文件,然后查看您的依赖项并过滤 istack,看看是否包含作为传递依赖项的较低版本。

    在 eclipse 中,点击 pom.xml --> Dependencies --> 在你的过滤器中输入 istack。

    例子:

    【讨论】:

    • 你是对的。可能 jaxb-core 具有类似名称的类。但我没有使用 maven,而是在“lib”文件夹下添加 JAR。如果两个 JAR 都需要并参考特定版本的 LocalizedMessageFactory 类形式 istack-commons JAR,我应该如何解决这个问题?
    • @shubhambhopale 它不会仅仅通过 ClassName 产生冲突,它还必须匹配 com.sun.istack.localization 包,因此我认为你有一个完全包含这个包的 jar...我不知道如何从 libs/jars 中排除依赖项...我知道它可以由 maven 完成...
    • 不,没那么简单。 JAXB 被多次重新打包,并且该类可以在任何名称中具有“jax”或被引用的 jar 中。
    猜你喜欢
    • 2022-12-08
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2017-10-11
    • 2014-11-03
    • 2013-12-04
    • 2016-04-16
    相关资源
    最近更新 更多