gradleCaused by: groovy.lang.MissingMethodException: No signature of method的解决方案和检查方法

Posted HanLiangJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gradleCaused by: groovy.lang.MissingMethodException: No signature of method的解决方案和检查方法相关的知识,希望对你有一定的参考价值。

【gradle】Caused by: groovy.lang.MissingMethodException: No signature of method的解决方案和检查方法

最近在编写gradle插件的时候报了这个错。找了一圈网上的方法也没有系统性的检查方法,因此记录一下我在解决这个报错时踩的坑。

出现这个报错最主要的问题肯定就是和这个method相关的脚本出现了方法调用或者环境配置上的问题。因此我们按照这个思路分别检查以下问题。

方法调用引发的报错

  1. 方法调用时是否存在错误,最低级的错误就是调用的方法名和脚本编写的方法名对不上。按照这个思路顺序检查大小写、单词拼写问题即可。
  2. 层级结构问题,搞错了脚本方法的层级结构,导致无法调用到对应的方法。
    一般遇到这类问题都是比较容易检查的,但也不要忽略这类低级错误的存在。

环境配置引发的报错

这类问题的解决比较复杂,需要仔细检查。我也是在这个地方绕了一圈(说白了还是gradle学艺不精orz)

检查点1:是否需要重新打包

在改写一些前人写的脚本时,可能脚本的源代码只是放在项目中,真正依赖的插件早已是远程仓库中发布的依赖(本人踩坑点其一)。

所以如果要测试,可以根据需要重新将修改后的插件代码打jar包。
打jar包参考:gradle项目发布

打完jar包后进行项目的配置,引入本地仓库中对应插件的依赖。

检查点2:插件依赖重名

在项目中,往往已经引入了远程仓库的插件依赖,这个时候就要解决插件依赖重名的问题。

如果只是插件版本冲突:本地仓库的插件版本已经在远程仓库发布过了,所以需要重新设置版本号;

如果是远程仓库调用过该插件,那么可以有2种解决方案:

第一种,在对应的repositories和dependencies中把仓库和插件写在最前面,这种方式可以不改写原项目引用远程仓库插件的代码,可以保证后续把调试完成的插件发布到远程仓库后依旧可以保持原项目使用。

第二种,直接注释掉原代码中引用的同名依赖即可。

检查点3:添加依赖的位置

检查原项目中引入依赖的位置是在settings.gradle还是build.gradle(本人踩坑点二)。AS在sync的时候执行的配置顺序是:

  1. settings.gralde
  2. 项目的build.gradle
  3. APP的build.gradle

在所以要先检查settings.gradle中是否已经添加了远程仓库中的重名插件,并且如检查点2中一样在该远程仓库的前面添加本地仓库的依赖和插件,不然就算在build.gradle或settings.gradle的后半段中添加了本地仓库的依赖,仍旧会优先掉用远程仓库中的原插件,导致添加或修改的方法调用无法生效(你引入的都是远程仓库的插件了,自然用不到本地仓库修改后的方法)。

这里要注意,AS仍然会检查build.gradle中的本地仓库依赖是否存在,但不会调用

总结

主要还是本人对gradle的调用顺序不熟悉导致了这次问题,本人安卓学习小白。文中如有错误欢迎指出,该问题上发生其他问题也欢迎共同探讨。

查询方法 find...By、read...By、query...By 和 get...By 在 spring 数据中有啥区别?

【中文标题】查询方法 find...By、read...By、query...By 和 get...By 在 spring 数据中有啥区别?【英文标题】:What is the difference between query-methods find…By, read…By, query…By, and get…By in spring data?查询方法 find...By、read...By、query...By 和 get...By 在 spring 数据中有什么区别? 【发布时间】:2017-02-13 15:31:54 【问题描述】:

我正在查看弹簧数据的docs,但没有找到使用方法read...Byget...By 而不是find...By 的理由(就像通常那样)。 请澄清:

这些方法有什么作用? 或者这种方法的目的是什么? 在什么情况下使用这种方法更好? 它们之间有什么区别?

你能写一个query..By方法的例子吗?

【问题讨论】:

这四种方法没有区别。这些已作为适合个人偏好的选项提供,因为不同的开发人员可能对他们希望如何命名其访问器方法有不同的偏好。 Foo findByName (String name)Foo getByName (String name)Foo queryByName (String name)Foo readByName (String name) 都是等价的 - 它们会找到一个名称与作为 name 参数传递的值匹配的 Foo 【参考方案1】:

在我看来,接受的答案是不正确的。这两种情况在内部是不同的:

getById() 返回对具有给定标识符的实体的引用。它调用EntityManager.getReference()返回一个惰性代理。因此,当您无法处理此响应时 - 在尝试获取惰性字段时,您将收到 LazyInitializationException。 findById() 从数据库中获取真实对象

【讨论】:

【参考方案2】:

我不知道 Spring 过去是如何实现这一点的,但至少目前它们相同(只是别名)是不正确的。

Spring JPA 位于 JPA 之上。因此,这些操作中的每一个都映射到 标准 JPA 操作:

findById(id) -> [在 JPA 上] entityManager.find

虽然, getOne(id) -> [JPA] entityManager.getReference

那么 JPA 有什么不同呢?

entityManager.find 直接进入数据库,执行查询并在内存中获取结果。很简单。

entityManager.getReference 使用较少(因为不知道)。这是一种懒惰的发现。 也就是说,它不会直接进入数据库。仅在使用数据时才有效。它的主要目标是当您只想引用某个实体但您不会使用该实体时。

例如:

class Customer 
    Long id;
    ... many other fields


class Order 

    Customer customer;
    // ... other

你想保存一个新的Order

var order = new Order();
// order.setCustomer(repo.findById(123L));  // Opt 1: goes directly to DB and load everything from this customer. But we don't need it all
order.setCustomer(repo.getOne(123L));  // Opt 2: Won't go to DB for the customer
orderRepo.saveOrUpdate(order);

您可以查看解释差异的整篇文章,更好地了解 getReference 此处:https://vladmihalcea.com/entitymanager-find-getreference-jpa/

【讨论】:

【参考方案3】:

我想这会帮助你理解..

这两个接口的区别在于它们方法的语义。 CRUD 存储库“找到”一些东西,而 JPA 存储库“获取”一些东西。虽然“find”可能根本没有结果,但“get”总是会返回一些东西——否则 JPA 存储库会抛出异常。

来源:https://tuhrig.de/find-vs-get/

你也可以看到这篇文章。 https://softwareengineering.stackexchange.com/questions/182113/how-and-why-to-decide-between-naming-methods-with-get-and-find-prefixes

【讨论】:

你真的试过这个吗?对我来说,get 正在返回 null,就像 find..【参考方案4】:

我不知道其他子项目如何,但是对于 Spring Data JPA (1.10.2),这些方法将作为别名工作。每个方法调用都将生成相同的条件查询(和相同的 SQL 查询)。

在内部,这些前缀之间没有区别。它仅用于查询模式匹配:

private static final String QUERY_PATTERN = "find|read|get|query|stream";

https://github.com/spring-projects/spring-data-commons/blob/8bc022ebd7097b921ae1ef6c87f0ae9fc05bba5f/src/main/java/org/springframework/data/repository/query/parser/PartTree.java#L54

remove...Bydelete...By 方法使用相同的方法:

private static final String DELETE_PATTERN = "delete|remove";

【讨论】:

在这里看到了很好的解释:javacodemonk.com/post/87/… 赞成分享它实施的地方!

以上是关于gradleCaused by: groovy.lang.MissingMethodException: No signature of method的解决方案和检查方法的主要内容,如果未能解决你的问题,请参考以下文章