2013-12-13 74 views
0

有沒有一種方法可以確定只給出jar文件的java applet的起點?我試圖創建一個網站,我可以上傳一個applet的jar文件,然後用類似於以下內容的方式播放它。如何從JAR文件中確定Java applet的入口點?

<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> 

我得到的applet沒有正確的清單或jnlp文件。我試過使用jar -tvf'jarfile.jar'來獲取jar文件中所有類的列表,但無法確定哪一個是入口點。

任何幫助表示讚賞!

回答

1

聽起來很複雜。大概我想這是需要:

  1. 服務器上的罐子上載後,您將需要一個自定義類加載器加載服務器上的罐子(見Load jar dynamically)。
  2. 然後你可以使用反射來找到小程序是主類,
  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,這個論點可以從jar文件中讀取和使用

// 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