# ClassLoader für Axis2 setzen



## meguma (14. Feb 2011)

Ich habe folgendes Problem im Zusammenspiel von Tomcat, AXIS2 und einem verschlüsseltem jar (componio-Verschlüsselungstool). Ich poste das Problem unter AXIS, weil ich vermute das hier die Lösung liegt, aber seht selber.

Kurzbeschreibung des Problems:
WebService mit Tomcat 6.0.26 und Axis2 1.4.. Zusätzlich eine hauseigene Software die bei Nutzung des WebServices aufgerufen/verwendet wird.
Mindestens die hauseigene Software soll verschlüsselt werden. Wir verwenden dazu componio, wobei das nach meinen bisherigen Kenntnissen keinen Unterschied macht.
In verschiedenen Szenarien den Dienst nicht nur zu starten sondern Ihn auch zu benutzen ;-) treten verschiedene Probleme auf.
Also bisher liegen, bis auf unsere hauseigene jar-Datei (als .sjar), alle jar's unverschlüsselt vor. 
Nur der Vollständigkeit halber - Wenn alle jar's unverschlüsselt sind (also auch unsere) dann läuft alles wie gewünscht.
Da der Componio-ClassLoader (SjarClassLoader) nicht von uns ist sondern vom Verschlüsselungstool-Hersteller geschrieben wurde 
haben wir dort keine Möglichkeit der Erweiterung (SjarClassLoader ist "final" und kein Interface)
Das Grundproblem scheint darin zu liegen das ich irgendwie dem Webservice bzw. der AXIS-Implementierung beibringen muss einen anderen ClassLoader zu verwenden wenn Methoden
unserer Software aufgerufen werden bzw wenn Klassen aus unserem SJAR-Instantiiert werden sollen. Aber "wo", "wie" und "ob" kann ich nicht rausfinden.
Also dann zu meinen bisherigen Ergebnissen
===========================================
Szenario 1: Starten des Tomcat ohne setzen eines speziellen ClassLoaders in der context.xml des Tomcat
Ergebnis: Server startet fehlerfrei und der WebService wird im Browser in der Liste der Services angezeigt. Bis hierher wird noch nicht auf die verschlüsselte sjar-Datei zugegriffen.
Bei Aufruf einer Methode des WebServices erscheint im Browser:
AXIS error
Sorry, something seems to have gone wrong... here are the details:
Exception - java.lang.NoClassDefFoundError: de/<name>/webservice/WebserviceToServerCommClient

Die nicht gefundene Klasse befindet sich in der sjar-Datei.
Das Ergebins hat mich nicht verwundert, weil wie sollte Axis auch wissen wie es in das SJAR reingucken kann.
Dann folgendes ausprobiert, weil ich nicht gefunden habe wie man den ClassLoader für AXIS alleine setzen kann (z.B. in der web.xml der WebAppl /axis
========================================
Szenario 2: Setzen eines ClassLoaders in der context.xml
In context.xml folgendes eingetragen 
<Loader loaderClass="com.componio.jarcryp.SjarClassLoader" className="com.componio.jarcryp.SjarClassLoader"></Loader>

Dabei ist es egal ob ich nur "loaderClass" setze oder nur "className". Bei nur "loaderClass" bekomme ich in der Startphase des Tomcat diesen Error-Stacktrace

14.02.2011 09:17:25 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\Testsystem_OIPD_SJAR\OIPD_Test_SJAR\lib\external
14.02.2011 09:17:26 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
14.02.2011 09:17:26 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1432 ms
14.02.2011 09:17:26 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
14.02.2011 09:17:26 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.26
14.02.2011 09:17:26 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory axis
14.02.2011 09:17:26 org.apache.catalina.loader.WebappLoader start
SCHWERWIEGEND: LifecycleException
java.lang.ClassCastException: com.componio.jarcryp.SjarClassLoader cannot be cast to org.apache.catalina.loader.WebappClassLoader
        at org.apache.catalina.loader.WebappLoader.createClassLoader(WebappLoader.java:782)
        at org.apache.catalina.loader.WebappLoader.start(WebappLoader.java:638)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4341)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
        at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
        at org.apache.catalina.core.StandardService.start(StandardService.java:519)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
14.02.2011 09:17:26 org.apache.catalina.core.ContainerBase addChildInternal
SCHWERWIEGEND: ContainerBase.addChild: start:
LifecycleException:  start: :  java.lang.ClassCastException: com.componio.jarcryp.SjarClassLoader cannot be cast to org.apache.catalina.loader.WebappClassLoader
        at org.apache.catalina.loader.WebappLoader.start(WebappLoader.java:679)
....
14.02.2011 09:17:27 org.apache.catalina.startup.Catalina start
INFO: Server startup in 1012 ms


Wenn ich nur "className" oder beides (verhält sie gleich) setze dann erhalte ich:


14.02.2011 09:20:05 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\Testsystem_OIPD_SJAR\OIPD_Test_SJAR\lib\external
14.02.2011 09:20:05 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
14.02.2011 09:20:05 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1439 ms
14.02.2011 09:20:06 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
14.02.2011 09:20:06 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.26
14.02.2011 09:20:06 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory axis
14.02.2011 09:20:06 org.apache.tomcat.util.digester.Digester startElement
SCHWERWIEGEND: Begin event threw exception
java.lang.InstantiationException: com.componio.jarcryp.SjarClassLoader
        at java.lang.Class.newInstance0(Class.java:340)
        at java.lang.Class.newInstance(Class.java:308)
        at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:206)
        at org.apache.tomcat.util.digester.Rule.begin(Rule.java:153)
        at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1356)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1363)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2755)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
        at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1642)
        at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:789)
        at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:728)
        at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:1014)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:279)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.StandardContext.init(StandardContext.java:5439)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4215)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
        at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
        at org.apache.catalina.core.StandardService.start(StandardService.java:519)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
14.02.2011 09:20:06 org.apache.catalina.startup.ContextConfig processContextConfig
SCHWERWIEGEND: Parse error in context.xml for /axis
java.lang.InstantiationException: com.componio.jarcryp.SjarClassLoader
        at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2806)
        at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2832)
        at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1359)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1363)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2755)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
        at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1642)
        at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:789)
        at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:728)
        at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:1014)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:279)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.StandardContext.init(StandardContext.java:5439)
        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4215)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
        at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
        at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
        at org.apache.catalina.core.StandardService.start(StandardService.java:519)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.InstantiationException: com.componio.jarcryp.SjarClassLoader
        at java.lang.Class.newInstance0(Class.java:340)
        at java.lang.Class.newInstance(Class.java:308)
        at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:206)
        at org.apache.tomcat.util.digester.Rule.begin(Rule.java:153)
        at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1356)
        ... 40 more
14.02.2011 09:20:06 org.apache.catalina.startup.ContextConfig processContextConfig
....
14.02.2011 09:20:08 org.apache.catalina.startup.Catalina start
INFO: Server startup in 2119 ms

In beiden Varinaten kannman erkenne das er zumindest was mit dem SjarClassLoader versucht aber Ihn entweder 
nicht 'casten' oder nich instantiieren kann.
Hier irritiert mich zusätzlich die Zeile: "SCHWERWIEGEND: Parse error in context.xml for /axis"

Gibt es ein TAG für die axis/web.xml mit der ich dort den ClassLoader setzen kann? So was wie:
<servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>
        org.apache.axis.transport.http.AxisServlet
    </servlet-class>
    <servlet-classloader>com.componio.jarcryp.SjarClassLoader</servlet-classloader>
</servlet>

Diese Versuche wurden aber vom Tomcat komplett ignoriert. Das heißt - es hatte keine Einfluss auf das Startverhalten oder die Bereitstellung des WebServices.

Habe auch was zu den verscheidenen ClassLoadern eines Tomcat gelesen aber darin scheint keine Lösung des Problems zu liegen, da dort lediglich von den verschiedenen existierenden ClassLoadern gesprochen wird und weniger von Custom-ClassLoadern.
Ein Anfrage beim Verschlüsselungstool-Hersteller (componio) war erfolglos - liegt auch meiner Meinung nach nicht bei Ihm. Wenn es eine andere Verschlüsselung wäre dann würde diese dasselbe Problem liefern.
Also:
Kann man AXIS beibringen für solche Aufrufe einen anderen ClassLoader zu verwenden und wenn ja wo und wie?
Oder gibt es einen anderen Weg das Problem zu lösen, außer auf die Verschlüsselung zu verzichten ;-)
Ggfs ist mein Ansatz auch falsch und der Lösungsweg liegt komplett irgendwo anders?

Bin für alle Anregungen und erst recht für Lösungen dankbar.

Gruß
meguma


----------



## meguma (17. Feb 2011)

Vielleicht wird es in der Kürze etwas klarer was ich meine. Ich hoffe zumindest das es daran liegt und nicht daran das es dazu keine Lösung gibt.

Das Thema lässt sich wahrscheinlich auf eine zentrale Frage runterbrechen, nämlich: 
Kann ich AXIS beim Aufruf meines WebServices z.B. über die WEB.XML einen anderen ClassLoader vorgeben. Dann könnte ich dort ggf des ClassLoader des Verschlüsselungstoolherstellers eintragen. Habe aber keine passenden Tags dazu gefunden, bzw. die die ich gefunden habe werden ignoriert.

Hoffe das war etwas verständlicher und jetzt wird's vielleicht was

Danke

meguma


----------



## benhaze (1. Mrz 2011)

Hi!
Ich habe ein ähnliches Problem.

Damit der Classloader instanziiert werden kann,
habe ich folgendes getan:

1. CustomClassloader extends URLClassloader (ob das nötig ist, kann ich derzeit nicht sagen)
2. CustomClassloader hat empty default constructor

Aber anschließend bekomme ich folgende Fehlermeldung:

```
java.lang.IllegalArgumentException: argument type mismatch
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:804)
        at org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:201)
        at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1057)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601)
        at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:180)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1343)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2755)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
        at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1543)
        at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:630)
        at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:567)
        at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:834)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:335)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:343)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:323)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:136)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:812)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:787)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:607)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:925)
        at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:723)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1302)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:343)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:323)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1043)
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1035)
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:724)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:304)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)

01.03.2011 11:17:16 org.apache.catalina.startup.ContextConfig processContextConfig
SCHWERWIEGEND: Parse error in context.xml for /controller
java.lang.IllegalArgumentException: argument type mismatch
        at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2687)
        at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2713)
        at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1060)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601)
        at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:180)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1343)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2755)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
        at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1543)
        at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:630)
        at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:567)
        at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:834)
        at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:335)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:343)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:323)
        at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:136)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:812)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:787)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:607)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:925)
        at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:723)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1302)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:343)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:323)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1043)
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1035)
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:724)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:304)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
```

Auch bei mir wird sich über die ContextXML beschwert.
Um genau zu sein, mein neue TAG <Loader>


----------



## benhaze (1. Mrz 2011)

Ok, in der Doku stand es dann doch:

When using classLoader attribute, instance of WebappClassLoader is expected.
When using className attribute, implementation of org.apache.catalina.Loader is expected.


----------



## meguma (2. Mrz 2011)

Hallo benhaze,

die Idee mit "CustomClassloader _*extends *_URLClassloader" fällt bei mir leider weg, da der ClassLoader (com.componio.jarcryp.SjarClassLoader) für die verschlüsselten Dateien vom Hersteller des Verschlüsselungstools sinnigerweise _*final *_deklariert wurde. Da es kein public Interface ist kann ich es auch nicht implementieren. Wäre von Hersteller auch ziemlich dämlich wenn er diese Tür offen lassen würde ;-) 

Zu dem zweiten Punkt von Dir: Versuch mal in der Context.xml innerhalb des Loader-Tag's das Attribut className zu verwenden <Loader className="com.componio.jarcryp.SjarClassLoader"></Loader> Vielleicht hilft Dir das weiter. Bei mir erkenne ich zumindest das er dann versucht diesen ClassLoader zu verwenden, da es eine Fehlermeldung "java.lang.ClassCastException: com.componio.jarcryp.SjarClassLoader cannot be cast to org.apache.catalina.loader.WebappClassLoader" gibt. Einen Cast-Fehler könnte man durch das erweitern (extends) der Klasse WebappClassLoader erreichen. Aber leider ist das für die Klasse SjarClassLoader aus dem obigen Grund nicht möglich. 

Als nächstes wollte ich mal prüfen ob und wo man dem Tomcat beibringen kann einen weiteren ClassLoader zu verwenden. Laut Doku verwendet er ohnehin schon Bootstrap, System, common und alle für die einzelnen WebApps. Allerdings wird nirgendwo auf verschlüsselte Jars hingwiesen. Warum auch - wäre ja sonst zu einfach ;-). Wenn ich was rausfinde werde ich es posten.

Gruß
meguma


----------



## FArt (2. Mrz 2011)

Wenn es Verrebung nicht tut, dann versuche es halt mit Delegation... dein Classloader erbt von URLClassloader und delegiert an deinen lustigen Classloader.


----------



## KSG9|sebastian (2. Mrz 2011)

1. DeinClassLoader extends WebappClassloader/Catalina..Classloader

oder

2. ContextListener welcher den SJar..Classloader setzt (z.B. mittels currentThreadClassLoader o.ä.)


----------



## meguma (9. Mrz 2011)

Hallo,

ich habe mal den Vorschlag mit der Delegation ausprobiert und habe folgendes Ergebnis:


```
public class MySJarClassLoader extends WebappClassLoader
{
    SjarClassLoader sjarLoader = null;

    public MySJarClassLoader ()
    {
        System.out.println("\n\nKonstruktor MySJarClassLoader\n\n");
   	// Wird nie aufgerufen
    }

    public MySJarClassLoader (ClassLoader cl)
    {
        super(cl);
        System.out.println("\n\nMySJarClassLoader (ClassLoader)\n\n");
        sjarLoader = SjarClassLoader.getInstance();
        
        // Was besseres als hier den ContextClassLoader zu setzen ist mir hier leider nicht eingefallen!!
        Thread.currentThread().setContextClassLoader(this);
    }

    // hier alle Methoden von WebappClassLoader, URLClassLoader, ClassLoader und Object überschrieben, um zu sehen was so alles 
    // aufgerufen wird.
    // Nur die Methoden des (öffentliches) Interfaces der sjarLoader-Instanz habe ich überschrieben und dort an die entsprechende 
    // Methode der sjarLoader-Instanz delegiert. Der Rest geht einfach an "super."
}
```

*Weitere Einstellungen:*

1) die Klasse MySJarClassLoader mit vollständigem packagepfad in die 
Verzeichnisse <tomcat>/lib/ und <tomcat>/webapps/axis/WEB-INF/lib gelegt. (nur um auszuschließen das es ein Pfadproblem ist)
2) In der context.xml vom tomcat steht neben einem Standard <WatchResource>-Tag 
lediglich: <Loader loaderClass="de.common.classloader.MySJarCassLoader"/>
3) web.xml von /axis wurde nicht geändert.
4) Zusatzinfo: Der SJarClassLoader benötigt neben einem sjarcl.jar unter Windows auch noch eine .dll (sjarcl.dll).
Diese müsste ich auch noch irgendwo sinnvoll konfigurieren/unterbringen, aber wo??
5) catalina.bat:
Am Ende noch 
set EXTERNAL_CLASS_PATH=%MY_HOME%\lib\external
set JAVA_PARAMETER=-Djava.library.path=%EXTERNAL_CLASS_PATH%

für den Java-Aufruf gesetzt. In dem Verzewichnis befinden sich sowohl das sjarcl.jar als auch die sjarcl.dll.



*Ergebnis beim Starten des Tomcat:* die *****- Ausgaben einfach ignorieren - sind nur der Vollständigkeit halber drin. 

09.03.2011 11:40:57 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\Testsystem_OIPD_SJAR\OIPD_Test_SJAR\lib\external
09.03.2011 11:40:58 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
09.03.2011 11:40:58 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1380 ms
09.03.2011 11:40:58 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
09.03.2011 11:40:58 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.26
09.03.2011 11:40:58 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory axis


Konstruktor MySJarClassLoader (ClassLoader)



****Aufruf von start
****Aufruf von hashCode
****Aufruf von toString
****Aufruf von equals with Argument=com.componio.jarcryp.SjarClassLoader@a9255c
....
****Aufruf von getResource with Argument=commons-logging.properties
****Aufruf von getResources with Argument=commons-logging.properties
****Aufruf von getResource with Argument=org/apache/commons/logging/commons-logging.properties
****Aufruf von getResources with Argument=org/apache/commons/logging/commons-logging.properties
****Aufruf von hashCode
****Aufruf von getResource with Argument=META-INF/services/org.apache.commons.logging.LogFactory
****Aufruf von getResources with Argument=META-INF/services/org.apache.commons.logging.LogFactory
****Aufruf von getResource with Argument=org/apache/commons/logging/impl/LogFactoryImpl.class
*09.03.2011 11:40:59 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Error listenerStart
09.03.2011 11:40:59 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Context [/axis] startup failed due to previous errors*
...
****Aufruf von stop
****Aufruf von clearReferences
****Aufruf von getResourceAsStream with Argument=org/apache/catalina/loader/JdbcLeakPrevention.class
****Aufruf von getResources with Argument=META-INF/services/java.sql.Driver
****Aufruf von equals with Argument=java.lang.InheritableThreadLocal@14d5bc9
****Aufruf von equals with Argument=null
****Aufruf von equals with Argument=sun.misc.FloatingDecimal$1@a83a13
****Aufruf von equals with Argument=[C@7cd37a
****Aufruf von equals with Argument=java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter@1202d69
****Aufruf von equals with Argument=java.util.concurrent.locks.ReentrantReadWriteLock$Sync$HoldCounter@1855562
****Aufruf von equals with Argument=java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter@a89ce3
****Aufruf von equals with Argument=java.util.concurrent.locks.ReentrantReadWriteLock$Sync$HoldCounter@1d439fe
****Aufruf von equals with Argument=java.lang.ThreadLocal@2b7db1
****Aufruf von equals with Argument=null
****Aufruf von equals with Argument=java.lang.ThreadLocal@148f8c8
****Aufruf von equals with Argument=java.lang.ref.SoftReference@1c5466b
****Aufruf von equals with Argument=java.lang.ThreadLocal@922804
****Aufruf von equals with Argument=java.lang.ref.SoftReference@1815338
****Aufruf von equals with Argument=java.lang.ThreadLocal@17e845a
****Aufruf von equals with Argument=null
****Aufruf von equals with Argument=java.lang.ThreadLocal@12368df
****Aufruf von equals with Argument=10
****Aufruf von equals with Argument=java.lang.ThreadLocal@1ba0f36
****Aufruf von equals with Argument=java.lang.ref.SoftReference@3caa4b
****Aufruf von equals with Argument=java.lang.InheritableThreadLocal@14d5bc9
****Aufruf von equals with Argument=null
****Aufruf von hashCode
****Aufruf von toString
****Aufruf von equals with Argument=com.componio.jarcryp.SjarClassLoader@a9255c
****Aufruf von toString
****Aufruf von equals with Argument=com.componio.jarcryp.SjarClassLoader@a9255c
****Aufruf von toString
****Aufruf von equals with Argument=com.componio.jarcryp.SjarClassLoader@a9255c
****Aufruf von toString
****Aufruf von equals with Argument=com.componio.jarcryp.SjarClassLoader@a9255c
****Aufruf von hashCode

09.03.2011 11:41:00 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory ROOT


Konstruktor MySJarClassLoader (ClassLoader)


****Aufruf von start
****Aufruf von hashCode
****Aufruf von toString
****Aufruf von equals with Argument=com.componio.jarcryp.SjarClassLoader@a4488
****Aufruf von hashCode
****Aufruf von toString
****Aufruf von equals with Argument=com.componio.jarcryp.SjarClassLoader@a4488
****Aufruf von toString
****Aufruf von equals with Argument=com.componio.jarcryp.SjarClassLoader@a4488
****Aufruf von hashCode
09.03.2011 11:41:01 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
09.03.2011 11:41:01 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
09.03.2011 11:41:02 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/94  config=null
09.03.2011 11:41:02 org.apache.catalina.startup.Catalina start
INFO: Server startup in 3924 ms


Was mache ich jetzt mit dem "SCHWERWIEGEND: Error listenerStart"??
Im Moment startet also Tomcat aber leider /axis nicht. 

ich bin wieder für alle Ideen dankbar

Gruß
meguma


----------



## FArt (9. Mrz 2011)

Was mir auffällt: du setzt im Konstruktur den Kontextclassloader. Das ist so nicht sinnvoll.

Der Tomcat instanziiert den Classloader und der setzt auch die gültigen Kontextclassloader (eben abhängig vom Kontext). Du musst Tomcat konfigurieren, dass dein Classloader verwendet werden soll, der Rest müsste dann automatisch gehen.


----------



## meguma (9. Mrz 2011)

Hallo FArt,

inzwischen bin ich ein wenig weiter.
Du hast recht - das Setzen des ContextClassloader ist vollkommen überflüssig! 

Zu dem Problem _*Error listenerStart*_ ist die Lösung das Erzeugen einer validen _commons-logging.properties_ mit z.B. dem Inhalt "
	
	
	
	





```
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
```
"

dann noch log4j.jar, commons-logging.jar, commons-logging.properties in den Classpath und dann startet Tomcat ohne erkennbare Fehler.

Wenn ich dann allerdings _http://localhost:8080/axis/servlet/AxisServlet_ aufrufe wird zwar schön die Info zu AXIS angezeigt - also eine Liste der Webservices. Wenn ich dann im Browser eine Methode unseres Webservices aufrufe 
	
	
	
	





```
http://localhost:8080/axis/services/MyWebSoapServices?method=getContentInfo
```
 dann bekomme ich denselben Fehler wie zu Beginn als ich komplett auf die Verwendung eines eigenen ClassLoaders verzichtet habe 


```
AXIS error

Sorry, something seems to have gone wrong... here are the details:

Exception - java.lang.NoClassDefFoundError: <package-pfad>/webservice/WebserviceToServerCommClient
```

bei der Klasse *WebserviceToServerCommClient * handelt es sich dann wieder um die Klasse die im verschlüsselten SJAR liegt. und damit schließt sich der Kreis wieder - ich war schon fast euphorisch als axis die Liste der Webservices angezeigt hat - tja zu früh gefreut.


Hat noch jemand eine guten Rat bzw. braucht ihr vielleicht mehr Infos? Und wenn ja welche?

Danke und Gruß
meguma


----------



## FArt (9. Mrz 2011)

Classloading ist eine heiße Sache, besonders wenn eine Laufzeitumgebung eine eigene Policy implementiert.

Wichtig: 
- du musst die Policy der Laufzeitumgebung (in dem Fall Tomcat) kennen und verstehen
- du musst die Konfiguration der Policy kennen und verstehen
- du musst sehen können, wie Klassen geladen werden

Die ersten beiden Punkten bedeuten: Doku lesen. Der letzte Punkt bedeutet Logging sinnvoll konfigurieren, evtl. auch über die VM (Java HotSpot VM Options z.B. mit -XX:+TraceClassLoading)


----------



## meguma (9. Mrz 2011)

Hallo nochmal,

wenn ich jetzt Tomcat soweit habe meinen ClassLoader _MySJarClassLoader _ zu verwenden, sollte dann auch, zumindest in der Theorie, das gestartete AXIS eigentlich automatisch auch mit diesem ClassLoader arbeiten oder wann könnte dieses geammte Konstrukt wieder auf einen der vordefinierten anderen ClassLoader zurückfallen?

Gruß
meguma


----------



## FArt (9. Mrz 2011)

Ich kenne mich mit der Classloader-Policy und deren Konfiguration in Tomcat nicht aus, aber ich kann das mit anderen Laufzeitumgebungen vergleichen.
Jede Webapplikation hat seinen eigenen Classloader (vergleiche The Apache Tomcat 5.5 Servlet/JSP Container - Class Loader HOW-TO). Die Classloader von mehreren Webapplikationen sind per Default voneinander isoliert. Werden Ressourcen nicht im Webclassloader gefunden, wird nach oben (also erst mal an den Shared Classloader) delegiert.
In welchem Verhältnis steht deine App zu Axis? Wo liegen passend die Ressourcen? In wie weit kann man das obige Verhalten umkonfigurieren, bis es dir passt?

Nach Apache Tomcat Configuration Reference - The Loader Component kannst du jetzt einen eigenen Classloader einbringen, der per Konvention sich wie ein Webclassloader verhält und die verschlüsselten Ressourcen an den anderen Classloader delegiert. Das sollte es schon sein.

Für die Fehlersuche hilft nur, was ich oben schon beschrieben habe.


----------



## meguma (10. Mrz 2011)

Hallo FArt,

Zu deinen Fragen:
In welchem Verhältnis steht deine App zu Axis? 
==> Mein Webservice wird per WSDL-Konfiguration dem AXIS bekannt gemacht. Um die Daten (Name und Methoden des Webservice) 
zu meinem Webservice im Browser zu sehen, liegen die verschlüsselten Jars (SJAR) im lib-Verzeichnis der axis-Anwendung 
(<Catalina.home>/webapps/axis/lib). Hier liegen also alle verschlüsselten und nicht verschlüsselten Teile meiner Applikation. 

Wenn ich deinen Hinweis *Apache Tomcat Configuration Reference - The Loader Component*  richtig verstehe dann habe ich das, was dort beschrieben wird bereits gemacht. Nämlich über die context.xml  mit dem <Loader>-Tag eine anderen Context-ClassLoader gesetzt. Das funktioniert ja auch soweit.


ansonsten muss ich meine Aussage "_es kommt dasselbe raus_" leicht korrigieren. Im Browser erhalte ich zwar denselben Fehler aber im Logfile _webApps.log_ steht jetzt beim Versuch die *getContentInfo*-Methode meines Webservices aufzurufen:

16:42:42,594 INFO  [http-8080-1] (AxisServlet.java:400) - Exception:
      java.lang.NoClassDefFoundError: <package-Pfad>/webservice/WebserviceToServerCommClient
	at <package-Pfad>.WebSoapBindingImpl.<init>(WebSoapBindingImpl.java:20)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at java.lang.Class.newInstance0(Class.java:355)
	at java.lang.Class.newInstance(Class.java:308)
	at org.apache.axis.providers.java.JavaProvider.makeNewServiceObject(JavaProvider.java:385)
	at org.apache.axis.providers.java.JavaProvider.getNewServiceObject(JavaProvider.java:235)
	at org.apache.axis.providers.java.JavaProvider.getServiceObject(JavaProvider.java:91)
	at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:287)
	at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
	at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
	at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
	at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:454)
	at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281)
	at org.apache.axis.transport.http.QSMethodHandler.invokeEndpointFromGet(QSMethodHandler.java:129)
	at org.apache.axis.transport.http.QSMethodHandler.invoke(QSMethodHandler.java:94)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.axis.transport.http.AxisServlet.processQuery(AxisServlet.java:1226)
	at org.apache.axis.transport.http.AxisServlet.doGet(AxisServlet.java:249)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
	at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
	at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassNotFoundException: <package-Pfad>.webservice.WebserviceToServerCommClient
	at com.componio.jarcryp.*SjarClassLoader*.findClass(Native Method)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	at <package-Pfad>.common.classloader.*StoyeSJarClassLoader*.loadClass(StoyeSJarClassLoader.java:503)
	... 39 more
16:42:42,656 DEBUG [http-8080-1] (AxisServlet.java:330) - Exit: doGet()

Hier kommt also zumindest schon mal der Hinweis das er auch versucht die entsprechende Klasse in der verschlüsselten 
SJAR über meinen CustomClassLoader *WebserviceToServerCommClient*zu öffnen. Zumindest interpretiere ich das so.
Hier kommt dann vielleicht noch das Thema _sjarcl.dll_ ins Spiel. Ggf liegt es daran das _sjarcl.jar _(hier liegt die Klasse SJarClassLoader)
 nicht an die _sjarcl.dll _rankommt. Habe dazu testweise die _sjarcl.dll_ auch in alle lib-Verzeichnisse des Tomcat und 
der /axis Anwendung kopiert, um auch hier Suchpfadprobleme auszuschließen. Leider verändet sich dadurch nichts.
In der catalina.properties habe ich auch die <server/common/shared>.loader Einträge aktiviert und auf die entsprechdnen Verzeichnisse gelegt.
Macht aber auch keinen Unterschied. Laut Doku zum Tomcat soll es ausreichen wen man die_ sjarcl.dll_ ins Verzeichnis shared/lib legt und auch alle Klassen, die über JNI auf diese _sjarcl.dll_ zugreifen. Das ist in meinem Fall lediglich die mitgelieferte _sjarcl.jar_.

Also eigentlich sollte es funktionieren aber es sieht nicht danach aus, oder es ist etwas anders nicht in Ordnung... aber was?

Die ClassNotFoundException weist ja schon auf einen Fehler im Classpath hin aber ich glaube eher das es was damit zu tun hat welcher ClassLoader für den Aufruf benutzt wird. Wenn ich in meinem CustomClassLoader einen Aufruf *sjarLoader.loadClass(name)* absetzte heißt das dann das ich zwar die umgebende Klasse mit meinem CustomClassLoader lade aber dann intern mit der Delegation den sjarClassLaoder nehme? Ist das dann ggf ein Problem weil dann zwei ClassLoader an einem Vorgang beteiligt sind?

Gruß
meguma


----------



## meguma (18. Mrz 2011)

Sorry - falscher Eintrag - kommt später in voller Ausführlichkeit.
Gruß
meguma


----------



## meguma (18. Mrz 2011)

Hallo Zusammen,

nach einigen weiteren Tests habe ich es jetzt hinbekommen und wollte euch hier die Lösung geben, falls mal jemand ein ähnlich gelagertes Problem haben sollte. Mit den Rückmeldungen dauert es immer ein wenig, da ich nicht zu 100% an diesem Projekt arbeite. Also wie bei vielen Dingen kann man es am Ende doch auf einen simplen Ansatz runterbrechen und letzendlich war es nur eine kleine Modifikation:


1) Eigenen ClassLoader schreiben und diesen von *org.apache.catalina.WebappClassLoader* ableiten (nicht von URL-ClassLoader , da Tomcat an einer Stelle im Startvorgang diesen *CustomClassLoader *in einen *WebappClassLoader *casten will)
2) Dort die beiden Konstruktoren  implementieren und die beiden loadClass() -Methoden überschreiben. Die 1-parametrige Version leitet ohnehin nur an die 2-parametrige weiter und dort *sjarLoader.loadClass(String)* absetzen (Fehlerbehandlung!). Danach unbedingt noch *super.loadCLass(String, boolean)* aufrufen!!!
3) Im Konstruktor muss die lokale Instanz von SJarCLassLoader unbedingt mit 
	
	
	
	





```
SJarClassLoader.getInstance(System.getProperty("java.class.path")
```
 instanziiert werden! Wichtig ist hier aber das der korrekte Classpath incl Pfad auf die verschlüsselten SJAR's übergeben wird. 
4) in der Context.xml vom Tomcat noch [XML]<Loader loaderClass="<packagePfad>.MyWebappClassLoader"/>[/XML]
5) in der catalina.bat den *%CLASSPATH%* um die benötigten sjar's erweitern. Hier reicht es nicht aus einfach das Verzeichnis mit den SJAR's anzugeben, da die Methode *SJarClassLoader.getIstance(<classpath>)*, laut Doku explizit Pfade mit der Extension .sjar erwartet und alles andere ignoriert.
6) Am Ende in catalina.bat die _EXECJAVA-Aufrufe noch mit -Djava.library.path=<Pfad zur sjarcl.dll> versehen.
7) Dann am Ende natürlich noch *MyWebappCLassLoader *mit vollständigen Pfad in den Suchpfad des Tomcatservers legen - bei mir *%CATALINA_HOME%/lib*

Das Ganze hat noch den positiven Nebeneffekt das die SJAR's nicht mal unterhalb des Tomcat liegen müssen, sondern irgendwo auf dem System. Am besten über eine Umgebungsvariable zu finden. Die kann dann bei der CLASSPATH-Erweiterung in catalina.bat verwendet werden.

Dann sollte alles laufen

Gruß
meguma


----------

