【发布时间】:2016-04-21 07:07:29
【问题描述】:
我在 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"])
这里是错误:
没有方法签名:java.util.ArrayList.sumSelectedAttributes() 是 适用于参数类型:(java.util.ArrayList) 值: [[messageCount,incomingConnectionsCount,outgoingConnectionsCount, ...]]
同样,它在带有测试用例的 intellij 中运行良好。远程 JVM 上有什么不同会阻止它工作?以下是我想到的一些事情:
- 远程 JVM 在我使用 2.4.5 时使用 Groovy 2.3
- 我们在远程 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
}
}
【问题讨论】:
-
当您说自定义类加载器时,它会敲响警报;) 通常,为了让 Groovy 能够加载扩展模块,该模块必须对 Groovy 运行时的加载器可见。这与您的应用程序正常工作的方式不同,因为应用程序类加载器需要查看运行时,但运行时看不到应用程序类。所以当然我现在想知道你在远程 JVM 上的实际类加载设置。
-
感谢您的回复,听起来您已经立即发现了问题。在这种情况下,是不是根本不可能使用扩展模块。根据我的代码,您能推荐一些替代方法吗?我为此计划了很多代码。只是为了确认,为了后代,我刚刚在原始帖子中添加了“类加载器类”供您查看。它在一个开发盒上,我们需要同时加载不同版本的 jar,并且需要灵活加载更改而无需重新启动 JVM。 (开发/测试/产品分支)。
标签: java gradle groovy jar urlclassloader