如何在Java程序中打開.class或.jar文件? (記住.jar文件可能與主要(字串[] args不止一個類)方法)如何打開並運行已編譯的Java文件?
(個人問題從IDE-Style program running)
如何在Java程序中打開.class或.jar文件? (記住.jar文件可能與主要(字串[] args不止一個類)方法)如何打開並運行已編譯的Java文件?
(個人問題從IDE-Style program running)
正確的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()
訪問。
清單名罐子的entry point。
您可以打開任何壓縮軟件的.jar(WinRAR的開放,WinZip,7zip的),你可以用的java.exe運行的.class文件
不是我在找什麼 – Supuhstar 2010-10-29 08:13:00
使用
java -cp my.jar org.myorg.MyClass
如果MyClass的是你想開始的一個。如果my.jar
具有指示MyClass的你可以使用
java -jar my.jar
我認爲你的問題是關於在編譯時不知道外部類的規範的情況。我對嗎?
因此,您需要使用反射API來創建必要類的實例並調用其方法。你可以看到上面的例子。
而爲了確定從jar文件運行的類,您應該使用package'java.util.jar'通過Manifest類訪問清單。你可以從屬性'Main-Class'中確定這個jar的入口點。
嗯,有點太髒?我認爲它會調用**全部**主要方法。 'm.invoke'後面的'break'可以幫助;) – 2010-10-29 09:36:02
哈哈,是的。有點太髒了:P謝謝。更正了文字。 – aioobe 2010-10-29 09:37:27
試圖打開我剛纔創建的一個簡單的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