gpt4 book ai didi

java - 如何在 jar 中包含 Groovy 扩展方法?

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

我有一个 groovy 库,我将它作为 jar 文件发布到 nexus 存储库上。当我从另一个项目的 Gradle 脚本使用库中的扩展方法时,我得到一个 MissingMethodException。
作为引用,假设我有一个 String 扩展方法,例如:

static boolean containsIgnoreCase(String self, String str) {
self.toLowerCase().contains(str.toLowerCase())
}
如果在我的库中,我使用 "foobar".containsIgnoreCase("Foo") 调用该方法,我会得到异常(exception)。如果我改为使用 StringExtensions.containsIgnoreCase("foobar", "Foo") 调用它,它有效,没问题。
我的猜测是,这是在没有定义扩展的 META-INF 文件的情况下发布 Groovy 项目的问题。这是项目结构:
- Library
- src/main/
- groovy/
- (here are my sources)
- resources/META-INF/groovy
- org.codehaus.groovy.runtime.ExtensionModule (contains details about my extension classes)
我的 ExtensionModule 文件如下所示:
moduleName=string-extensions
moduleVersion=1.0
extensionClasses=com.my.project.StringExtensions
在 build.gradle 的发布块中,我使用以下内容:
plugins {
id 'groovy'
id 'java'
id 'maven-publish'
}

//...

sourceSets {
main.groovy.outputDir = sourceSets.main.java.outputDir
test.groovy.outputDir = sourceSets.test.java.outputDir
}

//...

publishing {

publications {
library(MavenPublication) {
from components.java
}
}

//...
}
当我在另一个项目的 Gradle 构建脚本中使用这个库时,我需要在我的出版物中包含什么才能正确注册扩展方法?我在我的构建脚本中添加了依赖项的类路径/repo url,并且可以访问库的方法 - 这些方法在调用扩展方法时失败。

最佳答案

不是真的和回答 - 只是另一部分信息。
常规版本 2.5+ 兼顾两者:META-INF/servicesMETA-INF/groovy链接:https://github.com/apache/groovy/blob/1c358e84e427b3a6ff808533a93e1d76f4fa0d67/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java#L42
在 groovy 2.5 之前 只有META-INF/services被处理
groovy 扫描名为 org.codehaus.groovy.runtime.ExtensionModule 的资源在 GroovySystem.java 中静态创建 MetaClassRegistry 单例时仅一次
链接:https://github.com/apache/groovy/blob/1c358e84e427b3a6ff808533a93e1d76f4fa0d67/src/main/java/groovy/lang/GroovySystem.java#L37

使用这种方法以某种方式实现它,检查它是如何在 GrapeIvy.groovy 类中完成的
链接:https://github.com/apache/groovy/blob/1c358e84e427b3a6ff808533a93e1d76f4fa0d67/src/main/groovy/groovy/grape/GrapeIvy.groovy#L292

我认为为 gradle 创建插件并使用 metaClass 来定义自定义方法要容易得多

String.metaClass.up={ delegate.toUpperCase() }


task x{
doLast{
println( "hello".up() )
}
}

关于java - 如何在 jar 中包含 Groovy 扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65568716/

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