Мое приложение использует Standard Widget Toolkit (SWT) для своего графического интерфейса. Моя проблема в том, что 32-битная библиотека SWT не работает на 64-битной JVM. Но я не хочу, чтобы люди выбирали правильную архитектуру при получении программного обеспечения. Итак, я хочу объединить и 32-битные и 64-битные библиотеки и автоматически определять архитектуру во время выполнения. Я узнал, что могу получить правильную архитектуру JVM следующим образом:
if (System.getProperty("os.arch").contains("64")) {
// ...
}
Теперь осталось только загрузить банку. Но проблема в том, что все примеры, которые я нашел, требуют, чтобы вы вручную загрузили класс перед его использованием.
Class.forName("MyClass", false, myClassLoader);
Итак, мой вопрос: можно ли "зарегистрировать" мой загрузчик классов, чтобы мне не приходилось загружать классы заранее?
Обновление: Я создал свой собственный дочерний класс URLClassLoader
и установил его в качестве загрузчика классов по умолчанию с аргументом командной строки -Djava.system.class.loader
; но я получаю эту ошибку:
Error occurred during initialization of VM
java.lang.Error: java.lang.NoSuchMethodException: com.program.LibraryLoader.<init>(java.lang.ClassLoader)
at java.lang.ClassLoader.initSystemClassLoader(Unknown Source)
at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)
Я думаю, LibraryLoader.<init>
относится к конструктору ... но он есть (public LibraryLoader(URI[] urls)
).
Обновление 2: Почти здесь JVM работает. Я добавил этот конструктор, чтобы он работал:
public LibraryLoader(ClassLoader classLoader) {
super(new URL[0], classLoader);
}
Но после добавления банок с addPath()
(file:lib/jars/swt.jar
) он выдает только NoClassDefFoundError
. Да, я дважды проверил, что файл существует.