I have a little Java Applet and I have an annoying issue. I have signed my JAR with my own keystore using jarsigner tool (following these instructions).
The Java Applet downloads a signed JAR and tries to launch it with an extended class of URLClassLoader. This JAR tries to execute this line of code:
ClassLoader.getSystemClassLoader().getResource("aResource");
It fails with a large stack trace finished by:
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
at java.security.AccessController.checkPermission(AccessController.java:555)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1476)
at test.SecondJAR.main(SecondJAR.java:8)
(Line 8 of test.SecondJAR corresponds to getResource(...) method
When the Java Applet is launched, the user is prompted to accept the certificate if he/she trusts the publisher:

Even if I accept it, the exception occurred. Even if I install the certificate, and the prompt message is automatically accepted, the exception occurred.
I have tried too this:
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
ClassLoader.getSystemClassLoader().getResource("aResource");
return null;
}
});
And it fails with the same exception.
Any help would be appreciated!
getSystemClassLoaderorgetResourcebut the stack trace saysgetContextClassLoader(use of which is rarely a good idea). Perhaps a bit more stack trace would be useful.URLClassLoaderwill use permissions (throughProtectionDomain) appropriate from where the code was downloaded (Same Origin Policy). It's very difficult to get this sort of thing right. Do you really need to do this? An apparently common reason to try this sort of thing is to avoid having to keep signing code. Mobile code needs to be signed to be trusted for good reason!getResource(...)line.