Ho riscontrato un problema durante il tentativo di trasferire un'applicazione su JApplet
in modo che possa essere eseguito su un browser.Impossibile caricare la definizione di classe dal jar
programma:
- file JAR. Contiene la mia implementazione
CustomClassLoader
. Memorizzato sul sito Web. - Directory dei contenuti. Pieno di lezioni compilate. Memorizzato sul computer degli utenti.
Problema:
sto ottenendo un NoClassDefFoundError
quando si tenta di caricare i file nella directory di contenuti .class con la mia CustomClassLoader
.
L'errore, sebbene irraggiungibile, si riferisce a una classe all'interno del vaso. La classe è astratta. Tutti i file .class nella directory del contenuto estendono questa classe e riempiono tutti i metodi richiesti. Durante il caricamento di queste classi, viene generato l'errore. Il programma, quando eseguito normalmente java -jar file.jar
, funziona perfettamente.
Questo mi fa credere che abbia a che fare con il classpath. Setup
Sicurezza:
Sono in esecuzione l'applet tramite il comando appletviewer
in questo modo:
appletviewer -J-Djava.security.policy=policy file.html
Nella stessa directory è il mio file di policy:
grant {
permission java.lang.RuntimePermission "getenv.APPDATA";
permission java.io.FilePermission "<<ALL FILES>>", "read, write, delete, execute";
permission java.lang.RuntimePermission "exitVM";
permission java.util.PropertyPermission "user.name", "read";
permission java.lang.RuntimePermission "createClassLoader";
};
Per quanto come so, non vengono lanciate altre eccezioni di sicurezza. L'applet è firmata.
file HTML utilizzato per caricare applet:
<!DOCTYPE html>
<html>
<body>
<object width="1000" height="600" classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="http://java.sun.com/products/plugin/autodl/jinstall-1_4-windows-i586.cab#Version=1,4,0,0">
<param name="archive" value="file.jar"/>
<param name="code" value="package.to.Boot"/>
</object>
</body>
</html>
Qualsiasi aiuto verso risoluzione di questo problema è molto apprezzato.
CustomClassLoader.java:
package org.obicere.cc.methods;
import java.io.File;
public class CustomClassLoader extends ClassLoader {
//...
private Class<?> loadClass(final File file) {
try {
final byte[] data = IOUtils.readData(file);
return super.defineClass(file.getName().substring(0, file.getName().length() - 6), data, 0, data.length);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Esempio Runner: CanReachRunner.java
import java.lang.reflect.Method;
import java.util.Random;
import org.obicere.cc.executor.Result;
import org.obicere.cc.tasks.projects.Runner;
public class CanReachRunner extends Runner {
@Override
public Result[] getResults(Class<?> clazz) {
try {
final Method method = clazz.getMethod("canReach", int.class, int.class, int.class);
final Random ran = new Random();
final Result[] results = new Result[10];
for (int i = 0; i < 10; i++) {
final int small = ran.nextInt(5) + 5;
final int large = ran.nextInt(5);
final int goal = (small + large * 5) + 5 + ran.nextInt(6);
results[i] = new Result(method.invoke(clazz.newInstance(), small, large, goal), (goal <= small + large * 5) && goal % 5 <= small, small, large, goal);
}
return results;
} catch (Exception e) {
return new Result[] {};
}
}
}
Si potrebbe dare un'occhiata a questo: http://stackoverflow.com/questions/17886565/export-java-applet-to-jar/17887205#17887205 –
Ho 2 classi di avvio. Uno per l'accesso jar, manifest link a questo. L'altro per l'accesso ad applet, collegamenti HTML a questo. –
Qualcuno di voi. I file .java hanno un metodo principale? –