2009-06-08 18 views
5

में एक जार आर्काइव चला रहा है, मैं अपने चल रहे जावा एप्लिकेशन के भीतर से एक रननेबल जार आर्काइव चलाने के लिए चाहता हूं। मुझे अपने आवेदन के भीतर से चल रहे वर्गों को नियंत्रित करने में सक्षम होना चाहिए (यानी रोकें, उन्हें शुरू करें आदि)।चल रहे जावा एप्लिकेशन

असल में मुझे "जावा -जर एक्स.जर" के ईक्विलाइन्ट करने की आवश्यकता है।

मैं Runtime.getRuntime()। Exec ("...") का उपयोग नहीं कर सकता क्योंकि जार फ़ाइलों को एन्कोड किया जाएगा और उन्हें पहले डीकोड करने की आवश्यकता है।

उत्तर

4

एक 'निष्पादन योग्य जार' एक साधारण जार फ़ाइल है जहां मेनिफेस्ट की एक विशेष संपत्ति है जो 'मुख्य' को परिभाषित करती है।

तो आप बस अपने निष्पादन योग्य जार को क्लासपाथ पर डाल सकते हैं, 'मुख्य' वर्ग की पहचान कर सकते हैं और इस वर्ग की स्थिर मुख्य विधि को कॉल कर सकते हैं।

+1

एक कस्टम का उपयोग करना चाहें कक्षाओं को गतिशील रूप से लोड करने के लिए क्लासलोडर या URLClassLoader.newInstance। क्लासलोडर, जारफाइल और प्रतिबिंब के लिए शानदार प्रदर्शन के लिए –

9

यहाँ जार फ़ाइल से Main-Class के नाम खींच एक JarFile तो एक URLClassLoader का उपयोग कर जार से वर्ग लोड हो रहा है और उसके बाद प्रतिबिंब का उपयोग static void main लागू का उपयोग करने का एक उदाहरण है:

package test; 

import java.io.File; 
import java.lang.reflect.Method; 
import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.jar.Attributes; 
import java.util.jar.JarFile; 

public class JarRunner { 

    public static void main(String[] args) throws Exception{ 
     File jar = new File(args[0]); 
     URLClassLoader classLoader = new URLClassLoader(
      new URL[]{jar.toURL()} 
     ); 

     JarFile jarFile = new JarFile(jar); 
     Attributes attribs = jarFile.getManifest().getMainAttributes(); 
     String mainClass = attribs.getValue("Main-Class"); 

     Class<?> clazz = classLoader.loadClass(mainClass); 
     Method main = clazz.getMethod("main", String[].class); 
     main.invoke(null, new Object[]{new String[]{"arg0", "arg1"}}); 
    } 
} 
+2

+1। लेकिन जावा के लिए नया हर कोई ध्यान रखना चाहिए कि लक्ष्य मुख्य मैथोड तर्क 'arg0' और 'arg1' के साथ आक्रमण किया जाता है। वास्तविक दुनिया के कार्यान्वयन को वास्तविक तर्कों के साथ इन स्ट्रिंग्स को प्रतिस्थापित करना है। –

+0

यदि "क्लास क्लास" आपके क्लासपाथ पर भी होता है तो एक मामूली फिक्स की आवश्यकता होती है: "URLClassLoader classLoader = new URLClassLoader (नया URL [] {jar.toURL(), null});"। यह वर्तमान श्रेणी लोडर को प्रतिनिधिमंडल को रोकता है, जो लोड करने में असफल होने के लिए जेएआर फ़ाइल में निर्भर वर्गों का कारण बन सकता है। – plinehan

संबंधित मुद्दे