Исключение ClassNotFound при загрузке апплета в Chrome

Мне трудно заставить Java-апплет работать в Chrome. Загрузчик классов не может найти класс, хотя он отлично работает в Firefox, Opera и Safari.

Вот мой тестовый класс апплета (я даже убрал объявление пакета, чтобы упростить его):

import java.awt.Graphics;
import java.applet.Applet;

public class Test extends Applet
{
    public void init() { repaint(); }

    public void paint( Graphics g ) {
        g.drawOval(10, 10, 30, 50);
        g.drawLine(15, 30, 22, 32);
        g.fillOval(28, 28, 7, 5);
        g.drawArc(15, 20, 20, 35, 210, 120);
    }
}

Вот минималистичная тестовая страница:

<!doctype html>
<html><head>
  <meta charset="utf-8"/>
  <title>Test</title>
</head><body>
  <p>
    <object type="application/x-java-applet" width="50" height="70">
      <param name="code" value="Test" />
      Test failed.
    </object>
  </p>
</body></html>

Вот трассировка стека:

java.lang.ClassNotFoundException: Test
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Applet2ClassLoader.java:252)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Plugin2ClassLoader.java:250)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:180)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Plugin2ClassLoader.java:161)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Plugin2ClassLoader.java:687)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:3046)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1498)
    at java.lang.Thread.run(Thread.java:680)

Я скомпилировал класс с помощью javac Test.java и поместил файл .class в ту же папку, что и файл .html. Опять же, это прекрасно работает как в Firefox, Safari, так и в Opera, так почему бы и нет в Chrome?

Я пытался создать банку и добавить <param name="archive" value="Test.jar" />, но это не помогло.

О, и пока я спрашиваю: есть ли официальная спецификация, в которой перечислены параметры <param>, которые можно использовать с апплетами в тегах <object>? Его нет в спецификации HTML5, что имеет смысл, но Oracle, похоже, предпочитает старый заброшенный тег <applet>, и мне нужно использовать строгий HTML5.

Окружающая среда

MacBook Pro под управлением OS X 10.7.1

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode)

Гугл Хром 13.0.782.220


person Rolf Staflin    schedule 15.09.2011    source источник
comment
Используйте deployJava.js для развертывания апплета. , а не собственное домашнее решение.   -  person Andrew Thompson    schedule 16.09.2011
comment
Я согласен. Причина, по которой я делаю это таким образом, заключается в том, что я редактирую книгу об HTML. Ближе к концу есть один пример того, как вставить апплет Java, и я хотел бы, чтобы он был коротким. Часть, посвященная Java, выходит за рамки книги, но добавление апплета на страницу — нет.   -  person Rolf Staflin    schedule 16.09.2011
comment
Затем используйте элемент applet, а не элемент object. ЦЕЛОВАТЬ!   -  person Andrew Thompson    schedule 16.09.2011
comment
[см. мой комментарий к вашему ответу ниже]   -  person Rolf Staflin    schedule 16.09.2011


Ответы (2)


Чтобы упростить тестирование, измените это:

<!doctype html>
<html><head>
  <meta charset="utf-8"/>
  <title>Test</title>
</head><body>
  <p>
    <object type="application/x-java-applet" width="50" height="70">
      <param name="code" value="Test" />
      Test failed.
    </object>
  </p>
</body></html>

К этому:

<html>
<head>
  <meta charset="utf-8"/>
  <title>Test</title>
</head>
<body>
  <p>
    <applet code="Test" width="50" height="70">
      Test failed.
    </applet>
  </p>
</body>
</html>

Обновление 1

Обратите внимание, что deployJava.js является правильным способом встроить апплет в эти дни. Он пишет объект или элемент внедрения по мере необходимости браузеру и стремится сделать это правильно.

person Andrew Thompson    schedule 16.09.2011
comment
Спасибо. Опять же, я обновляю свою книгу до HTML5. И тег <applet>, и атрибут classid в <object> исчезли в HTML5. <applet> был объявлен устаревшим даже в HTML 4.01 1999 года. Я, конечно, упоминаю эти альтернативы как альтернативу для старых браузеров, но я хотел бы показать правильный новый способ добавления апплета. Я понимаю, почему WHATWG удалила из HTML5 все, что связано с Java, и, естественно, Oracle хочет сохранить старые добрые времена, когда у Java был собственный тег в HTML. К сожалению, это означает, что я не смог найти никаких официальных источников о том, как добавить апплет в HTML5. - person Rolf Staflin; 16.09.2011
comment
Что возвращает меня к... Что не так с deployJava.js? В наши дни это правильный способ встраивания апплета. Он записывает элемент object или embed по мере необходимости браузеру и стремится сделать это правильно. Я чувствую, что мы ходим по кругу. - person Andrew Thompson; 16.09.2011
comment
Моя проблема с deployJava.js в том, что это слишком много для книги. Но вы правы; это является правильным решением для развертывания апплета Java. Пожалуйста, напишите это еще раз в ответе, чтобы я мог отметить это как решение! - person Rolf Staflin; 16.09.2011

Похоже, он просто не видит ваш апплет.

  1. Параметр архива является обязательным. Путь к вашему банку должен быть указан правильно.
  2. Если вы не укажете путь, предполагается, что он находится в том же каталоге, что и ваша тестовая страница, а не в подкаталоге.

И мы также предполагаем, что эта банка содержит ваш Test.class :)

person andreotti    schedule 15.09.2011
comment
Спасибо за ответ! Хотя я это тщательно проверил. Полезно знать, что параметр архива является обязательным — где я могу найти документацию по этим параметрам? - person Rolf Staflin; 16.09.2011
comment
Параметр архива является обязательным Нет, это не так. Не в соответствии с этими примерами от W3C. Кроме того, если бы элемент был элементом апплета, он был бы необходим только в том случае, если апплет использует архивы. - person Andrew Thompson; 16.09.2011