Ich habe drei Fälle ausprobiert und die Resultate (Classloader und Möglichkeit der Service-Aufrufe) beschrieben. Für jeden Fall habe ich erwähnt wo die fs-webrt.jar, sowie unsere service.jar deployed sind und über welche Classloader der Service sowie die FirstSpirit Connection (context.getConnection()) geladen wurden.
Der u.g. statische Methodenaufruf bezieht sich auf ein Beanshell-Script, welches in der Seitengenerierung verwendet wird und eine statische Methode aus einer Klasse des Service-JARs aufruft. Diese statische Methode hat folgende Signatur:
public static String getPermaLink(final GenerationScriptContext context, final IDProvider element,final String languageId, final String contentId, final String uidPrefix, final String templateSet) {
In den Fällen in denen die Methode in der Seiten-Preview nicht aufrufbar war vermuten wir stark, dass die Signatur nicht gematched hat, da das Objekt vom Typ GenerationScriptContext aus einem anderen Classloader stammt, als die Klasse der o.g. statischen Methode.
Fs-WebRT in tomcat/lib
Service-JAR in tomcat/lib:
Service: org.apache.catalina.loader.StandardClassLoader@5b8b3f9a,
Connection: WebappClassLoader context: /fs5webedit delegate: false repositories: ----------> Parent Classloader: org.apache.catalina.loader.StandardClassLoader@5b8b3f9a
Service Aufruf OK, Statischer Methoden Aufruf nicht OK
Fs-WebRT in tomcat/lib
Service-JAR in fs5webedit/lib:
Service: de.espirit.firstspirit.server.module.ModuleClassesLoader@13b56e1d-81,
Connection: WebappClassLoader context: /fs5webedit delegate: false repositories: ----------> Parent Classloader: org.apache.catalina.loader.StandardClassLoader@114662e3
Service Aufruf nicht OK, Statischer Methoden Aufruf OK
Fs-WebRT in tomcat/lib
Service-JAR not deployed:
Service: de.espirit.firstspirit.server.module.ModuleClassesLoader@49a2e909-101,
Connection: WebappClassLoader context: /fs5webedit delegate: false repositories: ----------> Parent Classloader: org.apache.catalina.loader.StandardClassLoader@12fcc66a
Service Aufruf nicht OK, Statischer Methoden Aufruf OK
Wir haben, erfolglos, ebenfalls versucht die fs-webrt.jar mit in die WEB-INF/lib zu deployen, konnten jedoch keine Verbesserung feststellen.
Warum unterscheiden sich Fall 2 und Fall 3 nicht? Ich hätte für Fall 2 erwartet, dass der Service über den WebAppClassLoader geladen wird, da die JAR in der WEB-IN/lib deployed ist.
Der Vollständigkeit halber anbei noch das Script zum Testen der Service-Aufrufe:
//!Beanshell
import com.bosch.fsm.dialogue.DialogueHelper;
import de.espirit.firstspirit.store.access.pagestore.PageImpl;
import de.espirit.firstspirit.store.access.pagestore.SectionImpl;
import de.espirit.firstspirit.store.access.contentstore.Content2Impl;
import de.espirit.or.schema.Entity;
import com.bosch.fsm.ams.ActivityManagerServiceImpl;
service = new ActivityManagerServiceImpl();
DialogueHelper.showInfoDialogue(context, "Classloaders", "Service: " + service.getClass().getClassLoader().toString() + ", Connection: " + context.getConnection().getClass().getClassLoader().toString());
try {
someService = context.getConnection().getService("ActivityManagerService");
DialogueHelper.showInfoDialogue(context, "Service found", "Everything fine.");
} catch(Exception e) {
DialogueHelper.showErrorDialogue(context, "Service not found", "Nothing fine.", e);
}