Апплет не загружается с Java 1.7 в Windows 7, если файл jar > определенного размера

У нас есть довольно сложный подписанный апплет, который отлично работает с тех пор, как мы его разработали пару лет назад. Он отлично работает с Java 1.5 и 1.6 во всех конфигурациях ОС/браузеров, которые нас интересуют.

Он не работает с Java 1.7 ни в одном браузере Windows 7 или Vista. Мы видели, как это работает на Windows XP.Этот апплет работает на сайтах, которые обслуживаются Apache, подключающимся к Tomcat 6 с использованием прокси мода _.

Это все для справочной информации, так как я свел проблему к очень простому апплету без знака :

package myapplet;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class MyApplet extends Applet {
    private static final long    serialVersionUID    = 1L;

    public void paint(Graphics g) {
        g.drawRect(0, 0, 250, 100);
        g.setColor(Color.blue);
        g.drawString("Look at me, I'm a Java Applet!", 10, 50);
    }
}

. Если этот класс апплета помещается в файл jar с другим файлом, который занимает общий (сжатый )размер файла jar более 18 КБ, тогда апплет не загружается при обслуживании Tomcat 6 (или Apache 2.2. )работает локально.

Я поиграл, добавив текстовый файл в файл jar и изменив размер текстового файла. Я довел его до того, что он перестал работать, добавив один символ в текстовый файл.

Глядя на журнал консоли с трассировкой, он зависает в том месте, где он пытается загрузить файл jar. Вот нить, которая, я думаю, висит:

"thread applet-com.bright.assetbank.clientsideedit.myapplet.MyApplet-1" prio=4 tid=0x048d8c00 nid=0x19b8 runnable [0x0700d000]
    java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.read1(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    - locked <0x29fd75b0> (a java.io.BufferedInputStream)
    at sun.net.www.MeteredStream.read(Unknown Source)
    - locked <0x29fd75d0> (a sun.net.www.http.KeepAliveStream)
    at java.io.FilterInputStream.read(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.read1(Unknown Source)
    at java.io.BufferedInputStream.read(Unknown Source)
    - locked <0x29fd7630> (a java.io.BufferedInputStream)
    at java.io.FilterInputStream.read(Unknown Source)
    at sun.plugin.PluginURLJarFileCallBack.downloadJAR(Unknown Source)
    at sun.plugin.PluginURLJarFileCallBack.access$000(Unknown Source)
    at sun.plugin.PluginURLJarFileCallBack$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin.PluginURLJarFileCallBack.retrieve(Unknown Source)
    at sun.net.www.protocol.jar.URLJarFile.retrieve(Unknown Source)
    at sun.net.www.protocol.jar.URLJarFile.getJarFile(Unknown Source)
    at sun.net.www.protocol.jar.JarFileFactory.get(Unknown Source)
    at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source)
    at sun.plugin.net.protocol.jar.CachedJarURLConnection.connect(Unknown Source)
    at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFileInternal(Unknown Source)
    - locked <0x29f2a938> (a sun.plugin.net.protocol.jar.CachedJarURLConnection)
    at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFile(Unknown Source)
    - locked <0x29f2a938> (a sun.plugin.net.protocol.jar.CachedJarURLConnection)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.getJarFile(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.access$1000(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.ensureOpen(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.<init>(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
    at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source)
    - locked <0x29dc7e98> (a com.sun.deploy.security.DeployURLClassPath)
    at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source)
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    - locked <0x29dc7ed8> (a sun.plugin2.applet.Applet2ClassLoader)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    - locked <0x29dc7f78> (a sun.plugin2.applet.Applet2ClassLoader)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    - locked <0x29dc7f78> (a sun.plugin2.applet.Applet2ClassLoader)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.initAppletAdapter(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Вот последние 4 строки в консоли Java:

network: Cache entry not found [url: http://localhost/editor.jar, version: null]
network: Connecting http://localhost/editor.jar with proxy=DIRECT
network: Connecting http://localhost:80/ with proxy=DIRECT
network: Connecting http://localhost/editor.jar with cookie "csrftoken=523154b2e73a76b6f2088464bd4df4f7"

Некоторая дополнительная информация:

  • В Windows Vista, работающей под управлением Java 7 в браузере, наш основной апплет (, обслуживаемый Apache ->mod _proxy ->tomcat ), загружается, если я сниму флажок «Включить проверку отзыва из черного списка». Он не загружается, если это проверено. Снятие этого флажка не имеет никакого эффекта (, т. е. не заставит его работать )в Windows 7.
  • Я попытался разместить свой тестовый апплет в Tomcat (локально ), Apache (локально )и Apache (на удаленном сервере, к которому я обращаюсь через Интернет ). Для каждого был установлен размер jar-файла, выше которого апплет не загружался -. однако этот размер варьировался между веб-серверами . Например, на удаленном сервере файл jar может быть намного больше -, он должен быть больше ~1 МБ, прежде чем он не загрузится.

Кто-нибудь еще видел такое поведение при попытке загрузить апплет с Java 7, работающий в браузере в Windows 7 или Vista? Есть ли решение?

Шаги -по -пошаговые инструкции по воспроизведению этой проблемы:

  • Скопируйте приведенный выше код в файл с именем MyApplet.java, расположенный в каталог с именем myapplet
  • Скомпилируйте код, например, javac MyApplet.java
  • Создайте файл jar :cd в родительском каталоге myapplet и введите jar -cvf editor.jar myapplet
  • Создайте простую HTML-страницу, чтобы показать апплет.

Например:

<html>  
    <body>
        <applet code="myapplet.MyApplet" name="MyApplet" width="300" height="300" archive= "editor.jar" ></applet>
    </body>
</html>
  • Поместите этот файл HTML и файл jar в один и тот же каталог и обслуживайте с веб-сервера, например. Апач или Томкэт.
  • Посетите эту HTML-страницу в Chrome или IE в ОС Windows 7. Апплет загрузится нормально!
  • Повторите вышеуказанные шаги, но на этот раз поместите небольшой файл, например. изображение (например. <2 КБ )в каталог myapplet (рядом с MyApplet.class )перед созданием jar-файла. Это также должно работать.
  • Повторите, но на этот раз поместите большое изображение (, например. >100 КБ )в каталог myapplet (рядом с MyApplet.class )перед созданием jar-файла. Файл jar теперь будет довольно большим. Это не сработает, т.е. апплет не загрузится. Если это так, и вы используете Windows 7, сообщите мне об этом. Во время тестирования не забывайте, что апплеты кешируются, поэтому нажмите клавишу x в консоли java, чтобы обновить кеш загрузчика классов, и f5, чтобы обновить браузер.
13
задан 20 revs, 3 users 100% 19 August 2012 в 07:36
поделиться