欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于将java程序打包成exe

程序员文章站 2022-05-04 11:41:42
...

从java刚出来时,就研究这个问题了,由于java是跨平台的,如果打包成exe,就变成了只有windows下才能使用的程序,与java的本来意愿不符。所以我一直在寻找一种既能打包,又能不破坏兼容性的方法。
网上有许多java打包工具,都能把java的class文件弄成exe,但是如果想要兼容其他的平台,那就只有自己动手写代码了。在此,我选用了Delphi对java程序进行打包,因为只有Delphi才能够直接跨平台,它与java的配合是相当默契的。经过打包的程序能同时在windows和Red Hat linux下运行。

下面给出源代码:

首先制作一个资源文件,命名为Java.rc,内容如下:
App javafile App.class
然后保存,在控制台下用Brcc32 Java.rc命令行编译
编译完成后生成一个Java.res文件,在程序中引用这个文件就相当于导入了该class文件

program JavaApp;

uses
  Registry,Classes,
  {$IFDEF MSWINDOWS}Windows{$ENDIF}
  {$IFDEF LINUX}Qt,QTypes,QStyle{$ENDIF};

{$R java.RES}
{$R *.res}

var
  {$IFDEF MSWINDOWS}Reg:TRegistry;{$ENDIF}
  Java_HOME:string;
  Java:string;
  JavaStream:TResourceStream;
begin
  {$IFDEF MSWINDOWS}
  Reg:=TRegistry.Create;
  Reg.RootKey:=HKEY_LOCAL_MACHINE;
  Reg.OpenKey('SYSTEM\ControlSet001\Control\Session Manager\Environment',true);
  Java_HOME:=reg.ReadString('JAVA_HOME');
  Reg.Free;
  {$ELSE $IFDEF LINUX}
  Java_HOME:='Root/Bin/J2SDK';
  {$ENDIF}
  {$IFDEF MSWINDOWS}
  Java:=Java_HOME+'\Bin\Java.exe';
  {$ELSE $IFDEF LINUX}
  Java:=Java_HOME+'/Bin/Java.so';
  {$ENDIF}
  JavaStream:=TResourceStream.Create(HInstance,'App','javafile');
  JavaStream.SaveToFile('App.class');
  {$IFDEF MSWINDOWS}
  WinExec(PChar(Java+' App'),SW_Hide);
  {$ELSE $IFDEF LINUX}
  asm
    Call RH.Run(PChar(Java+' App'));
  end;
  {$ENDIF}
  JavaStream.Free;
end.

 

一切搞定,现在可以运行EXE了。如果要放到Linux下运行,只需要把EXE改成SO就行了