Ahoj,řeším problém se zpožděním stažením appletu na webu. Mám aplikaci, která je celá zabalená v jaru o velikosti asi 400K, aplikace se spouští jako applet ve stránce. Applet je logickou součástí stránky, Java Web Start se nehodí. Problém je, že jar je pro řadu uživatelů pořád moc velký a zákazníci chtějí progress bar s informací o načítání appletu. Applet je Java 5 (6 už umí, co potřebuju, ale jsem vázán verzí 5). Program jsem rozdělil na dva jary: malý jar s appletem, který přes reflection volá třídy velkého jaru. Pro načtení tříd velkého jaru jsem vyplodil ClassLoader, který všechny třídy natáhne do paměti metodou getAllClassesFromJarFile. Všechno funguje jak má do okamžiku, kdy potřebuju provést nějakou privilegovanou akci. Oba JAR soubory jsou podepsané, pokud aplikaci zabalím do jednoho, všechno funguje jak má. Něřešil někdo z vás podobný problém?
Příklad:malý jar obsahuje samotný applet, který se vykreslí jako tlačítko a při stisknutí vyvolá main(String[]) třídy MujAppletClassLoaderTest (uznávám, že volání statické metody není košer, ale berte to jako příklad chování :o))
public class MujAppletClassLoaderTest {
public static void main(String[] args) {
String jarUrl =
"http://localhost/appletExampleTest/appletTests.jar";
URL jar = null;
try {
jar = new URL("jar:" + jarUrl + "!/");
} catch (MalformedURLException mue) {
System.err.println("Invalid URL: " + jarUrl);
}
MujClassLoader mcl = new MujClassLoader(jar);
HashMap allClasses = mcl.getAllClassesFromJarFile();
Class prvniClass = (Class)
allClasses.get("cz.applet.tests.Prvni");
Object prvniInstance = null;
try {
prvniInstance = prvniClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} Method zavolejDruhou;
try {
zavolejDruhou =
prvniClass.getMethod("zavolejDruhou", new Class[0]);
zavolejDruhou.invoke(prvniInstance, new Object[0]);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
Třída nejprve vytvoří instanci MujClassLoaderu a načte všechny třídy z
velkéko jaru. Potom před reflection volá instance tříd.
Velký jar v příkladě obsahuje pouze třídy Prvni a Druha.
package cz.applet.tests;
public class Prvni {
private String jmenoTridy = this.getClass().getName();
public Prvni() {
System.out.println("Byla vytvorena instance tridy " + jmenoTridy);
}
public void zavolejDruhou() {
Druha d = new Druha();
d.vypisUserHome();
}
}
package cz.applet.tests;
public class Druha extends Prvni {
public void vypisUserHome() {
System.out.println("vypisUserHome " +
System.getProperty("user.home"));
} }Problém je ve výrazu System.getProperty("user.home"); - program vyhodí SecurityException. Pokud je všechno v jenom Jar souboru nebo místo výrazu dáme neprivilegovaný příkaz, všechno je OK.
Můžete mě prosím někdo nakopnout správným směrem? Dík Petr Přibyl
smime.p7s
Description: S/MIME Cryptographic Signature
