# URL Handler wird nicht gefunden



## mschill (5. Mai 2009)

Hallo
Ich habe einen kleinen URL Handler geschrieben, welcher Daten aus dem Classpath lädt:

```
public class Handler extends URLStreamHandler {

	@Override
	protected URLConnection openConnection(URL u) throws IOException {
		
		URL url = this.getClass().getClassLoader().getResource(u.getPath());
		if (url == null) {
			return null;
		}
		return url.openConnection();
	}
}
```
Der Einfachheit halber habe ich ihn in das package sun.net.www.protocol.classpath reingetan, damit er automatisch geladen wird, ohne dasss man irgendwelche Properties setzen muss. Leider bekomme ich bei URLs dennoch die Exception: java.net.MalformedURLException: unknown protocol: classpath

(Beispiel für eine URL: classpath:ch/switchcollection/xslt/oai_dc_to_chor_dc.xsl )

Kann mir da jemand weiterhelfen?


----------



## Ebenius (5. Mai 2009)

Ich habe das eben getestet. Bei mir funktioniert's: 
	
	
	
	





```
/* (@)Handler.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package sun.net.www.protocol.test;

import java.io.IOException;
import java.net.*;

public class Handler extends URLStreamHandler {

  @Override
  protected URLConnection openConnection(URL u) throws IOException {
    return new URL("http://www.java-forum.org").openConnection();
  }

  public static void main(String[] args)
        throws MalformedURLException, IOException {
    new URL("test:abc").openConnection();
    System.out.println("Successfully opened connection to java-forum.org");
  }
}
```
Allerdings gefällt es mir gar nicht, ein sun-Package zu benutzen. Das gehört sich nicht. 

BTW: Hintergrund für alle die sich in das Thema einlesen wollen.

Ebenius


----------



## mschill (5. Mai 2009)

Ich hatte es erst in einem eigenen Package und das entsprechende System-Property gesetzt, ging aber auch nicht.

Könnte es daran liegen, dass das ganze im Glassfish läuft?

Edit: hab es gerade mal "Standalone" verwendet, und da scheint es zu gehen ...  Irgendwie funzt das zusammen mit dem AS und/oder orbeon nicht richtig, weiss da jemand weiter?


----------



## mschill (5. Mai 2009)

Ich glaube ich habe das Problem gefunden: Glassfish verwendet für Servlets catalina aka tomcat. Da gibt es das "Problem", dass die Klassen nicht mit dem System-Classloader geladen werden. Da aber java.net.URL die Handler mit dem System-Classloader lädt, findet es meinen Handler nicht . Das ist ein scheinbar schon seit 2002 bekannter Bug der noch nicht gefixt wurde (habe gerade in die Sourcen von JDK-7 geschaut: Wird immer noch Class.forName bzw. ClassLoader.getSystemClassLoader() verwendet).

Einzige Alternative: Beim einlesen der URL mit einem if vezweigen. Richtig hässlich also, da der Tomcat leider URL.setURLStreamHandlerFactory bereits einmal aufgerufen hat und sich dies nicht überschreiben lässt.


----------



## Ebenius (5. Mai 2009)

Du kannst ggf. das catalina.sh-Skript anpassen... Klingt aber nicht so schön. :autsch:

Ebenius


----------



## maki (5. Mai 2009)

> Da gibt es das "Problem", dass die Klassen nicht mit dem System-Classloader geladen werden.


Sicher dass es sich dabei um einen Bug handelt und nicht doch um gewünschtes Verhalten?

Um Daten aus dem CP zu laden gibt es auch einfachere Möglichkeiten, oder?


----------



## mschill (5. Mai 2009)

Da ich ein universal einsetzbares .war machen will, ist das leider nicht möglich, zumal der Glassfish eine eingebettete Variante von Tomcat verwendet (u. A. auch komplett andere Konfiguration).

Der Bug ist nicht, dass die Klassen nicht mit dem System-Classloader geladen werden, sondern das URL ausschliesslich mit dem System-Classloader funktioniert.


----------

