gpt4 book ai didi

java - Groovy 扩展模块方法 - 没有方法签名

转载 作者:行者123 更新时间:2023-12-03 03:13:36 25 4
gpt4 key购买 nike

我在 java.util.ArrayList() 上创建了两个 groovy 扩展模块/方法.它在我的 IDE 中运行良好。我用 gradle构建 jar,并将其部署到远程 JVM .当它到达远程JVM , 它失败。

这是扩展方法:

    static Map sumSelectedAttributes(final List self, List attributes) {
Map resultsMap = [:]
attributes.each { attr ->
resultsMap[attr] = self.inject(0) { sum, obj ->
sum + obj[attr]
}
}
return resultsMap

这是调用它的代码:
outputMap[processName][iName] << kBeanList.sumSelectedAttributes([
"messageCount", "userCount", "outstandingRequests",
"cpuUsage", "memoryUsage", "threadCount", "cacheCount", "huserCount",
"manualHuserCount", "dataPointerCount", "tableHandleCount",
"jdbCacheRecordCount", "dbConnectionCount"])

这是错误:

No signature of method: java.util.ArrayList.sumSelectedAttributes() is applicable for argument types: (java.util.ArrayList) values: [[messageCount, incomingConnectionsCount, outgoingConnectionsCount, ...]]



同样,它在带有测试用例的 intellij 中运行良好。远程 JVM 上有什么不同会阻止它工作?以下是我想到的一些事情:
  • 远程 JVM 使用 Groovy 2.3 而我在 2.4.5
  • 我们在远程 JVM 上使用自定义类加载器来加载类

  • 除此之外,我找不到任何其他文档,说明我需要做些什么才能使扩展在远程 JVM 上工作。

    任何帮助是极大的赞赏。

    根据评论,自定义类加载器似乎存在问题,这是处理一些类加载器操作的类。
    class CustomLoader {
    static Map loaders = [:]
    static File loaderRoot = new File("../branches")

    static URLClassLoader getCustomLoader(String branchName) {
    if (!loaders[branchName]) {
    loaders[branchName] = new URLClassLoader(getUrls(branchName))
    } else {
    loaders[branchName]
    }
    }

    static URLClassLoader updateClassLoader(String branchName) {
    loaders[branchName] = null
    loaders[branchName] = new URLClassLoader(getUrls(branchName))
    }

    private static URL[] getUrls(String branchName) {
    def loaderDir = new File(loaderRoot, branchName)
    List<File> files = []
    loaderDir.eachFileRecurse{
    if (it.name.endsWith('.jar')) {
    files << it
    }
    }
    List urls = files.sort{ it.name }.reverse().collect{it.toURI().toURL()}
    return urls
    }
    }

    最佳答案

    要手动注册扩展方法模块,您可以使用类似于 GrapeIvy 中使用的代码。因为葡萄有同样的问题,他们在错误的加载器中使 jar 可见,但仍想启用扩展方法。有问题的代码在这里:

    JarFile jar = new JarFile(file)
    def entry = jar.getEntry(ExtensionModuleScanner.MODULE_META_INF_FILE)
    if (entry) {
    Properties props = new Properties()
    props.load(jar.getInputStream(entry))
    Map<CachedClass, List<MetaMethod>> metaMethods = new HashMap<CachedClass, List<MetaMethod>>()
    mcRegistry.registerExtensionModuleFromProperties(props, loader, metaMethods)
    // add old methods to the map
    metaMethods.each { CachedClass c, List<MetaMethod> methods ->
    // GROOVY-5543: if a module was loaded using grab, there are chances that subclasses
    // have their own ClassInfo, and we must change them as well!
    Set<CachedClass> classesToBeUpdated = [c]
    ClassInfo.onAllClassInfo { ClassInfo info ->
    if (c.theClass.isAssignableFrom(info.cachedClass.theClass)) {
    classesToBeUpdated << info.cachedClass
    }
    }
    classesToBeUpdated*.addNewMopMethods(methods)
    }
    }

    在这个代码文件中是一个代表 jar 的文件。在你的情况下,你需要在这里有别的东西。基本上我们首先将描述 rune 件加载到属性中,调用 registerExtensionModuleFromProperties根据给定的类加载器使用 MetaMethods 填充映射。这是解决问题的关键部分,这里正确的类加载器是一个可以加载扩展模块和 groovy 运行时中的所有类的类加载器!在此之后,任何新的元类都会知道扩展方法。仅当已经存在元类时才需要以下代码,您想了解这些新方法。

    关于java - Groovy 扩展模块方法 - 没有方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36762144/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com