Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich hab bis jetzt noch nicht viel gemacht was mit Server und OSGi zu tun hatte, darum stellen sich mir einige Fragen. Ich habe gerade eine Standalone RCP Anwendung in den folgende Bundles vorliegen:
GUI,Model,Service,DAO,Logging,DB (Derby).
Nun will ich auf dem Client nur noch die GUI und evtl. die Models benutzen. Und auf einem Server die Model,Service,DAO usw. Bundles.
So wie meine Strukur aufgebaut ist muss ich die Services noch exportieren und mein client muss diese importieren.
1. Benötige ich für die remoting-servlet.xml und web.xml ein eigenes Bundle???
2. Danach benötige ich ja noch einen Server, was benutz ich am besten hab mal den Tipp für Spring DM Server bekommen? Aber reicht der mit oder brauch ich noch nen Tomcat o.ä?
Okay das mit dem web Bundle habe ich auch so gemacht =) außer dass ich kein Servlet benötige sondern da drin meine Remoting Sachen habe.
Aber für was genau brauch ich das Bundle tomcat config?
Und was genau muss ich jetzt auf dem Server deployen? Alle Bundles?
Das mit den 2 Tomcat Bundles habe ich auch nicht so richtig verstanden? Wo muss ich die einfügen weil ich starte den Tomcat doch ganz normal über die startup.bat?
Und wie macht man am besten die launch Dateien, manuell?
Aber das Prinzip hab ich immer noch nicht gerafft. Ich integrier den Server einfach als OSGi Bundle (also nehm ihn in meine target platform mit auf)? Und der fährt sich dann automatisch hoch oder wie?
Okay ich glaub ich will zuviel aufeinmal ^^... Fang ich mal klein an.
Also ich hab den Jetty in meine target platform mit aufgenommen (OSGi Update Repositories ) Jetty/Starting/Downloads - Eclipsepedia
Danach hab ich die jetty.zip runtergeladen und entpackt.
Hab in der Umgebungsvariablen JETTY_HOME eingetragen.
Und das kleine Tutorial ab "Setup Jetty and a first Web-bundle" druchgemacht. Jetty/Tutorial/Jetty-OSGi SDK - Eclipsepedia
Wenn ich das Bundle starte bekomme ich immer als consolen Ausgabe
Du denkst verkehrtrum. Du willst den Tomcat wie bisher starten und dort deine sachen deployen.
Wir sind aber hier in OSGi. Du Startest das OSGi Framework in in dem Framework startest du Tomcat - nicht umgekehrt.
Dazu hat Spring den normalen Tomcat einfach verbundled. Damit er auch gestartet wird, wird in dem catalina.start.osgi-1.0.0.jar bundle per java code der server erstellt. Da kommt dann schon die nexte Antwort auf deine Frage: in dem tomcat.config fragment ist die server.xml von tomcat enthalten. Da sich bundles und fragmente den gleichen classloader teilen,
kann das catalina.start.osgi-1.0.0.jar bundle auf die server.xml des fragments zugreifen und so den tomcat konfigurieren.
Da ist z.b. der Port drinnen.
Jetzt ist der Server gestartet. Aber wie schauts aus mit den webapps?
Jetzt hast du in der OSGi Registry den StandardService vom Tomcat, mit dem du quasi alles machen kannst.
Damit du jetzt nicht selber hergehn muss und dir den Service holst, die webapp registrierst etc. hat spring den WebExtender geschrieben. Der geht her und scannt alle Manifests aller bundles.
Tauchen dort die EInträge Web-ContextPath und Module-Type : Web auf, weiß der extender dass es sich um eine webapp handelt. Ergo wird es als webapp deployed.
Nun zum Thema jetty:
Jetty kann man einfacher in eine Java - App integrieren. Aber: Wenn du nicht die Spring version verwendest, wird der Jetty im normalfall (z.b. bei der Eclipse distribution [womit z.b. das Help-System gemacht wird]) in form des HttpService (HttpService (OSGi Service Platform Release 4 Version 4.2)) registriert. Sieht auf den ersten blick nicht schlimm aus, du kannst Servlets registrieren.
Jetzt kommt das große aber:
1. du musst dir den service selber holen und deine servlets registrieren (oder über plugin.xml)
2. die web.xml wird NICHT ünterstützt: keine authentifizierung, keine filter, keine listener, keine jsps, NICHTS
Jetzt gibt es noch den pax-web-extender, der kann ein bischen mehr.
Deshalb veröffentlich Spring in den tomcat/jetty bundles aus ihrem repo den jeweiligen service, mit dem man _alles_ machen kann, was in der web.xml ist.
Ja okay danke, habe mir schon fast gedacht dass ich irgendwo einen Denkfehler drin hatte.
Also das heißt wenn ich das OSGi Framework hochfahre kümmert sich dieses darum den Server zu starten?
Okay zum Thema Jetty oder Tomcat, welcher ist geeigneter für den Einstieg?
Ich versuch grad den Jetty zu benutzen muss ich dann beim Spring Repo irgendwas runterladen?
verstehst du es nun? Ich hatte am Anfang auch erst den Jetty benutzt, und zwar den ganz normalen.
Aber dann funktioniert der Spring DM Web-Extender nicht.
Wichtig ist, dass der funktioniert, da ansonsten die webapps nicht automatisch deployed werden. (wenn das webappbundle gestartet wurde).
Die Spring DM distribution hat aber sowohl eine tomcat, als auch eine jetty Version dabei.
Was du noch ausprobieren könntest ist die klasse als OSGi Service (Catalina StandardService bei Tomcat) zu veröffentlichen, welche der spring web-extender benötigt. Welche das beim jetty ist kann ich dir aber net auf anhieb sagen. (mit der spring mitgelieferten version ausprobieren und in der osgi konsole nach dem service schaun)
Dann könntest du z.b. auch die jetty-hightide version ausprobieren, die hat jsp support dabei und noch einiges mehr.
Ich brauche keine jsps, von daher hab ichs noch nicht ausprobiert. Es gibt aber auch aktuellere versionen von tomcat im spring bundle repo
Noch ein tipp am rande:
Apache Felix - Apache Felix File Install das ist ein sehr nützliches kleines bundle. denn anders als unter eclipse (launch config) werden normalerweise bundles nicht automatisch gestartet. Da müsstest du normalerweise alle bundles in die config.ini aufnehmen, was bei >50 bundles schon keinen spaß mehr macht.
Außerdem kannst du mit dem bundle dann quasi hot deployment machen. Jar austauschen und gut ist.
Das war aber auch schon in dem ersten workspace mit dem binary dabei, den ich dir mal gegeben hab.
Okay hier mal meine 1ten Fragen . Erstmal danke nochmal dass du dir soviel Mühe gemacht hast.
1. Ich hab es ohne Mühe zum Laufen gebracht. Aber unter http://localhost:8080/hello habe ich keine Seite angezeigt bekommen? Dazu ist mir die Zeile in der server.xml aufgefallen:
[XML]
<Host name="localhost" unpackWARs="false" autoDeploy="false"
[/XML]
Heißt das die Anwendung ist noch nicht deployed oder übernimmt genau das jetzt derspring-osgi-web-extender ?
Java:
osgi> 2010-10-18 09:57:59,090 INFO : Unable to find a cluster rule set in the classpath. Will load the default rule set.
2010-10-18 09:57:59,106 INFO : Unable to find a cluster rule set in the classpath. Will load the default rule set.
2010-10-18 09:57:59,372 INFO : Initializing Coyote HTTP/1.1 on http-8080
2010-10-18 09:57:59,372 INFO : Initialization processed in 266 ms
2010-10-18 09:57:59,372 INFO : Starting service Catalina
2010-10-18 09:57:59,372 INFO : Starting Servlet Engine: Apache Tomcat/5.5.23
2010-10-18 09:57:59,387 INFO : XML validation disabled
2010-10-18 09:57:59,434 INFO : Starting Coyote HTTP/1.1 on http-8080
2010-10-18 09:57:59,887 WARN : Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_1_1.dtd
2010-10-18 09:57:59,887 WARN : Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd
2010-10-18 09:57:59,950 INFO : Initializing Spring root WebApplicationContext
2010-10-18 09:58:06,075 INFO : Constructing new Person...
2010-10-18 09:58:08,325 INFO : Person null Max Mustermann constructed
2010-10-18 09:58:08,684 INFO : Insert Person...
2010-10-18 09:58:10,950 INFO : Person inserted
2010-10-18 09:58:11,341 INFO : Query all Persons
2010-10-18 09:58:12,763 INFO : 1 Persons found.
2010-10-18 09:58:13,841 INFO : 1 Max Mustermann
2. Die catalina jars sind das die aus dem Spring DM distrubution?
Das heißt wenn ich nen Jetty benutzen wollen würde müsste ich die jars austauschen und das tomcat config Bundle?
3. Was ich auch nicht richtig durchschaut habe wie man so ne . launch Datei anlegen kann? Das macht du nicht von Hand oder?
4. Was ist das osgi_R4_compendium-1.0.jar?
Okay grad mal die Spring DM with dep runter geladen und seh die Jetty jars. Mal mitaufnehmen in die target platform.
Gibts eigentlich irgendo ne Seite für Vor/Nachteile Jetty und Tomcat?
Muss ich bei Jetty anstatt der server.xml die jetty.xml verwenden?
Also ich hab jetzt mal die jetty.xml verwendet und bekomm das als Ausgabe in der osgi console
[XML]
osgi> 2010-10-18 13:54:17,944 INFO : Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
2010-10-18 13:54:18,053 INFO : Redirecting stderr/stdout to C:\Programme\eclipse-rcp-helios-win32\eclipse\logs\2010_10_18.stderrout.log
2010-10-18 13:54:18,053 INFO : jetty-6.1.x
2010-10-18 13:54:18,069 INFO : Opened C:\Programme\eclipse-rcp-helios-win32\eclipse\logs\2010_10_18.request.log
2010-10-18 13:54:18,100 INFO : Started SelectChannelConnector@0.0.0.0:8080
2010-10-18 13:54:19,147 INFO : Constructing new Person...
2010-10-18 13:54:19,147 INFO : Person null Max Mustermann constructed
2010-10-18 13:54:19,147 INFO : Insert Person...
2010-10-18 13:54:19,459 INFO : Person inserted
2010-10-18 13:54:19,459 INFO : Query all Persons
2010-10-18 13:54:19,600 WARN : Unable to proxy method [public final void org.mortbay.component.AbstractLifeCycle.start() throws java.lang.Exception] because it is final: All calls to this method via a proxy will be routed directly to the proxy.
2010-10-18 13:54:19,600 WARN : Unable to proxy method [public final void org.mortbay.component.AbstractLifeCycle.start() throws java.lang.Exception] because it is final: All calls to this method via a proxy will be routed directly to the proxy.
2010-10-18 13:54:19,600 WARN : Unable to proxy method [public final void org.mortbay.component.AbstractLifeCycle.stop() throws java.lang.Exception] because it is final: All calls to this method via a proxy will be routed directly to the proxy.
2010-10-18 13:54:19,600 WARN : Unable to proxy method [public final void org.mortbay.component.AbstractLifeCycle.stop() throws java.lang.Exception] because it is final: All calls to this method via a proxy will be routed directly to the proxy.
2010-10-18 13:54:19,678 INFO : 1 Persons found.
2010-10-18 13:54:19,678 INFO : 1 Max Mustermann
2010-10-18 13:54:19,944 INFO : Initializing Spring root WebApplicationContext
[/XML]
Quizfrage: wenn du ein zweites web-bundle hast, was glaubst du wohin es deployed wird?
Du hast den Betrag von oben nicht genau genug gelesen.
Code:
Web-ContextPath: web
Das ist das root-path der Anwendung. Wenn man also ein Servlet auf /hello mapped,
dann ist es unter localhost:8080/web/hello erreichbar. Der Port ist der aus der server.xml.
Und nein das autodeploy musst du nicht auf true setzen, das macht der web-extender.
2010-10-18 09:57:59,950 INFO : Initializing Spring root WebApplicationContext
das heißt die Anwendung wurde deployed - sollte also laufen. Normalerweise steht aber auchnoch der web-contextpath dahinter (bei der logausgabe).
2. Ja, das sind die die bei der Spring DM Distribution dabei sind (im folder libs oder so)
Wenn du den jetty willst musst du nur die bundles austauschen (sind analog zum jetty glaub ich 2)
Das Fragment mit der server.xml für den tomcat macht dann natürlich keinen sinn mehr.
3. So ne launch konfiguration erzeugst du unter Eclipse, in dem du bei run-as eine neue osgi-framework konfig erzeugst.
Mit Export -> Launch configuration (rechts auf irgendein projekt clicken) kannst du die als datei exportieren.
4. Die OSGi-Compendium jar enthält die offizielle API für diverse OSGi Standard-Services.
Das wären unter anderem der LogService, der ConfigAdmin und noch ein paar andere.
Eine Implementierung ist in diesem Fall nicht dabei. Schaust du dir aber mal den 1. workspace an den ich dir mal hochgeladen hab, findest du das im binary.
Ist dann nämlich z.b. org.eclipse.equinox.cm_1.0.200.v20100520.jar, was die implementierung von Equinox bzw Eclipse ist.
2. Beitrag
ja du musst die jetty.xml statt der server.xml nehmen. Die Web.xml ist die gleiche. Jetty bietet noch die möglichkeit an, eine jetty-web.xml zu verwenden, da kann man noch ein bischen mehr machen (brauch man aber normalerweise nicht bzw. lässt sich mit der server.xml bei tomcat abbilden. Die jetty.xml musst du natürlich an den jetty attachen (Fragment-host). Welches das ist kann ich dir nicht sagen, da ich das noch nicht ausprobiert habe. Sollte aber analog das jetty-start bundle sein.
2010-10-18 13:54:19,944 INFO : Initializing Spring root WebApplicationContext
Auch hier hast du die Anwendung wieder richtig deployed, sie sollte auch erreichbar sein. Nur die url stimmt wieder nicht (und ggf. der port, je nachdem was in der jetty-xml steht - aber oben steht ja auch 8080)
// Edit:
noch zu tomcat vs. jetty:
Das ist eine Entscheidung die ihr selber machen müsst. Das hat eigentlich nix damit zu tun, ob es in OSGi läuft oder nicht.
Artikel gibts dazu genug im Netz. Was man noch sagen kann ist, dass Tomcat in dieser Version soweit ich weiß noch nicht java.nio verwendet. Jetty hingegen schon. Wenn es um das letzte bischen Performace geht, ist das vielleicht ein Argument für Jetty. Aber du kannst auch mal eine neuere Version von Tomcat aus dem Bundle Repo versuchen. Bei unserer App kann man das vernachlässigen.
2. Ja, das sind die die bei der Spring DM Distribution dabei sind (im folder libs oder so)
Wenn du den jetty willst musst du nur die bundles austauschen (sind analog zum jetty glaub ich 2)
Das Fragment mit der server.xml für den tomcat macht dann natürlich keinen sinn mehr.
3. So ne launch konfiguration erzeugst du unter Eclipse, in dem du bei run-as eine neue osgi-framework konfig erzeugst.
Mit Export -> Launch configuration (rechts auf irgendein projekt clicken) kannst du die als datei exportieren.
4. Die OSGi-Compendium jar enthält die offizielle API für diverse OSGi Standard-Services.
Das wären unter anderem der LogService, der ConfigAdmin und noch ein paar andere.
Eine Implementierung ist in diesem Fall nicht dabei. Schaust du dir aber mal den 1. workspace an den ich dir mal hochgeladen hab, findest du das im binary.
Ist dann nämlich z.b. org.eclipse.equinox.cm_1.0.200.v20100520.jar, was die implementierung von Equinox bzw Eclipse ist.
Caused by: java.lang.IllegalArgumentException: interface org.springframework.aop.SpringProxy is not visible from class loader
at java.lang.reflect.Proxy.getProxyClass(Unknown Source)
at java.lang.reflect.Proxy.newProxyInstance(Unknown Source)
at org.springframework.aop.framework.JdkDynamicAopProxy.getProxy(JdkDynamicAopProxy.java:117)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112)
at org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean.afterPropertiesSet(HttpInvokerProxyFactoryBean.java:62)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1469)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409)
... 14 more
Perfekt jetzt klappts gut die Fehlermeldung muss ich mir merken dass bei der imports fehlen^^...
Ah eine Frage hab ich noch?!
Wie starte ich denn die ganze Sache nicht aus Eclipse raus? Also meinen RCP bekomme ich gebaut und kann ihn ausführen wie läuft das mit dem OSGi Container?
EDIT:
Seit ich alles in meinen eigenen workspace ausgeführt habe. Bekomme ich immer die Meldung
Java:
osgi> log4j:WARN No appenders could be found for logger (org.springframework.scheduling.timer.TimerTaskExecutor).
log4j:WARN Please initialize the log4j system properly.
Was könnte mir den fehlen? Ich hab ein log4j fragment...
In meiner launch habe ich das org.springframework.osgi.log4j.osgi aufgenommen
log4j:WARN No appenders could be found for logger (org.springframework.scheduling.timer.TimerTaskExecutor).
log4j:WARN Please initialize the log4j system properly.
Das witzig ist ich hab einen workspace der geht.
Dann hab ich alles plugins von dort in einen neuen workspace mit import importiert.
Und genau die gleiche target platform verlinkt... Geht auch nicht bekomm ich die fehlermeldung
Code:
osgi> log4j:WARN No appenders could be found for logger (org.mortbay.log).
log4j:WARN Please initialize the log4j system properly.
Echt witzig hab 2 identendisch workspace mit den gleichen target platform bei dem einen tuts bei dem anderen nicht???:L???:L
aaaaaaaaaaaaaaaaaaaaaaaaaaaah interessant ich habs... :toll::applaus:
wenn man den eclipse import plugin und fragements benutzt setzt er bei allen importierten plugins den classpath auf den bundle namen :noe:... und dann geht gar nichts mehr !!!
Sagt dir die Fehlermeldung was? Versteh nicht warum er auf einmal meine Klasse nicht mehr findet Oo...
Java:
2010-10-25 15:04:00,805 INFO : Initializing Spring root WebApplicationContext
2010-10-25 15:04:01,711 WARN : EXCEPTION
java.lang.ClassNotFoundException: web.servlet.HelloServlet
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.net.FactoryURLClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.mortbay.util.Loader.loadClass(Loader.java:91)
at org.mortbay.util.Loader.loadClass(Loader.java:71)
at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.springframework.osgi.web.deployer.jetty.JettyWarDeployer.startWebAppContext(JettyWarDeployer.java:210)
at org.springframework.osgi.web.deployer.jetty.JettyWarDeployer.startDeployment(JettyWarDeployer.java:122)
at org.springframework.osgi.web.deployer.support.AbstractWarDeployer.deploy(AbstractWarDeployer.java:93)
at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$DeploymentManager$DeployTask.doRun(WarLoaderListener.java:257)
at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$DeploymentManager$BaseTask.run(WarLoaderListener.java:215)
at org.springframework.scheduling.timer.DelegatingTimerTask.run(DelegatingTimerTask.java:70)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)
2010-10-25 15:04:01,711 INFO : Unavailable javax.servlet.UnavailableException: web.servlet.HelloServlet
2010-10-25 15:04:01,711 WARN : failed Hello: java.lang.NullPointerException
2010-10-25 15:04:01,711 ERROR: Failed startup of context org.mortbay.jetty.webapp.WebAppContext@9effe0{}
java.lang.NullPointerException
at java.lang.Class.isAssignableFrom(Native Method)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.springframework.osgi.web.deployer.jetty.JettyWarDeployer.startWebAppContext(JettyWarDeployer.java:210)
at org.springframework.osgi.web.deployer.jetty.JettyWarDeployer.startDeployment(JettyWarDeployer.java:122)
at org.springframework.osgi.web.deployer.support.AbstractWarDeployer.deploy(AbstractWarDeployer.java:93)
at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$DeploymentManager$DeployTask.doRun(WarLoaderListener.java:257)
at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$DeploymentManager$BaseTask.run(WarLoaderListener.java:215)
at org.springframework.scheduling.timer.DelegatingTimerTask.run(DelegatingTimerTask.java:70)
at java.util.TimerThread.mainLoop(Unknown Source)
at java.util.TimerThread.run(Unknown Source)