java.lang.NoSuchMethodError: No static method getFont(Landroid/content/Context;ILandroid/util/TypedV

本文记录了一个关于java.lang.NoSuchMethodError的解决过程,该错误出现在尝试使用Android Support库时。通过调整项目的依赖版本,特别是Android Support库的版本,成功解决了这个问题。

最近搞了个新项目报了下面这个错误:

java.lang.NoSuchMethodError: No static method getFont(Landroid/content/Context;ILandroid/util/TypedValue;ILandroid/widget/TextView;)Landroid/graphics/Typeface; in class Landroid/support/v4/content/res/ResourcesCompat; or its super classes (declaration of 'android.support.v4.content.res.ResourcesCompat' appears in /data/app/com.wcyq.gangrong-1/base.apk)
                                                                       at android.support.v7.widget.TintTypedArray.getFont(TintTypedArray.java:119)
                                                                       at android.support.v7.widget.AppCompatTextHelper.updateTypefaceAndStyle(AppCompatTextHelper.java:208)
                                                                       at android.support.v7.widget.AppCompatTextHelper.loadFromAttributes(AppCompatTextHelper.java:110)
                                                                       at android.support.v7.widget.AppCompatTextHelperV17.loadFromAttributes(AppCompatTextHelperV17.java:38)
                                                                       at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:81)
                                                                       at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:71)
                                                                       at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:67)
                                                                       at android.support.v7.widget.Toolbar.setTitle(Toolbar.java:753)
                                                                       at android.support.v7.widget.ToolbarWidgetWrapper.setTitleInt(ToolbarWidgetWrapper.java:261)
                                                                       at android.support.v7.widget.ToolbarWidgetWrapper.setWindowTitle(ToolbarWidgetWrapper.java:243)
                                                                       at android.support.v7.widget.ActionBarOverlayLayout.setWindowTitle(ActionBarOverlayLayout.java:621)
                                                                       at android.support.v7.app.AppCompatDelegateImplV9.onTitleChanged(AppCompatDelegateImplV9.java:631)
                                                                       at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:328)
                                                                       at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284)
                                                                       at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
                                                                       at com.wcyq.gangrong.MainActivity.onCreate(MainActivity.java:11)
                                                                       at android.app.Activity.performCreate(Activity.java:6285)
                                                                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2698)
                                                                       at android.app.ActivityThread.access$1000(ActivityThread.java:195)
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                       at android.os.Looper.loop(Looper.java:207)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5856)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1026)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:887)

真心这个错误找了好久,就是找不出来,代码也看了,后来百度了一通没有也没有找到好的答案:

后来无意中别人提醒可能是依赖V4包出了问题  ;

更改前的配置信息:

            compileSdkVersion   : 26,
            buildToolsVersion   : '26.0.2',
            minSdkVersion       : 16,
            targetSdkVersion    : 26,
            versionCode         : 1,
            versionName         : "1.0.0",
            applicationId       : "com.xxxx,

            androidSupportSdkVersion: "26.0.2"

更改后的配置信息:

 android = [
            compileSdkVersion   : 27,
            buildToolsVersion   : '26.0.2',
            minSdkVersion       : 17,
            targetSdkVersion    : 27,
            versionCode         : 1,
            versionName         : "1.0.0",
            applicationId       : "com.xxxxx",

            androidSupportSdkVersion: "27.0.2"

    ]
产生的原因是依赖包冲突了,  就改了这么一点点代码,提高了一下版本,这个错误就没有了. 希望遇到相同问题的人能给你提供相应的帮助!














<think>好的,我需要解决用户提到的Java中的NoSuchMethodError异常,具体是方法Lcom/viewat/logic/NtPos cEmvLib_IccCommand缺失的问题。首先,我得回忆一下NoSuchMethodError的常见原因,通常这类错误是因为编译时存在某个方法,但运行时找不到,可能是依赖冲突或者版本不一致导致的。 用户提供的几个引用中提到了不同的解决方法,比如包冲突、版本问题、排除自动配置等。例如引用[1]和[4]提到JSON库的版本问题,引用[3]和[5]涉及到Guava和Gson的配置问题。这说明依赖管理是关键因素。 接下来,我需要分析用户的具体错误信息。错误信息中的方法cEmvLib_IccCommand属于NtPos类,可能这个类所在的库在编译时和运行时版本不一致。可能的原因有:1)项目依赖了多个版本的同一库,导致运行时加载了旧版本;2)编译时使用的库版本包含该方法,但运行时使用的版本不包含;3)类路径中存在冲突的jar包。 解决方案方面,首先要检查依赖树,查看是否有版本冲突。可以用Maven的mvn dependency:tree或者Gradle的dependencies任务来排查。然后排除旧版本的依赖,确保使用正确的版本。如果问题依旧,可能需要检查编译环境和运行环境是否一致,包括IDE配置和构建工具的设置。另外,清理缓存和重新构建项目也是必要的步骤,比如mvn clean install。 用户提供的引用中,例如引用[4]提到更新fastjson版本解决类似问题,这可能适用于用户的情况,如果NtPos类所在的库有更新的版本,可能需要升级。另外,引用[5]中提到的排除自动配置可能不适用,但说明配置问题也可能导致类加载异常。 最后,生成相关问题时要覆盖依赖冲突的其他表现、排查工具的使用、多模块项目处理方式,以及与其他类似错误的区别,如NoClassDefFoundError。这样用户能全面了解相关问题,自行排查其他潜在问题。</think>针对$java.lang.NoSuchMethodError$报错中提到的$Lcom/viewat/logic/NtPos cEmvLib_IccCommand$方法缺失问题,以下是系统性解决方案: ### 一、错误原因分析 该异常的直接原因是:**JVM在运行时环境中找不到特定方法的实现**,常见于以下场景: 1. **依赖版本不一致**:编译时使用包含该方法的库版本,运行时加载了不包含该方法的旧版本库[^1][^4] 2. **多重依赖冲突**:多个依赖项引入同一库的不同版本,Maven/Gradle最终选择旧版本[^2][^3] 3. **编译/运行环境差异**:开发环境与生产环境的依赖配置不一致 4. **动态加载问题**:类加载器未正确加载包含该方法的类 ### 二、排查与解决步骤 #### 1. 验证依赖树 使用构建工具查看完整依赖关系: ```bash # Maven项目 mvn dependency:tree > dependencies.txt # Gradle项目 gradle dependencies > dependencies.txt ``` 在输出结果中搜索涉及`com.viewat.logic`的库,确认是否存在多个版本 #### 2. 强制指定版本 在构建配置中显式声明正确版本(示例为Maven): ```xml <dependency> <groupId>com.viewat</groupId> <artifactId>ntpos-lib</artifactId> <version>2.1.4</version> <!-- 确认包含cEmvLib_IccCommand的版本 --> <exclusions> <exclusion> <groupId>org.conflicting</groupId> <artifactId>library</artifactId> </exclusion> </exclusions> </dependency> ``` #### 3. 检查类路径 通过以下命令验证运行时实际加载的JAR: ```bash # Linux/Mac ps aux | grep java jcmd <PID> VM.system_properties | grep class.path # 或运行时打印类路径 System.getProperty("java.class.path").split(":").forEach(System.out::println); ``` #### 4. 清理构建缓存 ```bash mvn clean install -U # Maven强制更新快照 gradle clean build --refresh-dependencies # Gradle刷新依赖 ``` ### 三、进阶验证手段 1. **反编译验证**:使用JD-GUI工具打开相关JAR文件,确认`NtPos`类是否包含目标方法 2. **运行时追踪**:添加JVM参数`-verbose:class`观察类加载过程 3. **单元测试验证**:编写反射测试验证方法存在性 ```java try { Class<?> clazz = Class.forName("com.viewat.logic.NtPos"); clazz.getDeclaredMethod("cEmvLib_IccCommand"); System.out.println("方法存在"); } catch (Exception e) { e.printStackTrace(); } ``` ### 四、预防措施 1. 使用依赖管理工具(如Maven BOM)统一版本 2. 在CI/CD流程中加入依赖检查: ```xml <!-- Maven Enforcer插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <id>enforce</id> <configuration> <rules> <dependencyConvergence/> </rules> </configuration> </execution> </executions> </plugin> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值