Domanda

Ho un applet che ha bisogno di chiamare JAXP, in particolare SAXParserFactory . Ora, come si può vedere dalla Javadoc, questo utilizza internamente il meccanismo Service Provider come documentato qui :

In particolare, se non trova un file in uno qualsiasi dei miei JAR applicazione chiamata META-INF/services/javax.xml.parsers.SAXParserFactory cercherà di prenderlo dalla mia applicazione codebase. Se ho il mio applet distribuito come segue:

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

Poi si cercherà di rendere una richiesta HTTP al http://www.example.com/myapp/META-INF/services/javax.xml.parsers.SAXParserFactory

preferirei non farlo, in particolare perché il mio applet è firmata e questo ulteriore trigger chiamata HTTP un avvertimento circa unsigned codice .

Ora, la soluzione più ovvia è quella di appena messo il file META-INF / servizi nella mia applicazione JAR, come si dice, ma come faccio a farlo ancora ancora ottenere in modo da utilizzare implementazione predefinita JRE dell'utente di JAXP? In alternativa, c'è un modo per convincere il runtime applet per guardare solo nei miei file JAR e non nel codebase per quel file?

Nota:. So che avrei potuto anche distribuire una copia di JAXP-RI, ma questo è abbastanza pesante per un applet

È stato utile?

Soluzione

Disattiva la ricerca codebase:

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

I controlli AppletClassLoader per un sun.applet.AppletClassLoader.codebaseLookup proprietà booleana, che può essere influenzato impostando il parametro di cui sopra. Il metodo sun.applet.AppletPanel.init() leggerà il parametro e impostarlo in AppletClassLoader. Una volta disattivato, l'AppletClassLoader smetterà di fare le ricerche a distanza per le classi e le risorse nel codice di base, che è l'URL data dal codebase="http://www.example.com/myapp/" e guardare solo negli archivi e percorsi delle classi di sistema.

Nota: non ho la prova io stesso, ma secondo la revisione del codice nel codice disassemblato, Onestamente credo che potrebbe funzionare

.

E 'anche documentata in JavaSE - Note tecniche - Guida Plugin Developer - attributi speciali :

  

codebase_lookup

     

Quando il programma di caricamento classe applet ha bisogno di caricare una classe o una risorsa (ad esempio, i file di configurazione per i service provider innesto nella directory META-INF / services), esso và alla ricerca per i file necessari nei file JAR dell'applet e poi dal codebase applet. In genere le applet vengono distribuiti con tutte le classi necessarie e le risorse contenute nei file JAR dell'applet. In questo caso, la ricerca base di codice non è necessaria.

     

Se la classe o la risorsa non è disponibile dai file JAR applet, può essere meglio avere la classloader sicuro, piuttosto che tentare una base di codice di ricerca. In caso contrario, una connessione deve essere fatta al codice di base applet per la ricerca per la classe o la risorsa, e può avere impatto sulle prestazioni del runtime applet.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top