# ...class.getResourceAsStream("/meine.properties") funktioniert nicht über RMI?



## dermoritz (21. Feb 2011)

klassischer Weise binde ich Property-Dateien per 

```
InputStream propsIn = Klasse.class.getResourceAsStream("/meine.properties");
```
ein. die Properties Datei ist in diesem Fall in der jar-Datei (ich benutze Maven-Assembly-Plugin). Alles funktioniert einwandfrei es sei denn man versucht das ganze über RMI aufzurufen bzw. in folgender Weise aufzurufen:

Die betreffende Klasse implementiert ein Interface (ein Funktion ("getBytes") die ein byte[] zurückgibt). Diese Klasse wird von einem Java-Programm benutzt die einen RMI-Server betreibt (man kopiert die jar-Datei zu diesem Programm und fügt sie per .bat dem Klassenpfad hinzu).
Wenn man nun per RMI (aus einer WebApplikation die auf Tomcat läuft) getBytes aufruft ist der InputStream immer null - die Properties-Datei kann also nicht gefunden werden. Warum?

Oder wie greife ich am geschicktesten auf die Properties zu um sicherzustellen, dass sie gefunden werden?


----------



## dermoritz (22. Feb 2011)

ich hab eventuell eine Idee was die Ursache sein könnte, jedoch keine Lösung:

Der ganze kram läuft mit Tomcat Security Manager, dass heißt überall liegen .policy Dateien rum in denen steht was wer darf. Nun sehe ich in der entsprechenden Datei read-permissions (java.io.FilePermission) auf gewisse properties-Dateien. Gelten diese auch für Properties-Dateien innerhalb von jar bzw. unabhängig von ihrem Ort?

Also darf man die Datei aus jedem Ordner lesen oder nur aus Ordnern/jars unterhalb der Policy-Datei?


----------



## tuxedo (22. Feb 2011)

Ein RMI Client kann mit der "Technik" nur auf Dinge zugreifen die er bei sich im Classpath hat.

Sprich: Wenn die property-Datei im Classpath des Servers liegt, kommt der Client da auch nicht implizit über RMI dran.

Idealerweise hat man bei RMI (und anderen RPC Techniken, sofern man keinen Fileserver als Codebase angibt) 3 JARs:

1) Serverseitige JAR mit der RMI Implementierung
2) eine "shared" JAR die die interfaces der serverseitigen RMI implementierung beinhaltet
3) Clientseitige JAR 

Sowohl 1) als auch 3) haben 2) bei sich im Classpath.

Wenn die Property-Datei nun in 1) ist, kommt der Client nicht dran (außer man bastelt sich selbst was zusammen). Legt man die Property aber in 2) ab, kommen sowohl Client als auch Server dran.

- Alex


----------



## dermoritz (23. Feb 2011)

danke für den Hinweis (wusste ich noch nicht). In meinem speziellen Fall geht es aber um eine jar-Datei die nicht direkt am RMI beteiligt ist. Vielmeher bindet der RMI Service diese ein. (Client und Server haben haben jeweil eine gleichbenannte property-Datei)

Meine Lösung ist im Moment tatsächlich in der beim RMI-Service beiliegenden java.service.policy "all permission" zu erteilen - damit geht es.

Mich würde aber dennoch interessieren welche Permission das genau ist - io.permission?


----------

