# Spring Remoting und OSGi



## Gast2 (13. Okt 2010)

Hallo zusammen,

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.

Für das Remoting habe ich mir mal die Doku und den Artikel angeschaut.
Enterprise Eclipse RCP - Teil 2: Remoting und Caching

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.ä?


----------



## Gelöschtes Mitglied 5909 (13. Okt 2010)

Wenn ich mich nicht täsche, dann basiert Spring Remoting doch auf RMI, und dann brauchst du nix.

Ansonsten würd ich einfach den Tomcat nehmen der bei Spring DM dabei ist, nicht Spring DM Server.
Und dann machst du ein extra bundle.

Manifest:

```
Web-ContextPath: web
Bundle-Version: 1.0.0.qualifier
Bundle-ClassPath: WEB-INF/classes/,
 WEB-INF/lib/,
 .
```

Web-Contextpath ist dann der pfad unter der du die Anwendung findest.
Jedes web-bundle ist ne eigene webapp.

Beispiel siehe anhang.

Bundles die du noch brauchst:

catalina.start.osgi-1.0.0.jar               <- das fährt tomcat hoch
catalina.osgi-5.5.23-SNAPSHOT.jar     <- das ist der tomcat

Und natürlich der Spring Web-Extender (scannt die Manifest der Bundles):

spring-osgi-web-1.2.1.jar
spring-osgi-web-extender-1.2.1.jar


----------



## Gast2 (13. Okt 2010)

Werd ich mir übers We mal anschauen. Danke =)


----------



## Gast2 (15. Okt 2010)

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?

EDIT: Okay wie hier gelesen hab soll ein Jetty besser sein ...
http://www.java-forum.org/application-tier/97023-spring-dm-problem-tomcat-osgi-service.html

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?


----------



## Gast2 (15. Okt 2010)

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

```
osgi>
```
nicht mehr aber mein jetty ist unter http://localhost:8080/test nicht zu erreichen.

Mein Manifest sieht wie in dem Tutorial aus
[XML]
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Xxx
Bundle-SymbolicName: xxx
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: xxx.Activator
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: javax.servlet;version="2.5.0",
 javax.servlet.http;version="2.5.0",
 org.osgi.framework;version="1.3.0"
Web-ContextPath: /test
[/XML]

Muss ich den Server manuell starten (start.jar) und die Anwendung deployen?


----------



## Gelöschtes Mitglied 5909 (15. Okt 2010)

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?

Dazu wird zunächst noch der StandardService (StandardService (Tomcat API Documentation) <- der hier) vom catalina.start.osgi-1.0.0.jar bundle veröffentlicht.

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.

Pax Web - OPS4J

aber auch er kann nicht alles.

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. 

Ich hoffe es war verständlich


----------



## Gast2 (16. Okt 2010)

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?

Aber was ich noch nicht versteh ich hab das Tutorial gemacht. Das OSGi Framework hochgefahren aber der Jetty ist nicht erreichbar.
Jetty/Tutorial/Jetty-OSGi SDK - Eclipsepedia


----------



## Gelöschtes Mitglied 5909 (16. Okt 2010)

Das ist ein feature von den spring dm bundles. Die standard Jetty Version macht das nicht automatisch

ich lad dir mal meinen workspace hoch, da ist alles drinn, dann startest du ihn und probierst mal rum


----------



## Gast2 (16. Okt 2010)

hehe danke auch net schlecht


----------



## Gelöschtes Mitglied 5909 (17. Okt 2010)

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.


----------



## Gast2 (17. Okt 2010)

Nee konnte es noch nicht anschaun, war übers we nicht daheim. Aber werd ich in der Laufe der Woche nachholen. 

Ich benötige auch keine jsp ich will ja nur das Spring Remoting für meine eclipseRCP verwenden.


----------



## Gast2 (18. Okt 2010)

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 ?


```
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?


----------



## Gast2 (18. Okt 2010)

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]

wenn ich nun auf http://localhost:8080/hello gehe 
dann bekomme ich folgende exception

```
HTTP ERROR: 404

NOT_FOUND

RequestURI=/hello

Powered by jetty://
```


----------



## Gelöschtes Mitglied 5909 (18. Okt 2010)

* 1. Beitrag*

Zu 1.:

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. 


```
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.


----------



## Gast2 (19. Okt 2010)

raiL hat gesagt.:


> Zu 1.:
> 
> Quizfrage: wenn du ein zweites web-bundle hast, was glaubst du wohin es deployed wird?
> 
> ...



Omg ich Esel^^... Daran hab ich ehrlich gesagt gar nicht mehr gedacht... Geht jetzt!!! =)
Denk mal das 2te Bundle wird zum Web-ContextPath deployed 



raiL hat gesagt.:


> 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.


jop das hab ich hinbekommen.



raiL hat gesagt.:


> 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.


Okay das probier ich mal aus, sowas hab ich gesucht.


raiL hat gesagt.:


> 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.


Ah okay


----------



## Gast2 (19. Okt 2010)

Sagt jemand was die Fehlermeldung


```
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
```

Also meine Server XML sieht so aus:
applicationContext.xml
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlnssgi="http://www.springframework.org/schema/osgi"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
Index of /schema/context http://www.springframework.org/schema/context/spring-context.xsd
Index of /schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-1.2.xsd">

	<osgi:reference id="personDaoRef" interface="org.java.forum.sample.dao.PersonDao"></osgi:reference>
	<osgi:reference id="personServiceRef" interface="org.java.forum.sample.business.PersonService"></osgi:reference>
</beans>

[/XML]

remoting-servlet.xml
[XML]
<?xml version="1.0" encoding="ISO-8859-1"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans.xsd">
  <!-- remoting exporters -->
  <bean class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter" name="/PersonService">
    <property name="service" ref="personServiceRef"/>
    <property name="serviceInterface" value="org.java.forum.sample.business.PersonService"/>
  </bean>
</beans>
[/XML]

web.xml
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
	version="2.4">

	<context-param>
		<param-name>contextClass</param-name>
		<param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>Hello</servlet-name>
		<servlet-class>org.java.forum.sample.web.servlet.HelloServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>Hello</servlet-name>
		<url-pattern>/hello</url-pattern>
	</servlet-mapping>

  <servlet>
    <servlet-name>remoting</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>remoting</servlet-name>
    <url-pattern>/remoting/*</url-pattern>
  </servlet-mapping>

</web-app>
[/XML]

Und auf der clienSeite
[XML]
  <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="properties">
      <props>
        <prop key="remoteServer">localhost</prop>
        <prop key="remotePort">8080</prop>
        <prop key="remoteContext">web/remoting</prop>
      </props>
    </property>
  </bean>  
  <bean id="personService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
    <property name="serviceUrl" value="http://${remoteServer}:${remotePort}/${remoteContext}/PersonService" />
	<property name="serviceInterface" value="org.java.forum.sample.business.PersonService" />
  </bean>

[/XML]


----------



## Gelöschtes Mitglied 5909 (19. Okt 2010)

```
Import-Package: org.springframework.aop;version="[3.0.0,4.0.0)"
```


----------



## Gast2 (20. Okt 2010)

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

```
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


----------



## Gelöschtes Mitglied 5909 (20. Okt 2010)

Mit dem Build Prozess (automatisiert) kann ich dir leider nicht helfen, das macht bei uns gerade ein anderer.

Aber was du machen kannst ist in Eclipse -> export -> deployable plugins and fragments.

Als Runtime nimmst du idealerweise Apache Felix Karaf (ehemals ServiceMix Kernel)

Apache Felix - Apache Felix Karaf

Oder du nimmst den plain container aus dem Anhang, da musst du nur deine bundles in den bundles Ordner schmeißen.
Gestartet werden sie automatisch.

equinox 3.6.zip ... at ul.to - Free File Hosting, Free Image Hosting, Free Music Hosting, Free Video Hosting, ...


----------



## Gast2 (21. Okt 2010)

Okay werd ich mal ausprobieren denke automatisiert muss am anfang nicht sein soweit passt es mal. 

Noch ein Tip für das log4j Fragement? Irgendwie habe ich unsere beiden Versionen verglichen finde kein Unterschied aber klappt einfach nicht.


----------



## Gelöschtes Mitglied 5909 (21. Okt 2010)

Sind beide in der target platform und auch in der launch config?

mal ss in der console gemacht und nachgeschaut?


----------



## Gast2 (22. Okt 2010)

Deine Bundles

```
10	RESOLVED    org.java.forum.sample.log4j.config_1.0.0.qualifier
	            Master=50
31	RESOLVED    com.springsource.slf4j.log4j_1.5.0
	            Master=23
32	ACTIVE      com.springsource.slf4j.org.apache.commons.logging_1.5.0
50	ACTIVE      org.springframework.osgi.log4j.osgi_1.2.15.SNAPSHOT
	            Fragments=10
```

Meine Bundle


```
157	RESOLVED    com.springsource.slf4j.log4j_1.5.0
	            Master=167
184	ACTIVE      org.springframework.osgi.log4j.osgi_1.2.15.SNAPSHOT
	            Fragments=231
214	ACTIVE      com.springsource.slf4j.org.apache.commons.logging_1.5.0
231	RESOLVED    log4j.config_1.0.0.qualifier
	            Master=184
```

Das Manifest noch

```
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Log4J Config Fragment
Bundle-SymbolicName: log4j.config
Bundle-Version: 1.0.0.qualifier
Bundle-ClassPath: log4j.config
Fragment-Host: org.springframework.osgi.log4j.osgi;bundle-version="[1.2.15,2.0.0)"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
```


```
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

```
osgi> log4j:WARN No appenders could be found for logger (org.mortbay.log).
log4j:WARN Please initialize the log4j system properly.
```

sehr verwirrend^^


----------



## Gast2 (22. Okt 2010)

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 !!!


----------



## Gelöschtes Mitglied 5909 (23. Okt 2010)

das import plugin hab ich (anscheinend zum glück) noch nicht verwendet


----------



## Gast2 (25. Okt 2010)

raiL hat gesagt.:


> das import plugin hab ich (anscheinend zum glück) noch nicht verwendet



Ja ich weiß nicht ob das ein Bug oder Feature sein soll ^^... Ab und zu den Classpath anschauen ist wohl ganz gut ...


----------



## Gast2 (25. Okt 2010)

Sagt dir die Fehlermeldung was? Versteh nicht warum er auf einmal meine Klasse nicht mehr findet Oo...


```
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)
```


----------



## Noctarius (25. Okt 2010)

Tja vermutlich fehlt ein Import.


----------



## Gast2 (25. Okt 2010)

Noctarius hat gesagt.:


> Tja vermutlich fehlt ein Import.



Wie bekomme ich den fehlenden import raus?


----------



## Gast2 (25. Okt 2010)

Naja hab das Bundle neu angelegt die import Package kopiert und nun tuts wieder komisch aber egal ...


----------

