У нас возникли трудности с преодолением ошибки смешанного кода для Java webstart. Таким образом, у нас есть наш основной файл JNLP, мы подписали весь наш код, который он загружает напрямую. Мы добавили опцию всех разрешений в основной JNLP. Основной класс, который он загружает, также происходит из подписанной банки.
Когда основной класс запускается немного позже, он запускает некоторые вещи, которым необходимо загрузить некоторые неподписанные ресурсы, которые извлекаются из JNLP B. Ни один из ресурсов JNLP B не подписан, и им не нужны какие-либо специальные разрешения.
Весь подписанный код был настроен на основе документации по смешанному коду от Oracle, а файлы jar были установлены с манифестами «Trusted-Library: true» перед подписанием.
Когда неподписанный код пытается загрузиться подписанным кодом, мы получаем ошибку class not found, например:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: org/some/external/package/that/is/not/signed
at org.our.signed.package.main(Main.java:87)
... 9 more
Caused by: java.lang.ClassNotFoundException: org.some.external.package.that.is.not.signed
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 10 more
Вот сценарий в JNLP:
JNLP A: (кратко)
<jnlp spec="1.5+" codebase="...." href="......">
<information>
...etc
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+" initial-heap-size="80m" max-heap-size="256m" href="http://java.sun.com/products/autodl/j2se"/>
<jar href="signedJar_1.jar" download="eager" main="true"/>
<jar href="signedJar_2.jar" download="eager" main="false"/>
<extension name="unsigned_ext" href="unsigned.jnlp"/>
</resources>
<application-desc main-class="(FROM SIGNED CLASS in signedJar_1.jar)"/>
</jnlp>
JNLP B (загрузчик unsigned.jnlp)
<jnlp spec="1.5+" codebase="....." href="......">
<information>
...etc
</information>
<resources>
<jar href="unsigned.jar"/>
</resources>
<component-desc/>
</jnlp>
Мы отметили, что исключения безопасности работают правильно, потому что, если мы переместим неподписанный jar-файл в JNLP, который имеет все разрешения и имеет подписанные jar-файлы, мы получим ожидаемые исключения безопасности, с которыми Java не позволит нам смешивать подписанный код. Trusted-Library: настоящий и неподписанный код без атрибутов манифеста.
Идеи? Есть ли причина, по которой загрузчик классов не может найти файлы Java из неподписанного кода? Есть ли что-то особенное, что нам не хватает, чтобы разрешить подписанному коду запускать неподписанный код? Я видел только случаи, когда у людей были проблемы с получением неподписанного кода для запуска подписанного кода, что я могу понять.