- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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")
调用它,它有效,没问题。
- 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/services
和 META-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/
我是一名优秀的程序员,十分优秀!