Frage

Ich habe ein Applet, dass Bedürfnisse JAXP zu nennen, insbesondere SAXParserFactory . Nun, wie Sie aus dem Javadoc sehen können, dies intern verwendet den Service Provider Mechanismus wie dokumentiert hier :

Insbesondere dann, wenn es META-INF/services/javax.xml.parsers.SAXParserFactory genannt keine Datei in keinen meiner Anwendung JAR-Dateien finden wird es versuchen, es aus meiner Anwendung Code-Basis zu holen. Wenn ich wie folgt eingesetzt mein Applet haben:

<applet code="com.example.applets.MyApplet" 
 codebase="http://www.example.com/myapp/" archive="myapp.jar, dom4j.jar">

Dann wird es versuchen, eine HTTP-Anfrage an zu machen http://www.example.com/myapp/META-INF/services/javax.xml.parsers.SAXParserFactory

Ich würde eher es das nicht, gerade weil mein Applet signiert ist und diese zusätzliche HTTP-Aufruf löst eine Warnung über unsignierten Code .

Nun ist die offensichtliche Lösung nur setzen die META-INF / services-Datei in meiner Anwendung JAR wie es sagt, aber wie mache ich das noch immer noch bekommen es die Benutzer-JRE Standardimplementierung von JAXP zu benutzen? Alternativ ist es eine Möglichkeit, die Applet-Laufzeit zu sehen nur in meinen JAR-Dateien und nicht in der codebase für diese Datei zu überzeugen?

. Hinweis: Ich weiß, ich könnte auch meine eigene Kopie von JAXP-RI einsetzen, aber das ist ziemlich schwergewichtige für ein Applet

War es hilfreich?

Lösung

Deaktivieren Sie den Code-Basis-Lookup:

<applet ...>
 <param name="codebase_lookup" value="false">
</applet>

Die AppletClassLoader prüft, ob ein boolean Eigenschaft sun.applet.AppletClassLoader.codebaseLookup, die durch Einstellen der oben Parameter beeinflusst werden kann. Das Verfahren sun.applet.AppletPanel.init() die Parameter lesen und in die AppletClassLoader gesetzt. Nach der Deaktivierung wird die AppletClassLoader machen Remote-Lookups für die Klassen zu stoppen und Ressourcen in der Codebasis, dass die URL von codebase="http://www.example.com/myapp/" gegeben ist und schauen nur in die Archive und Systemklassenpfade.

Hinweis: Ich habe das selbst nicht testen, aber nach Code-Review im demontierten Code, ich glaube ehrlich, könnte es funktionieren

.

Es ist auch in JavaSE - Technische Hinweise - Plugin Developer Guide - Spezielle Attribute :

  

codebase_lookup

     

Wenn das Applet Classloader benötigt eine Klasse oder eine Ressource (zB Konfigurationsdateien für steckbare Diensteanbieter des META-INF / service Verzeichnis) zu laden, ist es zunächst nach den erforderlichen Dateien in den Applet-JAR-Dateien und dann von der Applet-Codebasis. Typischerweise in den Applet-JAR-Dateien gespeichert Applets sind mit allen benötigten Klassen eingesetzt und Ressourcen. In diesem Fall ist der Code-Basis-Lookup nicht erforderlich.

     

Wenn die Klasse oder Ressource aus den Applet-JAR-Dateien nicht verfügbar ist, kann es besser sein, die Classloader haben, nicht eher als Versuch, einen Code-Basis-Lookup. Andernfalls muss eine Verbindung zum Applet-Codebasis gemacht werden für die Klasse oder Ressource zu suchen, und es kann Auswirkungen auf die Leistung auf das Applet-Laufzeit haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top