久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Eclipse啟動過程(源碼級剖析)

 LibraryPKU 2013-12-12
雙擊eclipse安裝目錄下的eclipse.exe運行后,會加載同一目錄下的eclipse.ini文件(對應RCP項目也是一樣,在RCP的安裝目錄下會有一個RCPName.ini文件):
Java代碼  收藏代碼
  1. -startup  
  2. plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar  
  3.   
  4. --launcher.library  
  5. plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502  
  6. -product  
  7. org.eclipse.epp.package.rcp.product  
  8. --launcher.defaultAction  
  9. openFile  
  10. -showsplash  
  11. org.eclipse.platform  
  12. --launcher.XXMaxPermSize  
  13. 256M  
  14. -vmargs  
  15. -Dosgi.requiredJavaVersion=1.5  
  16. -Xms40m  
  17. -Xmx512m  

這里要說一下,,Eclipse的JVM啟動的時候找JRE的順序是:
如果eclipse.ini中配置了-vm參數(shù),,那么則使用這個參數(shù)指定的JRE(jvm.dll庫路徑);
否則,,查看eclipse安裝目錄下是否有JRE文件夾,,如果有的話就使用這個JRE;
否則,,去系統(tǒng)注冊表中查找安裝的JRE,,如果還找不到就報錯。

所以如果不想卸載掉其他的JDK的話,,可以有兩種方式:
直接把要使用的JRE文件夾拷貝到Eclipse目錄下
修改eclipse.ini文件,添加-vm參數(shù),,指定要運行的虛擬機的地址,,形如:
-vm
C:\Program Files\Java\jdk1.6.0_12\bin\..\jre\bin\client\jvm.dll

(在eclipse.ini文件中添加配置項時,有空格就換行,,不然會當成無效參數(shù))

eclipse.ini文件中:
-startup 指定啟動的入口為:安裝目錄下plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar
會加載該jar包中的org.eclipse.equinox.launcher.Main.class類并調(diào)用其main(String)完成app的啟動過程

通過一個Exception.printStackTrace()方法來看一下Eclipse的大概啟動過程:



圖中是打印的狀態(tài)棧,,從下往上就是整個Eclipse(或者說RCP程序)的加載和啟動過程,一直到App的啟動,。
下面來通過源代碼,,具體說明:
從org.eclipse.equinox.launcher.Main這個類開始:

在Main這個類的main()方法中下一個斷的,調(diào)試狀態(tài)啟動Eclipse中的RCP程序就可以跟蹤這個RCP啟動的過程(Eclipse的過程也是類似的,,其實EclipseIDE就是一個巨型的RCP):
Java代碼  收藏代碼
  1. public static void main(String[] args) {  
  2.        int result = 0;  
  3.        ...  
  4.        result = new Main().run(args);  
  5.        ...  
  6. }  

然后看一下run()方法:
Java代碼  收藏代碼
  1. public int run(String[] args) {  
  2.        ...  
  3.        basicRun(args);  
  4.        ...  
  5. }  
主要實現(xiàn)就在basicRun()方法中:

Java代碼  收藏代碼
  1. protected void basicRun(String[] args) throws Exception {  
  2.         //記錄啟動啟動時間  
  3.         System.getProperties().put("eclipse.startTime", Long.toString(System.currentTimeMillis())); //$NON-NLS-1$  
  4.         commands = args;  
  5.         //處理Command參數(shù),,并根據(jù)Command參數(shù)設置默認屬性  
  6.         String[] passThruArgs = processCommandLine(args);  
  7.   
  8.         if (!debug)  
  9.             // debug can be specified as system property as well  
  10.             debug = System.getProperty(PROP_DEBUG) != null;  
  11.         setupVMProperties();//將VM參數(shù)寫入到System.Properties中  
  12.         processConfiguration();//加載配置信息  
  13.   
  14.         getInstallLocation();//獲取安裝路徑,這里調(diào)用一下是為了確保InstallLocation被初始化  
  15.   
  16.         // locate boot plugin (may return -dev mode variations)  
  17.         URL[] bootPath = getBootPath(bootLocation);//獲取啟動路徑列表  
  18.   
  19.         setupJNI(bootPath);//啟動JNIBridge,加載dll類庫  
  20.   
  21.         //檢查JDK版本  
  22.         if (!checkVersion(System.getProperty("java.version"),   
  23.                 System.getProperty(PROP_REQUIRED_JAVA_VERSION)))   
  24.             return;  
  25.   
  26.         //檢查配置信息  
  27.         if (!checkConfigurationLocation(configurationLocation))  
  28.             return;  
  29.   
  30.         setSecurityPolicy(bootPath);//設置安全策略  
  31.           
  32.         handleSplash(bootPath);//啟動閃屏,,就是Eclipse(或RCP啟動時IDE打開前帶有進度條的界面)  
  33.           
  34.         beforeFwkInvocation();  
  35.           
  36.         invokeFramework(passThruArgs, bootPath);//加載框架(前面的工作都是輔助,,這個才是加載框架的核心)  
  37.     }  


下面針對其中的幾個重要方法進行說明:

processConfiguration:處理配置信息
Java代碼  收藏代碼
  1. private void processConfiguration() {  
  2.     URL baseConfigurationLocation = null;  
  3.     Properties baseConfiguration = null;  
  4.     //在系統(tǒng)的配置文件中,鍵值對形如:  
  5.     //osgi.configuration.area=file:/E:/eclipse-rcp-indigo-SR2-win32/eclipse/configuration/  
  6.     if (System.getProperty(PROP_CONFIG_AREA) == null) {  
  7.         String baseLocation = System.getProperty(PROP_BASE_CONFIG_AREA);  
  8.         if (baseLocation != null)  
  9.             baseConfigurationLocation = buildURL(baseLocation, true);  
  10.         if (baseConfigurationLocation == null)  
  11.             try {  
  12.                 //在并沒指定參數(shù)的情況下,,將會把Location指定到: 安裝目錄/configuration  
  13.                 baseConfigurationLocation = new URL(getInstallLocation(), CONFIG_DIR);  
  14.             } catch (MalformedURLException e) {  
  15.                 // leave baseConfigurationLocation null  
  16.             }  
  17.           
  18.         //加載目錄下的config.ini文件,對其文件中的鍵值對 配置信息  
  19.         baseConfiguration = loadConfiguration(baseConfigurationLocation);  
  20.         ... ...  
  21.     }  
  22.   
  23.     Properties configuration = baseConfiguration;  
  24.     if (configuration == null || !getConfigurationLocation().equals(baseConfigurationLocation))  
  25.         configuration = loadConfiguration(getConfigurationLocation());  
  26.     //把配置信息合并到System.getProperties()中  
  27.     mergeProperties(System.getProperties(), configuration, null);  
  28.     ... ...  
  29.       

config.ini文件內(nèi)容(舉例)
Java代碼  收藏代碼
  1. #This configuration file was written by: org.eclipse.equinox.internal.frameworkadmin.equinox.EquinoxFwConfigFileParser  
  2. #Sun Feb 17 13:24:53 CST 2013  
  3. org.eclipse.update.reconcile=false  
  4. eclipse.p2.profile=epp.package.rcp  
  5. osgi.instance.area.default=@user.home/workspace  
  6. osgi.framework=file\:plugins/org.eclipse.osgi_3.7.2.v20120110-1415.jar  
  7. equinox.use.ds=true  
  8. eclipse.buildId=M20120208-0800  
  9. osgi.bundles=reference\:file\:org.eclipse.equinox.simpleconfigurator_1.0.200.v20110815-1438.jar@1\:start  
  10. org.eclipse.equinox.simpleconfigurator.configUrl=file\:org.eclipse.equinox.simpleconfigurator/bundles.info  
  11. eclipse.product=org.eclipse.platform.ide  
  12. osgi.splashPath=platform\:/base/plugins/org.eclipse.platform  
  13. osgi.framework.extensions=  
  14. osgi.bundles.defaultStartLevel=4  
  15. eclipse.application=org.eclipse.ui.ide.workbench  
  16. eclipse.p2.data.area=@config.dir/../p2/  

getInstallLocation() 獲取當前安裝路徑
Java代碼  收藏代碼
  1. private URL getInstallLocation() {  
  2.     if (installLocation != null)  
  3.         return installLocation;  
  4.   
  5.     //從系統(tǒng)配置信息中獲取安裝路徑,,有的話就直接返回  
  6.     String installArea = System.getProperty(PROP_INSTALL_AREA);  
  7.     if (installArea != null) {  
  8.         installLocation = buildURL(installArea, true);  
  9.         System.getProperties().put(PROP_INSTALL_AREA, installLocation.toExternalForm());  
  10.         return installLocation;  
  11.     }  
  12.      //如果沒有,則通過獲取main類包的路徑換算出安裝路徑  
  13.     ProtectionDomain domain = Main.class.getProtectionDomain();  
  14.     CodeSource source = null;  
  15.     URL result = null;  
  16.     source = domain.getCodeSource();  
  17.     result = source.getLocation();  
  18.   
  19.     String path = decode(result.getFile());  
  20.     ... ...  
  21.       
  22.     installLocation = new URL(result.getProtocol(), result.getHost(), result.getPort(), path);  
  23.       
  24.     return installLocation;  
  25. }  

getBootPath() 獲取啟動路徑列表
Java代碼  收藏代碼
  1. protected URL[] getBootPath(String base) throws IOException {  
  2.         URL url = null;  
  3.         if (base != null) {  
  4.             url = buildURL(base, true);  
  5.         } else {  
  6.             // search in the root location  
  7.             url = getInstallLocation();  
  8.             String path = new File(url.getFile(), "plugins").toString();   
  9.             path = searchFor(framework, path);  
  10.             if (url.getProtocol().equals("file"))   
  11.                 url = new File(path).toURL();  
  12.             else  
  13.                 url = new URL(url.getProtocol(), url.getHost(), url.getPort(), path);  
  14.         }  
  15.         //鍵值對,,形如:osgi.framework=file:/e:/eclipse/plugins/org.eclipse.osgi_3.7.2.v20120110-1415.jar  
  16.         //指定osgi jar的路徑  
  17.         if (System.getProperty(PROP_FRAMEWORK) == null)  
  18.             System.getProperties().put(PROP_FRAMEWORK, url.toExternalForm());  
  19.           
  20.         //獲取啟動路徑列表  
  21.         URL[] result = getDevPath(url);  
  22.           
  23.         return result;  
  24.     }  

setupJNI()啟動JNIBridge,,加載dll類庫
Java代碼  收藏代碼
  1. private void setupJNI(URL[] defaultPath) {  
  2.         String libPath = null;  
  3.   
  4.         /** 
  5.          * 獲取--launcher.library的路徑, 形如: 
  6.          * --launcher.library 
  7.          *    plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.100.v20110502 
  8.          */  
  9.         if (library != null) {  
  10.             File lib = new File(library);  
  11.             if (lib.isDirectory()) {  
  12.                 libPath = searchFor("eclipse", lib.getAbsolutePath()); //$NON-NLS-1$  
  13.             } else if (lib.exists()) {  
  14.                 libPath = lib.getAbsolutePath();  
  15.             }  
  16.         }  
  17.         if (libPath == null) {  
  18.             /** 
  19.              * 根據(jù)OS、WS,、Arch等信息,,加載相應的本地文件(如,dll或so),。 
  20.              */  
  21.             //find our fragment name  
  22.             String fragmentOS = getOS();  
  23.             String fragmentWS = getWS();  
  24.             String fragmentArch = getArch();  
  25.   
  26.             libPath = getLibraryPath(getFragmentString(fragmentOS, fragmentWS, fragmentArch), defaultPath);  
  27.             if (libPath == null && ws == null) {  
  28.                 // no ws was specified and we didn't find the default fragment, try an alternate ws  
  29.                 String alternateWS = getAlternateWS(fragmentWS);  
  30.                 libPath = getLibraryPath(getFragmentString(fragmentOS, alternateWS, fragmentArch), defaultPath);  
  31.                 if (libPath != null) {  
  32.                     System.getProperties().put(PROP_WS, alternateWS);  
  33.                 }  
  34.             }  
  35.         }  
  36.         library = libPath;  
  37.         if (library != null)  
  38.             bridge = new JNIBridge(library);//并創(chuàng)建JNIBridge,,這個還有待研究  
  39.     }  

invokeFramework()啟動Equinox框架
Java代碼  收藏代碼
  1. private void invokeFramework(String[] passThruArgs, URL[] bootPath) throws  Exception {  
  2.         //如果沒有指定ClassLoader,默認將boot設置為OSGi框架的ClassLoader的父類  
  3.         String type = System.getProperty(PROP_FRAMEWORK_PARENT_CLASSLOADER,   
  4.                            System.getProperty(PROP_PARENT_CLASSLOADER, PARENT_CLASSLOADER_BOOT));  
  5.         ClassLoader parent = null;  
  6.         if (PARENT_CLASSLOADER_APP.equalsIgnoreCase(type))  
  7.             parent = ClassLoader.getSystemClassLoader();  
  8.         else if (PARENT_CLASSLOADER_EXT.equalsIgnoreCase(type)) {  
  9.             ClassLoader appCL = ClassLoader.getSystemClassLoader();  
  10.             if (appCL != null)  
  11.                 parent = appCL.getParent();  
  12.         } else if (PARENT_CLASSLOADER_CURRENT.equalsIgnoreCase(type))  
  13.             parent = this.getClass().getClassLoader();  
  14.           
  15.         //生成一個Equinox框架的StartupClassLoader,,(關于ClassLoader分層機制,,還有待研究)  
  16.         URLClassLoader loader = new StartupClassLoader(bootPath, parent);  
  17.         //通過該ClassLoader加載org.eclipse.core.runtime.adaptor.EclipseStarter類,,并調(diào)用其run方法  
  18.         Class clazz = loader.loadClass(STARTER);  
  19.         Method method = clazz.getDeclaredMethod("run"new Class[] {String[].class, Runnable.class});   
  20.         try {  
  21.             //將命令行參數(shù)及閃屏線程對象傳遞給run方法  
  22.             method.invoke(clazz, new Object[] {passThruArgs, splashHandler});  
  23.         } catch (InvocationTargetException e) {  
  24.         }  
  25.     }  


接下來看一下EclipseStarter.run()
Java代碼  收藏代碼
  1. public static Object run(String[] args, Runnable endSplashHandler) throws Exception {  
  2.         if (Profile.PROFILE && Profile.STARTUP)  
  3.             Profile.logEnter("EclipseStarter.run()"null); //$NON-NLS-1$  
  4.          ... ...  
  5.         try {  
  6.             startup(args, endSplashHandler);  
  7.             ... ...  
  8.             Object obj=run(null);  
  9.             return obj;  
  10.         } catch (Throwable e) {  
  11.             ... ...  
  12.         } finally {... ...}  
  13.           
  14.         return null;  
  15.     }  


Java代碼  收藏代碼
  1. public static BundleContext startup(String[] args, Runnable endSplashHandler) throws Exception {  
  2.     ... ...  
  3.     FrameworkProperties.initializeProperties();  
  4.     processCommandLine(args);  
  5.     LocationManager.initializeLocations();  
  6.     loadConfigurationInfo();  
  7.     finalizeProperties();  
  8.     if (Profile.PROFILE)  
  9.         Profile.initProps(); // catch any Profile properties set in eclipse.properties...  
  10.               
  11.     adaptor = createAdaptor();//建立適配器  
  12.     framework = new Framework(adaptor);//創(chuàng)建Equinox框架  
  13.       
  14.     context = framework.getBundle(0).getBundleContext();  
  15.     registerFrameworkShutdownHandlers();  
  16.     publishSplashScreen(endSplashHandler);//  
  17.       
  18.     consoleMgr = ConsoleManager.startConsole(framework);//控制臺啟動,會有信息輸出  
  19.       
  20.     framework.launch();//啟動框架  
  21.       
  22.     Bundle[] startBundles = loadBasicBundles();//loading basic bundles  
  23.     ... ...  
  24.     // set the framework start level to the ultimate value.  This will actually start things  
  25.     // running if they are persistently active.  
  26.     setStartLevel(getStartLevel());//StartLevel set  
  27.       
  28.     // they should all be active by this time  
  29.     ensureBundlesActive(startBundles);  
  30.   
  31.     return context;  
  32. }  


先到這里,,有空繼續(xù)分析
Java代碼  收藏代碼
  1. /** 
  2.      * Runs the application for which the platform was started. The platform  
  3.      * must be running.  
  4.      * <p> 
  5.      * The given argument is passed to the application being run.  If it is <code>null</code> 
  6.      * then the command line arguments used in starting the platform, and not consumed 
  7.      * by the platform code, are passed to the application as a <code>String[]</code>. 
  8.      * </p> 
  9.      * @param argument the argument passed to the application. May be <code>null</code> 
  10.      * @return the result of running the application 
  11.      * @throws Exception if anything goes wrong 
  12.      */  
  13.     public static Object run(Object argument) throws Exception {  
  14.         if (Profile.PROFILE && Profile.STARTUP)  
  15.             Profile.logEnter("EclipseStarter.run(Object)()"null); //$NON-NLS-1$  
  16.         if (!running)  
  17.             throw new IllegalStateException(EclipseAdaptorMsg.ECLIPSE_STARTUP_NOT_RUNNING);  
  18.         // if we are just initializing, do not run the application just return.  
  19.         if (initialize)  
  20.             return new Integer(0);  
  21.         try {  
  22.             if (appLauncher == null) {  
  23.                 boolean launchDefault = Boolean.valueOf(FrameworkProperties.getProperty(PROP_APPLICATION_LAUNCHDEFAULT, "true")).booleanValue(); //$NON-NLS-1$  
  24.                 // create the ApplicationLauncher and register it as a service  
  25.                 appLauncher = new EclipseAppLauncher(context, Boolean.valueOf(FrameworkProperties.getProperty(PROP_ALLOW_APPRELAUNCH)).booleanValue(), launchDefault, log);  
  26.                 appLauncherRegistration = context.registerService(ApplicationLauncher.class.getName(), appLauncher, null);  
  27.                 // must start the launcher AFTER service restration because this method   
  28.                 // blocks and runs the application on the current thread.  This method   
  29.                 // will return only after the application has stopped.  
  30.                 return appLauncher.start(argument);  
  31.             }  
  32.             return appLauncher.reStart(argument);  
  33.         } catch (Exception e) {  
  34.             if (log != null && context != null// context can be null if OSGi failed to launch (bug 151413)  
  35.                 logUnresolvedBundles(context.getBundles());  
  36.             throw e;  
  37.         }  
  38.     }  

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多