Wie der Java Service Provider API Fool (jaxp)
-
25-09-2019 - |
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
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.