Подтвердить что ты не робот

Applet не загружается с помощью Java 1.7 в Windows 7, если файл jar имеет определенный размер

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

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

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

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 в тот же каталог и выполните с веб-сервера, например. Apache или Tomcat.
  • Посетите эту страницу HTML в Chrome или IE на ОС Windows 7. Апплет будет загружаться отлично!
  • Повторите вышеуказанные шаги, но на этот раз поместите небольшой файл, например. изображение (например, < 2KB) в каталог myapplet (рядом с MyApplet.class) перед созданием файла jar. Это также должно работать.
  • Повторите, но на этот раз добавьте большое изображение (например, > 100 КБ) в каталог myapplet (рядом с MyApplet.class), прежде чем создавать файл jar. Файл jar теперь будет довольно большим. Это не сработает, т.е. Апплет не загрузится. Если это так, и вы используете Windows 7, то, пожалуйста, дайте мне знать. Во время тестирования не забывайте, что апплеты кэшируются, поэтому нажмите клавишу x в консоли java, чтобы обновить кеш загрузчика классов и f5, чтобы обновить браузер.
4b9b3361

Ответ 1

Обходной путь для ошибка 7183450 в базе данных ошибок Java исправляет эту проблему, которая заключается в добавлении

-Djava.net.preferIPv4Stack=true 

аргументам JVM.

Например, чтобы запустить тестовый апплет (см. пример в моем вопросе выше):

<html>  
    <body>
        <applet code="myapplet.MyApplet" name="MyApplet" width="300" height="300" archive= "editor.jar" >
        <param name="java_arguments" value="-Djava.net.preferIPv4Stack=true">
    </applet>
    </body>
</html>

Возможно, это связано с тем, что удаленные серверы, на которых размещен наш апплет, в настоящее время не позволяют IPv6 связываться через свои брандмауэры.

Интересно, что некоторые из наших машин с Windows 7 все еще не работали даже с этим обходным решением при запуске Java 1.7_05, но затем работали (с этим обходным решением) при обновлении до Java 1.7_06 (который теперь доступен).