2010-10-29 60 views

回答

4

正確的MANIFEST.MF文件,這裏是一個快速和骯髒破解運行在罐子裏發現的所有主要方法。

import java.io.*; 

class JarRunner { 

    public static void main(String[] args) throws IOException, 
                ClassNotFoundException { 

     File jarFile = new File("test.jar"); 
     URLClassLoader cl = new URLClassLoader(new URL[] {jarFile.toURL() }); 
     JarFile jf = new JarFile(jarFile); 

     Enumeration<JarEntry> entries = jf.entries(); 
     while (entries.hasMoreElements()) { 
      JarEntry je = entries.nextElement(); 
      String clsName = je.getName(); 

      if (!clsName.endsWith(".class")) 
       continue; 

      int dot = clsName.lastIndexOf('.'); 
      Class<?> clazz = cl.loadClass(clsName.substring(0, dot)); 
      try { 
       Method m = clazz.getMethod("main", String[].class); 
       m.invoke(null, (Object) new String[0]); 
      } catch (SecurityException e) { 
      } catch (NoSuchMethodException e) { 
      } catch (IllegalArgumentException e) { 
      } catch (IllegalAccessException e) { 
      } catch (InvocationTargetException e) { 
      } 
     } 
    } 
} 

正如其他海報所說,你可能想在主類清單文件一看(這樣你就不必猜測做)。這可以通過JarFile.getManifest()訪問。

+0

嗯,有點太髒?我認爲它會調用**全部**主要方法。 'm.invoke'後面的'break'可以幫助;) – 2010-10-29 09:36:02

+0

哈哈,是的。有點太髒了:P謝謝。更正了文字。 – aioobe 2010-10-29 09:37:27

+0

試圖打開我剛纔創建的一個簡單的GUI程序(http://supuh.wikia.com/wiki/Blue_Husky's_Randomizer),併爲它掃描的每個類獲取了一個ClassDefNotFoundError。問題行是「Class c = cl.loadClass(clsName.substring(0,dot));」 – Supuhstar 2010-10-29 21:46:52

2

清單名罐子的entry point

+0

以及如何訪問java中的清單? – Supuhstar 2010-10-29 08:10:32

+1

這是一個zip文件。打開它並閱讀它。像使用'java.util.zip'一樣。然後使用此:http://snippets.dzone.com/posts/show/3574 – 2010-10-29 08:29:36

+1

像任何其他文本文件。但使用jar運行的正確方式是使用'java.util.jar'包。處理清單有特殊的Manifest類。 – Donz 2010-10-29 08:31:48

1

您可以打開任何壓縮軟件的.jar(WinRAR的開放,WinZip,7zip的),你可以用的java.exe運行的.class文件

+0

不是我在找什麼 – Supuhstar 2010-10-29 08:13:00

3

使用

java -cp my.jar org.myorg.MyClass 

如果MyClass的是你想開始的一個。如果my.jar具有指示MyClass的你可以使用

java -jar my.jar 
0

我認爲你的問題是關於在編譯時不知道外部類的規範的情況。我對嗎?

因此,您需要使用反射API來創建必要類的實例並調用其方法。你可以看到上面的例子。

而爲了確定從jar文件運行的類,您應該使用package'java.util.jar'通過Manifest類訪問清單。你可以從屬性'Main-Class'中確定這個jar的入口點。

相關問題