URLClassLoader выдает исключение определения класса. - PullRequest
0 голосов
/ 04 октября 2011

У меня есть 3 проекта Java A, B и C. B - это дополнение к A. A и B зависят от проекта C для некоторых классов.

Теперь в проекте A, когда я использую URLClassLoader, следующим образом:

URLClassLoader ucl = new URLClassLoader(urls); //urls are paths to some classes in B

Теперь, когда я использую эти ucl, когда я вызываю некоторые методы в B, это дает мне Исключение определения класса не найдено . Это для класса, который является C.

Теперь, когда я использую ClassLoader следующим образом:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URLClassLoader ucl = new URLClassLoader(urls, classLoader);

Это прекрасно работает, когда я вызываю методы в B. Мой вопрос:

1) Когда я делаю это первым способом, какой ClassLoader используется? Я прочитал JavaDocs, но не смог найти ничего, что я мог бы объяснить сам.
2) Есть ли способ получить ClassLoader, который будет специфичен для проекта B, который я могу каким-либо образом использовать, чтобы я не столкнулся с какими-либо проблемами с зависимостями?

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Когда вы используете свой первый URLClassLoader, который инициализируется только с путем для B, то, если что-то в B должно разрешить что-то в C для загрузки, оно будет коротким.Используя вторую форму, вы говорите: «Если вы не нашли здесь то, что вам нужно, посмотрите в загрузчик классов« parent »».Это позволяет разрешить С, и все будут довольны.

(Поймите, что единственный класс, который может загружаться без ссылки на другие классы, это Object - и даже это растяжка. Это не просто, что вам нужно ссылаться на суперкласс класса- на объекты в базовом JDK, по крайней мере, можно ссылаться через загрузчик системного класса, даже если нет родительского CL - но если вы вызываете какой-либо метод другого класса или манипулируете указателями на другой класс или любой такой вещью, вам нужноразрешить указанный класс.)

1 голос
/ 04 октября 2011

Загрузчиком классов по умолчанию является системный загрузчик классов (загружает классы по пути к классам).

Если вы загрузили классы в B с определенным загрузчиком классов, используйте этот экземпляр. В противном случае someTypeInB.getClass().getClassLoader() будет работать как взлом.

(Примечание: использование URLClassLoader.newInstance обычно предпочтительнее new URLClassLoader, поскольку оно добавляет меры безопасности, необходимые (хотя и не достаточные) для использования с ненадежным кодом. Также использование загрузчика классов контекста потока обычно является плохой идеей - вы вводите зависимость от локального фрагмента кода, как бы ни были настроены и использованы потоки [которые, вероятно, не имеют никакой согласованной политики в любом случае].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...