ich angelegt habe zwei groovy Erweiterungsmodule/Methoden auf java.util.ArrayList()
. Es funktioniert alles sehr gut in meiner IDE. Ich benutze gradle
das Glas zu bauen, und stellen Sie sie an einen entfernten JVM
. Wenn es die entfernte JVM
erreicht, schlägt es fehl.Groovy Extension Module Methode - Keine Unterschrift Methode
Hier ist die Extension-Methode:
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
Hier ist der Code, der sie aufruft:
outputMap[processName][iName] << kBeanList.sumSelectedAttributes([
"messageCount", "userCount", "outstandingRequests",
"cpuUsage", "memoryUsage", "threadCount", "cacheCount", "huserCount",
"manualHuserCount", "dataPointerCount", "tableHandleCount",
"jdbCacheRecordCount", "dbConnectionCount"])
Hier ist der Fehler:
No signature of method: java.util.ArrayList.sumSelectedAttributes() is applicable for argument types: (java.util.ArrayList) values: [[messageCount, incomingConnectionsCount, outgoingConnectionsCount, ...]]
Auch hier funktioniert es gut in intellij mit Testfällen. Was ist auf der Remote-JVM anders, um dies zu verhindern? Hier sind einige Dinge, die mir in dem Sinn kamen:
- Das Remote-JVM verwendet Groovy 2.3 während ich auf 2.4.5
- Wir verwenden einen benutzerdefinierten Classloader auf der Remote-JVM-Klassen zu laden
Darüber hinaus konnte ich keine andere Dokumentation zu etwas Besonderem finden, das ich tun muss, damit Erweiterungen auf Remote-JVMs funktionieren.
Jede Hilfe wird sehr geschätzt.
Pro einen Kommentar, scheint wie ein Problem mit benutzerdefinierten Klassenlader, hier ist die Klasse, die die Manipulation von einigen Klassenladeprogrammen behandelt.
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
}
}
Wenn Sie benutzerdefinierten Class Loader sagen, klingelt es die Alarme;) Generell für Groovy der Lage sein, ein Erweiterungsmodul zu laden, muss dieses Modul an den Loader der Groovy Laufzeit sichtbar. Das unterscheidet sich von der Art, wie Ihre Anwendung normalerweise funktioniert, da der Anwendungsklassenlader die Laufzeit anzeigen muss, die Laufzeit jedoch nicht die Anwendungsklassen anzeigt. Natürlich frage ich mich jetzt, wie Sie das Setup für die Klasseninstallation auf der Remote-JVM installieren. – blackdrag
Vielen Dank für Ihre Antwort, und es klingt, als hätten Sie das Problem sofort erkannt. In diesem Fall ist es einfach unmöglich, Erweiterungsmodule zu verwenden. Können Sie basierend auf meinem Code einen alternativen Ansatz empfehlen? Ich habe irgendwie viel Code geplant. Nur zur Bestätigung, und für die Nachwelt, habe ich gerade die "classloader class" zum ursprünglichen Post für Ihre Rezension hinzugefügt.Es ist in einer Entwicklungsumgebung, wo wir verschiedene Versionen von Gläsern gleichzeitig laden müssen, und Änderungen flexibel laden müssen, ohne JVM neu zu starten. (Dev/Test/Produktzweige). – solvingJ