ClassLoader für Axis2 setzen

meguma

Mitglied
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

Mitglied
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

Mitglied
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:
Code:
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

Mitglied
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

Mitglied
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

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

KSG9|sebastian

Top Contributor
1. DeinClassLoader extends WebappClassloader/Catalina..Classloader

oder

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

meguma

Mitglied
Hallo,

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

Java:
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

Top Contributor
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

Mitglied
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 "
Java:
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
Java:
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 :(

Java:
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

Top Contributor
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

Mitglied
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

Top Contributor
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.
 
Zuletzt bearbeitet:

meguma

Mitglied
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 WebserviceToServerCommClientzu ö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

Mitglied
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
Java:
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Serialisierung + ClassLoader Netzwerkprogrammierung 5
L axis2 + jni = libXY.so already loaded in another classloader Netzwerkprogrammierung 2
H ClassLoader Netzwerkprogrammierung 5
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
FrankenDerStein Socket UDP Multithreading für ein Port Netzwerkprogrammierung 2
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
F Server für Java Applikationen Netzwerkprogrammierung 16
B Webview für Anwendung Netzwerkprogrammierung 7
M Sicheres Login-System für App implementieren Netzwerkprogrammierung 6
J Netty umsetzung für ein Protokoll Netzwerkprogrammierung 1
J ERM für kleine Verwaltungsdatenbank Netzwerkprogrammierung 2
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
Messoras Launcher für mein Spiel Netzwerkprogrammierung 7
F Einfaches Gateway für Log-Files Netzwerkprogrammierung 1
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
P PPTP Protokoll für JAVA Netzwerkprogrammierung 14
T FTP Wie Notwendigkeit für "rekey" klientenseitig detektieren? Netzwerkprogrammierung 3
S Webserver für Jar File Netzwerkprogrammierung 4
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
M Erreichbar für alle zu sein Netzwerkprogrammierung 9
M Server nur für eine Aufgabe Netzwerkprogrammierung 2
N Selbes URL Objekt für alle Requests nutzen Netzwerkprogrammierung 7
T uberspace.de als (v)root-Ersatz für kleinere Java-Anwendungen? Netzwerkprogrammierung 12
L Proxy für Dateidownload? Netzwerkprogrammierung 3
K HTTP Eigener Http Response für Datei-Download Netzwerkprogrammierung 4
D Socket Leitstelle für Funkspiel Netzwerkprogrammierung 8
F Java-Beispielcode für Zeroconf (ähnlich Apple Bonjour) Netzwerkprogrammierung 7
I HTTP S - Zertifikate+Cockies für Form-basierten Login Netzwerkprogrammierung 2
Ollek Socket Sucher passende Server/Client Lösung für meine Anwendung Netzwerkprogrammierung 2
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
N RMI Einstellungen für "übers Internet" Netzwerkprogrammierung 8
F SSL-Zertifikate für viele Nutzer? Netzwerkprogrammierung 8
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
S wie stell man die classpath für JARs? Netzwerkprogrammierung 3
M Bestimmte Klassen für Netzwerkchecks gesucht Netzwerkprogrammierung 11
M Welches Speicherformat für News-Database?? Netzwerkprogrammierung 2
Shoox VPN-Verbindung für Datenbankzugriff Netzwerkprogrammierung 2
P Proxy für Anwendung setzten Netzwerkprogrammierung 3
T Bezeichner "end of line" für die Funktion readline Netzwerkprogrammierung 5
A DataGramsocket Übertragungsproblem im Internet (IPs für Voip) Netzwerkprogrammierung 5
E Userliste für Chat Applet Netzwerkprogrammierung 4
S HTTP Kleines Programm für den Routerneustart Netzwerkprogrammierung 3
L Zeitspanne für erneutes senden Netzwerkprogrammierung 16
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
F Netzwerkprogrammierung für Anfänger Netzwerkprogrammierung 2
J Framework/ Muster für Chat-ähnliches Programm gesucht Netzwerkprogrammierung 2
B Variablen ausrichten für Übertragung Netzwerkprogrammierung 2
D FTP Pfadangabe für ftp-upload funktioniert nicht Netzwerkprogrammierung 5
K Getrennte Rechner für RMI-Server/RMI-Registry, bzw. Alternativen? Netzwerkprogrammierung 5
dayaftereh HTTPCleint und HTMLparser für hTTpBot Netzwerkprogrammierung 2
E Socket Client-Applikation mit GUI für Internet IO-Platine Netzwerkprogrammierung 2
0din Grundlage für Bluetooth Netzwerkprogrammierung 5
N "Jungfernflug" der Socketprogrammierung für ein Mühlespiel Netzwerkprogrammierung 8
F Empfehlung für embedded Webserver Netzwerkprogrammierung 10
W Bibliothek für Certificate Management Protocol (CMP) Netzwerkprogrammierung 3
O Client/Server für Ticker Netzwerkprogrammierung 2
J Stubs für SOAP-Webservice generieren. Ich bekomme es einfach nicht hin... Netzwerkprogrammierung 3
dayaftereh Bester Stream für ein Spiel? Netzwerkprogrammierung 15
data89 Sockets: ein alter Hut - für Euch - für mich nicht! Netzwerkprogrammierung 10
G FileDialog für FTP Client Netzwerkprogrammierung 2
P Welches Protokoll für RMI verwenden? Netzwerkprogrammierung 10
H RCON Tool für Gameserver Netzwerkprogrammierung 11
A Wichtig für einen Chat? Netzwerkprogrammierung 4
D Was für Verbindungen mit Socket möglich? Netzwerkprogrammierung 2
S Realisierung eines Netzwerkcodes für ein Strategiespiel Netzwerkprogrammierung 7
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
W Was für ein Stream soll ich verwenden? Netzwerkprogrammierung 8
A Rezept für Webservices Netzwerkprogrammierung 5
I unc pfad für die klasse file? Netzwerkprogrammierung 4
P eine BufferedReader für alles ankommende Netzwerkprogrammierung 2
T Filter für Input UND OutputStream Netzwerkprogrammierung 4
T Welches Netzwerk ist am bestern für. Netzwerkprogrammierung 2
G server für mein spiel. Netzwerkprogrammierung 5
M Log In Programm für Seiten Netzwerkprogrammierung 2
G Netzwerkprogrammierung für spiele Netzwerkprogrammierung 2
A IRC-Server für das lokale Netzwerk? Netzwerkprogrammierung 12
C Einfacher Filedownload mit Sockets geht nicht für pdffiles Netzwerkprogrammierung 16
S Server für Internetspiel Netzwerkprogrammierung 2
G Objecte für Kommunikation nutzen Netzwerkprogrammierung 2
J Java Programm für Upload von Dateien per HTTP Netzwerkprogrammierung 7
S Voreinstellungen für JavaMail Netzwerkprogrammierung 2
S Idee für Projekt auf Agentenbasis Netzwerkprogrammierung 8
S Suche API für einfachen HTTP-Zugriff. Netzwerkprogrammierung 17
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
M RMI - Ein Objekt für Alle? Netzwerkprogrammierung 5
Z Protokoll für Schiffeversenken Netzwerkprogrammierung 5
T Kann man jeden Port für Programm verwenden? Netzwerkprogrammierung 2
R proxy für java anwendung angeben [resolved] Netzwerkprogrammierung 15
B Wie Router einstellen für CLient-Server-Programm? Netzwerkprogrammierung 4
R PPTP Protokoll für JAVA Netzwerkprogrammierung 3
Icewind Klasse für DNS Anfragen Netzwerkprogrammierung 14
P Welche Art von Sockets für ein Spiel? Netzwerkprogrammierung 3
M Socket Verbindungen für einen Chat Netzwerkprogrammierung 10
M Ausgangsport für FTp-Connection festlegen??? Netzwerkprogrammierung 3
D beste Methode für Datenübertragung ? Netzwerkprogrammierung 1
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
S Fragen zu Java Webservice mit Axis2 Netzwerkprogrammierung 0

Ähnliche Java Themen

Neue Themen


Oben