zoukankan      html  css  js  c++  java
  • 手编写启动JAVA程序的EXE文件

    有大多的Java人,在四处寻找能将jar打包成exe的工具,另我十分不解的是为什么要打包呢,其实目的无非是想用exe启动而已,其实打包真的没什么好处,一个5m的程序打包成exe还可以,如果一个100m的程序呢?如果这个100m的程序同时还要集成jre呢.打包后启动速度应该不用我多说,而且目前几乎所有打包程序都不是很完美,之所以这些打包程序还可以使用,是因为他们失效的情况,只在很特别的场景下才能遇到,这些工具我也用过一些,感觉不尽如人意.

         其实我们平时使用的90%的程序都不是一个exe就能搞定的,而是很多个文件,我们只是用一个exe文件启动程序而已,本这这个思想,我一直想写个java 的exe启动器,因为我还略懂点c++和delphi,当然只是皮毛了,好在完成这件事只用皮毛的知识应该足以.虽说做起来也遇到很多困难,不过最后还是完成了.

         因为C++版本的国外已经有人写过了http://download.csdn.net/source/528223

         所以这次我写了个Delphi版的

         在放代码前,先介绍下这个工具,暂时我给它起的名字也叫javalauncher

         使用方法:

         文件存放结构

    Test.jar

    javalauncher.ini

    javalauncher.exe

    jre

    test.jar是要启动的java程序,这个有点像废话

    jre是jre,还是废话,不过这个jre可以选择精简版的,我选择的这个精简版只有15M

    如果test.jar依赖了其他的jar包,可以放置在\jre\lib\ext里面或者

    修改test.jar中的META-INF\MANIFEST.MF文件

    添加如下行

    Class-Path: swt.jar

    稍后我提供的demo是将swt.jar放置在了jre\lib\ext中.因为我的demo是用swt写的,因为用swt写的话可以把jre中swing相关的类都删掉.节省不少空间呢.

    让我们看看javalauncher.ini配置文件是如何编写的吧
    [blog.csdn.net/sunyujia]
    command=./jre/bin/javaw.exe
    options= -jar Test.jar

    command是指明javaw所在位置,可以用相对路径,如果是使用系统中已经安装的jre直接写javaw.exe即可

    options是javaw的参数

    非常遗憾的是,我发现我们日常平时使用的命令java 包.类,这种写法并不支持,也就是说想用这个工具启动必须使用-jar

    我目前尚未找到原因,初步分析,通过delphi的ShellExecute给javaw.exe传递参数时,javaw.exe只能识别-开头的参数

    好在javaw的所有参数都是-开头的,只有上面说的那种情况不是.

    我已经将工具和例子上传到 http://download.csdn.net/source/743727

    这个例子只有10m可在没有安装jre的机器上执行,例子是基于swt的写的.

    启动这个例子的方法只要运行javalauncher.exe即可.想要给这个exe换图标的话,大家可以使用ResHacker这个工具

    大家以后可以通过例子中的javalauncher.exe来启动java程序了,多么美好的事情,^_^

    告诉大家个秘密,这个exe的文件名是可以更改的,比如改成abc.exe,相映的修改javalauncher.ini为abc.ini即可

    我相信此文的更多读者希望看到的是java源码,对delphi一定是不感冒了,所以我还是先放这次用于测试的java例子的源码吧.

    package com.syj;

    import org.eclipse.swt.SWT; 
    import org.eclipse.swt.events.SelectionAdapter; 
    import org.eclipse.swt.events.SelectionEvent; 
    import org.eclipse.swt.layout.FillLayout; 
    import org.eclipse.swt.widgets.Button; 
    import org.eclipse.swt.widgets.Display; 
    import org.eclipse.swt.widgets.Shell;

    public class HelloSWT { 
        public static void main(String[] args) { 

           Display display = new Display();
           Shell shell = new Shell(display);
           shell.setSize(450, 100);
           shell.setText("所用JRE是:" + System.getProperty("java.home"));
           shell.setLayout(new FillLayout());
           final Button button = new Button(shell, SWT.FLAT);
           button.setText("blog.csdn.net/".concat("sunyujia"));
           button.addSelectionListener(new SelectionAdapter() {
               public void widgetSelected(SelectionEvent arg0) {
                   try {
                       Runtime.getRuntime().exec(
                               "rundll32 url.dll,FileProtocolHandler http://"
                                       + button.getText());
                   } catch (Exception e) {
                       e.printStackTrace();
                   }
               }
           });
           shell.open();
           while (!shell.isDisposed())
               if (!display.readAndDispatch())
                   display.sleep();
           display.dispose();
        }
    }
    下面是delphi源码

    unit Unit5;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, shellapi ,inifiles;
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;
      JvmConfig:TInifile;
      command,options,ConfigFileName: String;
    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      application.ShowMainForm:=false;//隐藏窗体
     ConfigFileName:=ExtractFileName(Application.ExeName);//获取当前程序文件名
     ConfigFileName:=Copy(ConfigFileName,1,Length(ConfigFileName)-Length(ExtractFileExt(ConfigFileName)));//获取去掉扩展名
     ConfigFileName:=GetCurrentDir+'\'+ConfigFileName+'.ini';//拼凑成与同当前exe文件同名的ini文件
      //showmessage(ConfigFileName);//use debug
      JvmConfig:=TIniFile.Create(ConfigFileName); //读取ini文件
     command:=JvmConfig.ReadString('blog.csdn.net/sunyujia','command','');
     options:=JvmConfig.ReadString('blog.csdn.net/sunyujia','options','');
      //showmessage(command); //use debug command
      //showmessage(options); //use debug options
      JvmConfig.Free;
      ShellExecute(Application.Handle, 'open', pchar(command), pchar(options),pchar(GetCurrentDir) , 1);
      application.Terminate;
    end;

    end.

  • 相关阅读:
    DES 算法的 C++ 与 JAVA 互相加解密
    ORACLE SQL 小记
    ACE 的头文件包含
    WTL 程序中显示 HTML
    GIS 中地理坐标和屏幕坐标的标准转换方法
    算盘中国古代伟大的计算器
    DELPHI 开发的 OCX 控件在 MFC 程序中编辑框快捷键不好使的解决
    服务端程序线程运行信息管理器
    ATL::CImage 的透明通道的处理与格式转换
    kinect sdk开发入门WPFdemo笔记
  • 原文地址:https://www.cnblogs.com/jijm123/p/15597633.html
Copyright © 2011-2022 走看看