2013-09-06 2 views
0

Пожалуйста, знайте, что это была размещена на Oracle Java Forum в https://forums.oracle.com/thread/2577877Подпись Код смеси Applet под J7u21or J7u40 дает java.lang.NoClassDefFoundError

У меня есть простой апплет, который показывает график; этот апплет имеет два баночку файла, основной файл банка подписан доверенный центр сертификации, а другой файл фляга беззнаковое

в манифесте для подписанного файла банки, я добавил

Trusted-Library value="true" 

При запуске апплета из java-консоли, когда он пытается вызвать объект create в классе из файла unsigned jar, я получаю java.lang.ClassNotFoundException для данного класса из неподписанного флага.

Я попробовал это на окне 7 Chrome и Интернет-исследователя на основе различных Java 7 выпуска (40, 21 на интернет-проводник и выпуск 6 на Chrome)

Это не работает.

Если я подписал второй файл jar, он отлично работает.

Обратите внимание, что я не хочу обойти проверку кода микширования из конфигурации java.

Любая идея или подсказка будут высоко оценены.

+0

В манифесте должно быть 'Trusted-Library: true'. –

+0

Он добавлен уже в манифест. Я открыл манифест и проверил, что он есть. Пожалуйста, внимательно прочитайте сообщение –

+1

Пожалуйста, внимательно прочитайте мой комментарий. Фактически, делайте больше, чем это. Выберите «серый текст» в нем и выполните «find» в этой строке на этой странице. В настоящее время для этого есть два хита, и *** ни один из них не находится в вашем вопросе. –

ответ

0

Это подтверждается пост https://forums.oracle.com/thread/2280127

и это подтверждается Oracle http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/mixed_code.html#trusted_library

«Код в банке файл, который должен быть отмечен с явным атрибутом Доверенные библиотеки, возможно, потребуется немного изменить если он использует вызовы, зависимые от класса загрузчика [...] Код в доверенной библиотеке может искать нормальный загрузчик, вызывая Thread.currentThread(). getContextClassLoader(). [...] Как правило, чтобы код в доверенной библиотеке был написан аккуратно и безопасно и в остальном совместим с загрузкой i n отдельный экземпляр загрузчика классов из любых оставшихся банок, которые являются частью приложения и загружаются обычным загрузчиком ».

«Thread.currentThread(). GetContextClassLoader(). [...]»

Я просто сделал простой тест, чтобы вызвать метод из доверенной банки в песочнице банку, я использовал отражение, чтобы сделать это и это сработало.

Кажется, что для каждого использования классов файлов jar-файлов в изолированном файле jar мы должны использовать отражение (загружать класс, вызывать требуемый метод). Это путь вперед. Может ли кто-нибудь подтвердить это.

частная пустота useReflection() { попробовать {

 // using normal class loader 
    Class<?> clazz = Class.forName("com.abc.bla.bla.SandBox", true, Thread.currentThread().getContextClassLoader()); 
    Constructor<?> constructor = clazz.getConstructor(); 
    Object obj = constructor.newInstance(new Object[] {}); 

    Method method = clazz.getMethod("sayHello", new Class[] {}); 
    method.invoke(obj, new Object[] {}); 
    } 
    catch (Exception ex) 
    { 
    ex.printStackTrace(); 
    } 

}

В целом, кажется, что мы должны использовать отражение для того, чтобы загрузить файл песочница банку (ненадежный), чтобы использование обычного загрузчика классов и избежать использования по умолчанию с помощью инструкции import, которая является специальной, предназначенной для подписанного (доверенного) файла jar, который находится в режиме смешивания в соответствии с дополнительным атрибутом манифеста.