2013-12-13 2 views
0

Есть ли способ определить начальную точку java-апплета, заданную только файлом jar? Я пытаюсь создать веб-сайт, где я могу загрузить файл jar апплета, а затем воспроизвести его с чем-то похожим на следующее.Как определить точку входа Java-апплета из его JAR-файла?

<object type="application/x-java-applet" height="450" width="450"> 
    <param name="code" value="<? echo $startingClass; ?>" /> 
    <param name="archive" value="<? echo $jarUrl; ?>" /> 
    Applet failed to run. 
</object> 

Апплет, который я получил, не имеет правильных файлов манифеста или jnlp. Я попытался использовать jar -tvf 'jarfile.jar', чтобы получить список всех классов в файле jar, но не могу определить, какая из них является точкой входа.

Любая помощь приветствуется!

ответ

1

Звучит очень сложно для меня. Грубо говоря, я думаю, что это необходимо:

  1. после загрузки кувшина на сервере, вам потребуется пользовательский загрузчик классов, чтобы загрузить банку на сервере (см Load jar dynamically).
  2. Затем вы можете использовать Reflection, чтобы найти в нем основной класс апплета,
  3. , тогда вы должны перенаправить на JSP, где вы можете сгенерировать необходимый тег <object>.
1

.. но не может определить, какая из них является точкой входа.

использовать что-то вроде:

if (exampleOfClass instanceof Applet) { // We're good to go!... 
+0

Как будет идти об использовании информации из строки "pac/kage/ClassName.class", чтобы получить класс, который я могу проверить экземпляр? – pLiKT

+0

А, я могу использовать Class.forName ("pac.kage.ClassName"), чтобы получить класс. Очень круто! Я не могу создать экземпляр фактического объекта, но Applet.class.isAssignableFrom работает. – pLiKT

0

Здесь есть частичное решение на основе других замечаний, но я столкнулся с проблемой, где были определены не все подклассы апплетов (How can identify Applet subclasses from a Jar file?). Программа распечатает классы внутри Jar-файла, которые являются подклассом Applet. Одним из этих классов (возможно, самого производного класса) является точка входа.

import java.applet.Applet; 

public class JarAppletIdentifier 
{ 
    public static void main(String [] args) 
    throws Exception 
    { 
    for(String class_name : args) { 
     class_name = class_name.replace(".class", ""); 

     Class<?> c = Class.forName(class_name); 
     if(Applet.class.isAssignableFrom(c)) 
     System.out.println(class_name); 
    } 
    } 
} 

Этот фрагмент ожидает в качестве аргумента списка классов в файле jar.

Использование Linux, аргументы могут быть считаны из файла фляги и анализируется с помощью

// prints out, eg. 
// pac.kage.Main.class 
// pac.kage.Other.class 
// user.pac.kage.SomeClass.class 
jar_classes=$(jar -tf example.jar | 
    grep .class | grep -v "\\$" | grep -v "^\." | sed 's/\//\./g') 

Вы можете передать этот результат в программу с

echo $jar_classes | xargs java -classpath "example.jar" JarAppletIdentifier 
Смежные вопросы