2011-11-12 37 views
5

如果你從未玩過Minecraft,那麼這就是發射器的工作原理。啓動外部JAR文件需要什麼,比如Minecraft啓動器?

用戶可以下載JAR(或打包成EXE的JAR),它完全沒有Minecraft客戶端的代碼。這被認爲是發射器。當啓動器啓動時,它會顯示帶有消息等的登錄屏幕。然後,登錄後,啓動器運行主要的Minecraft核心minecraft.jar。如果它不在系統上,它會下載它。 Minecraft啓動器不需要任何外部Java庫來運行。

它是如何做到這一點的?我試圖複製功能,但是,當我在Eclipse中導出爲可運行JAR時,當我嘗試啓動它時,它打印出「找不到主類launcher.jar。程序將退出」(this是在控制檯上,我希望能夠雙擊JAR並將其推出)

File file = new File(System.getProperty("user.dir") + "/lessur.jar"); 
System.setProperty("org.lwjgl.librarypath", System.getProperty("user.dir") + "natives"); 
URLClassLoader classLoader; 
classLoader = URLClassLoader.newInstance(new URL[]{file.toURI().toURL()});   
classLoader.loadClass("zombie.engine.Lighting2").newInstance(); 

回答

3

Runnable的JAR文件需要一個清單,表示主類使用。從eclipse導出時,一個選項是選擇一個運行配置(例如從之前的測試運行),eclipse使用該信息填充清單。

更新:根據上面的輸出和下面的註釋,再考慮一下後,我的猜測是,您正嘗試使用命令行中的'java'命令來運行jar。如果是這樣的話,你需要使用:
java -jar launcher.jar
不是:
java launcher.jar

這裏是什麼,我想你再現看到:

C:\Users\Tim\Desktop>java launcher.jar
Exception in thread "main" java.lang.NoClassDefFoundError: launcher/jar Caused by:
java.lang.ClassNotFoundException: launcher.jar
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: launcher.jar. Program will exit.

C:\Users\Tim\Desktop>java -jar launcher.jar
Ran

+0

我已經這樣做了,這裏是MANIFEST.MF從導出的JAR中的內容 - Manifest-Version:1.0 C lass-path:。 Main-Class:Main – liamzebedee

+0

假設你在該JAR中有一個名爲'Main.class'(沒有包)的類,並且該類包含格式正確的'main'函數? –

+0

是的,我確實是 – liamzebedee

1
// Use the File constructor that will insert the correct separator for the OS 
File file = new File(System.getProperty("user.dir"), "lessur.jar"); 
System.out.println("File exists: " + file.exists()); 
File libs = new File(System.getProperty("user.dir"), "natives"); 
System.out.println("Libs exists: " + libs.exists()); 
System.setProperty("org.lwjgl.librarypath", libs.toString());