Я столкнулся с проблемой при попытке отправить приложение на JApplet
, чтобы он мог запускаться в браузере.Не удалось загрузить определение класса из jar
Содержание программы:
- Jar файл. Содержит мою реализацию
CustomClassLoader
. Сохраняется на веб-сайте. - Контент-каталог. Заполняется скомпилированными классами. Сохраняется на компьютере пользователя.
Выпуск:
Я получаю NoClassDefFoundError
при попытке загрузить файлы .class в каталог содержимого с моим CustomClassLoader
.
Ошибка, хотя и недостижимая, относится к классу внутри банки. Класс абстрактен. Все файлы .class в каталоге содержимого расширяют этот класс и заполняют все необходимые методы. При загрузке этих классов возникает ошибка. Программа, когда работает нормально java -jar file.jar
, работает отлично.
Это заставляет меня думать, что это связано с классом. Настройка
Безопасность:
Я бегу апплет с помощью команды appletviewer
так:
appletviewer -J-Djava.security.policy=policy file.html
В той же директории, мой файл политики:
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";
};
Что касается как я знаю, никаких других исключений безопасности не бросают. Апплет подписан.
HTML файла используется для загрузки 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>
Любая помощь в направлении исправления этой проблемы очень ценится.
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;
}
}
Пример 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[] {};
}
}
}
Вы можете взглянуть на это: http://stackoverflow.com/questions/17886565/export-java-applet-to-jar/17887205#17887205 –
У меня есть 2 класса загрузки. Один для доступа к банкам, явные ссылки на этот. Другой для доступа к апплетам, HTML-ссылки на этот. –
У любого из вас .java-файлов есть основной метод? –