当前位置:  技术问答>用JCreator写了一个小程序,有十几个class,当修改某个文件重新编译,javac并没有编译修改的文件,请问要如何做javac才会重新编译所有的 iis7站长之家

请问如何在UNIX下将 .java 或 .class文件编译成为可直接执行的 可执行文件

    来源: 互联网  发布时间:2015-10-03

    本文导语:  编译 .java 文件,生成 的.class 文件 必须用java XXX.class 运行。 请问能不能 直接编译成可执行的文件 | 下面是我搜集的,在论坛里的。 很简单的,在任何.bat中加入: path=d:jdk1.3bin. java -jar...

编译 .java 文件,生成 的.class 文件
必须用java XXX.class 运行。 请问能不能 直接编译成可执行的文件

|
下面是我搜集的,在论坛里的。
很简单的,在任何.bat中加入:
path=d:jdk1.3bin.
java -jar your.jar
存盘就行了,我的系统是win2000,我就是这么做的



这个是Borland不公开的使用技巧,能够通过JBuilder来制作exe文件来启动Java文件。 

JBuilder并不支持本地编译机制。但是有一个隐藏的技巧可以让你从可执行文件来启动Java 

程序,可以出现或者不出现console窗口。想做到这些,需要JBuilder的bin目录下的这些文 

件: 

JBuilder.exe 

JBuilderW.exe (可选) 

JBuilder.config 

jdk.config 

JavaLauncher.dll 

“JBuilder.exe”是一个通用的可执行外壳文件,用以启动Java程序,”JBuilderW.exe“ 

好像是javaw.exe一样,它把”JBuilder.exe”包装起来,但是运行时候不显示那个conso 

le的窗口。使用这些文件的关键是文件名。“JBuilder.exe”查找一个文件叫”JBuilder.c 

onfig”的配置文件,里面包含了运行Java程序的必须信息。同样的”JBuilderW.exe”查找 

”JBuilder.exe”来启动不带Console窗口的Java程序。如果把JBuilder.exe重命名为”foo 

.exe”,那”foo.exe”将去寻找”foo.config”配置文件,同样”JBuilderW.exe”被重命 

名为”fooW.exe”,它会去寻找”foo.exe”文件。 

说到这里,聪明的读者应该猜到怎样利用JBuilder.exe来启动应用程序了。只要把JBui 

lder.exe,JBuilerW.exe,JBuilder.config改名成相应的文件名,在JBuilder.config里面指 

定主类和类路径,就能够通过执行JBuilder.exe(或者被改名后的exe文件)来启动Java应用程 

序了。下面是用本机为例。 

Borland JBuilder 5被安装在E:jbuilder5目录下,在E:jbuilder5bin下建立一个temp 

目录,然后把JBuilder.exe,JBuilder.config,JavaLauncher.dll,jdk.config四个文件 

拷贝到E:jbuilder5bintemp目录下,然后在这个目录下建立一个hello目录,在这个目录 

下生成一个hello.java文件,即E:jbuilder5bintemphellohello.java文件, 

//hello.java 

package hello; 

public class hello{ 

    public static void main(String s[]){ 

        System.out.println("Hello, Exe file!"); 

    } 



编译成class文件,如图18-14: 

图18-14 编译所有java文件 

然后打开Jbuilder.config文件,作相应的修改: 

在JBuilder.config里面找到下面两行 

# Start JBuilder using the its main class 

mainclass com.borland.jbuilder.JBuilder 

修改为 

# Start JBuilder using the its main class 

mainclass hello.hello 

addpath E:/jbuilder5/bin/temp/ 

addpath命令是把目录加入类路径中,这个命令和其它config里面可以识别的命令可以在 

JBu 

ilder/bin目录下的config_readme.txt里面找到详细说明。 

然后将jdk.config里面的javapath修改成相对的路径,例如原来是 

javapath ../jdk1.3/bin/java 

修改成 

javapath ../../jdk1.3/bin/java 

最后 

将JBuilder.exe,JBuilder.config修改成所需要的文件名,例如foo.exe和foo.config文件。 

现在执行foo.exe文件 

可以看到执行的结果如图18-15: 

图18-15 执行foo.exe后的运行结果 

至此,通过修改JBuilder来使用exe文件启动自己的Java应用程序已经完成了。 

但是好玩的地方并不在这个地方,下面的小技巧可能更有趣,将Jar文件打包进入exe文件! 

假设利用上面的文件,生成hello.jar包,执行过程和运行结果如图18-16: 

jar cvf hello.jar hello*.class 

图18-16 将类文件打包成exe文件 

然后将jar包附加到JBuilder.exe后面去,执行过程如图18-17: 

copy /b ..JBuilder.exe+hello.jar foo.exe 

图18-17 将jar文件转化成exe文件 

在foo.config(JBuilder.config)文件里面把前面加入的类路径去掉,并加入下面的路径: 

addpath E:/jbuilder5/bin/temp/foo.exe 

然后执行,执行结果如图18-18: 

foo.exe 

图18-18 变成exe文件的jar文件执行结果 

看到了么?一个含jar包的exe文件被执行了! 

这个过程的大致原理是:exe文件的重要信息都在文件头部,所以把乱七八糟的东西放exe文 

件尾部是不要紧的;而jar/zip文件的重要信息是在文件尾部的,这样它们两不相干,能够容 

易的被执行。 

请注意:读者如果使用这个功能,得自己承担可能带来的风险,因为Borland对这个功能不 

提供官方的支持!


另外可以下载一个叫做Excelsior JET的软件,用jdk1.4配合它的2.5版,可以将.class文件或java的工程转化为.exe文件.有需要的可以找我要,我的qq是
8844755,我的e-mail是:chch771203@163.com.

|
真的是有个插件可以帮助你将class文件打包成为一个可以执行的jar包的。

看看这个是否有帮助:
英文原版:http://www.javaworld.com/javaworld/javatips/jw-javatip120.html? 
这是一篇描述怎样制作自解压jar文件的文章,作者通过自己编写的一个自解压程序,并把这个自解压程序以及一个manifest文件一起加入原始的jar文件中,就制作出一个可以在各种支持java的平台上运行的可以自解压的jar 文件。 

自解压文件 
我们先来了解一下自解压文件,在window下可以用自解压制作工具如winzip self-Extractor来制作自解压文件,这些工具会把一个zip文件与解压程序打包在一起而产生一个新的可执行文件。然后只要运行这个可执行文件,就可以把zip文件中的内容解开。那为什么要创建自解压jar文件呢,创建成自解压zip文件不就好了?但我们应该注意到自解压jar文件可以在任意支持java的平台上解开并执行,例如,可以在linux下执行。创建jar自解压文件很简单,只需要一个特殊的JAR manifest文件、一个基于java的解压程序(这个程序是原作者写的)、包含基本文件的jar 或者zip文件以及任何jsdk的jar应用程序 

manifest文件 
要生成可执行jar文件,需要在META-INF 目录下的manifest文件,文件名为:MANIFEST.MF ,但在我们这里我们只需要在文件中指定在这个基于java 的解压程序中包含main()的类的名称:Main-Class: ZipSelfExtractor 

我们已经把一个叫做jarmanifest的文件加入到这个技巧的源程序包中。 

解压程序 
你可以用各种方法来实现这个解压程序,在我们这里使用了一个简单直接的办法。首先,解压程序判断这个自解压jar文件的名称,有了这个文件名,解压程序使用解压标准,把文件解开。具体的可以查看在源码包中的ZipSelfExtractor.java文件。 

值得一提的是这里用了一个很巧妙的办法获取jar文件的文件名,虽然在命令行中出现的这个文件的名字,但它并没有作为参数传入类的main()中,因此,这里使用了以下的代码来获取文件名: 

private String getJarFileName () 

myClassName = this.getClass().getName() + ".class"; 
URL urlJar = 
this.getClass().getClassLoader().getSystemResource(myClassName); 
String urlStr = urlJar.toString(); 
int from = "jar:file:".length(); 
int to = urlStr.indexOf("!/"); 
return urlStr.substring(from, to); 


请注意:getSystemResource() 中使用了myClassName而不是ZipSelfExtractor.class作参数,这使得我们可以更改加压程序的名字而不需要修改代码。 

接下来,我们来分析获得这个jar文件的名字。首先,可以获取指向包含正在运行类的文件,urlStr = urlJar.toString();有了这个url,把jar文件名去掉,剩下的就是我们想要的,下面是这个url的格式: 
jar:file:/home/test/zipper.jar!/ZipSelfExtractor.class 

有了文件名,就可以开始解压,详细的解压算法请大家自己看源码。 

为了可以更方便实用,程序使用了图形界面,程序中使用了JFileChooser类可以选择要解压的目标目录。 

最后程序还确保不把这两个文件:manifest文件和extractor's .class(在我们这里是ZipSelfExtractor.class)文件也解出来,程序是用来解开原始的jar的内容,而这两个文件并属于jar原始内容。 

打包jar文件 
有了manifest文件与解压程序,我们就可以创建自解压jar文件了,以下是一个例子: 
1.创建一个zip文件Myzip.zip 
2.下载zipper.jar 
3.把文件解到当前目录,准备制作自解压jar文件 
java -jar zipper.jar 
4.把zipper.class拷贝成 ZipSelfExtractor.class 
5.把 myzip.zip 重命名为 myzip.jar 
6.把myzip.jar中的内容替换为jarmanifest和ZipSelfExtractor.class这两个文件 
jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 
7.执行java -jar myzip.jar就可以看到效果了,试试看 

后记 
一个自解压的jar文件能够很好的跨平台使用,自解压jar文件创建简单,只需要有jre1.2或或者更新的版本就可以实现了。 


附自解压程序的源代码: 

/* ZipSelfExtractor.java */ 
/* Author: Z.S. Jin 
Updates: John D. Mitchell */ 

import java.io.*; 
import java.net.*; 
import javax.swing.*; 
import java.util.zip.*; 
import java.util.*; 
import java.text.*; 

public class ZipSelfExtractor extends JFrame 

private String myClassName; 
static String MANIFEST = "META-INF/MANIFEST.MF"; 

public static void main(String[] args) 

ZipSelfExtractor zse = new ZipSelfExtractor(); 
String jarFileName = zse.getJarFileName(); 
zse.extract(jarFileName); 
System.exit(0); 


ZipSelfExtractor() 



private String getJarFileName() 

myClassName = this.getClass().getName() + ".class"; 
URL urlJar = this.getClass().getClassLoader().getSystemResource(myClassName); 
String urlStr = urlJar.toString(); 
int from = "jar:file:".length(); 
int to = urlStr.indexOf("!/"); 
return urlStr.substring(from, to); 


public void extract(String zipfile) 

File currentArchive = new File(zipfile); 

JFileChooser fc = new JFileChooser(); 

fc.setCurrentDirectory(new File(".")); 
fc.setDialogType(JFileChooser.OPEN_DIALOG); 
fc.setDialogTitle("Select destination directory for extracting " + 
currentArchive.getName()); 
fc.setMultiSelectionEnabled(false); 

fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 

if (fc.showDialog(ZipSelfExtractor.this, "Select") 
!= JFileChooser.APPROVE_OPTION) 

return; //only when user select valid dir, it can return approve_option 


File outputDir = fc.getSelectedFile(); 

byte[] buf = new byte[1024]; 
SimpleDateFormat formatter = new SimpleDateFormat ("MM/dd/yyyy hh:mma",Locale.getDefault()); 

ProgressMonitor pm = null; 

boolean overwrite = false; 

ZipFile zf = null; 
FileOutputStream out = null; 
InputStream in = null; 

try 

zf = new ZipFile(currentArchive); 

int size = zf.size(); 
int extracted = 0; 
pm = new ProgressMonitor(getParent(), "Extracting files...", "starting", 0, size-4); 
pm.setMillisToDecideToPopup(0); 
pm.setMillisToPopup(0); 

Enumeration entries = zf.entries(); 

for (int i=0; i { 
ZipEntry entry = (ZipEntry) entries.nextElement(); 
if(entry.isDirectory()) 
continue; 

String pathname = entry.getName(); 
if(myClassName.equals(pathname) || MANIFEST.equals(pathname.toUpperCase())) 
continue; 

extracted ++; 
pm.setProgress(i); 
pm.setNote(pathname); 
if(pm.isCanceled()) 
return; 

in = zf.getInputStream(entry); 

File outFile = new File(outputDir, pathname); 
Date archiveTime = new Date(entry.getTime()); 

if(overwrite==false) 

if(outFile.exists()) 

Object[] options = {"Yes", "Yes To All", "No"}; 
Date existTime = new Date(outFile.lastModified()); 
Long archiveLen = new Long(entry.getSize()); 

String msg = "File name conflict: " 
+ "There is already a file with " 
+ "that name on the disk! " 
+ " File name: " + outFile.getName() 
+ " Existing file: " 
+ formatter.format(existTime) + ", " 
+ outFile.length() + "Bytes" 
+ " File in archive:" 
+ formatter.format(archiveTime) + ", " 
+ archiveLen + "Bytes" 
+" Would you like to overwrite the file?"; 

int result = JOptionPane.showOptionDialog(ZipSelfExtractor.this, 
msg, "Warning", JOptionPane.DEFAULT_OPTION, 
JOptionPane.WARNING_MESSAGE, null, options,options[0]); 

if(result == 2) // No 

continue; 

else if( result == 1) //YesToAll 

overwrite = true; 




File parent = new File(outFile.getParent()); 
if (parent != null && !parent.exists()) 

parent.mkdirs(); 


out = new FileOutputStream(outFile); 

while (true) 

int nRead = in.read(buf, 0, buf.length); 
if (nRead  1) ? "s": "") + 
" from the " + 
zipfile + " archive into the " + 
outputDir.getPath() + 
" directory.", 
"Zip Self Extractor", 
JOptionPane.INFORMATION_MESSAGE); 


catch (Exception e) 

System.out.println(e); 
if(zf!=null) { try { zf.close(); } catch(IOException ioe) {;} } 
if(out!=null) { try {out.close();} catch(IOException ioe) {;} } 
if(in!=null) { try { in.close(); } catch(IOException ioe) {;} } 



  

|
根据java的机制,应该不可以吧

class是字解码,必须用java虚拟机来执行的

如果想直接运行,你自己可以定义一个sh

|
自己再写个sh不就可以了吗

    
 
 

您可能感兴趣的文章:

  • 请问JSP中的<jsp:forward page=""/>执行后,后边的操作还会执行吗?
  • 请问LINUX7.2下,哪条命令是查看系统上曾经执行过的执行命令?(包括启动以前的)
  • 请问shell中执行一个命令后,如何不回显其执行结果。
  • 请问: 想让一个执行文件 不写相对路径,在任何路径下,都能执行,该怎么做啊?
  • 我写了一个脚本,手动执行可以,定时执行不行,请问怎么回事?内详
  • 请问:我发现如果在/usr/local/bin 与/usr/bin下都有同一个执行文件时,当在shell下执行时,只会执行/usr/local/bin,下的,怎么改过来?
  • 请问JAVA如何执行(调用)操作系统命令,如dir,然后把执行结果存入变量或文件,谢谢!
  • 我在windows下把1.c编译成1.exe可以执行,请问我把1.exe拷贝到unix系统能否执行?怎样移植?
  • 求助:请问怎么获得在个一个脚本中执行的另外个脚本的返回结果,如执行成功或失败
  • 书上说进程堆栈段可执行,请问这个可执行是什么意思?
  • 请问如何在Java中执行SQL的块语句?
  • 请问exec系列函数在执行时是立即返回还是有可能阻塞那?
  • 请问大侠:都说JSP比ASP执行速度快, 但这和JAVA本身速度慢(靠虚拟机执行) 有何关系???
  • 请问,Shell中如何执行另外一个Shell脚本?
  • 请问在JSP中如何中断程序的执行,类似asp的response.end
  • 请问怎样做一个定期执行的程序?
  • 我想自己写一个可执行文件加载器, 请问需要哪些预备知识?
  • 请问:如何将REDHAT的一个INI文件里面的某些内容注释不让它执行???
  • 请问:在HP-UX下如何替换正在使用的可执行文件?
  • 请问如何清除命令行记录(不让人知道我曾经执行过什么操作)
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 菜问题:请问如何根据文件中的一段内容查找文件路径和文件名称,在线等候
  • 请问有将class文件转换为可执行文件(如Windows下的exe文件)的工具吗?
  • 请问,有什么办法可以把html文件生成pdf/excel格式的文件
  • 请问Qt的工程文件,如何转成VC的工程文件??
  • 请问:proc中的头文件中能包含头文件吗?(感觉如果头文件中包含头文件的话,在链接时就会有错误啊)
  • 请问哪里能找到Curses 的头文件和库文件?
  • 请问用GCC 编译,如何生成MAP文件?就是内存的分布映像文件?
  • 我装了一个cygwin,却说找不到cybiconv-2.dll这个文件。请问这个文件在哪?
  • 如何删除前面有个-的文件,我的根目录下有个文件叫 -C,请问如何删除?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • JB下,我的程序编译得好慢!请问用什么方法编译才可以快一点?或编译顺序改变一下?
  • 请问哪里有反编译.class文件的反编译器?
  • 用JCreator写了一个小程序,有十几个class,当修改某个文件重新编译,javac并没有编译修改的文件,请问要如何做javac才会重新编译所有的
  • 请问:我要链接哪些oci库才能成功编译.我在编译的时候老是报OCI函数找不到.
  • jbuilder运行时会编译整个工程的文件,请问大家如何改成只编译当前文件。
  • 请问在linux下编译程序怎么设置编译器字节对齐?
  • 请问gdb是不是只能调试gcc编译的程序,在unix下用其它编译器编译的程序是不是不一定能用gdb调试的?
  • 下载As86的一个压缩包,解开后没有rpm看样子的自己编译,请问如何编译。
  • 请问:在proc程序中,若里面有模板的类型,能不能通过预编译啊,(编译时老是无法识别类型,我的头文件都已包含了)
  • 请问哪个JAVA反编译软件可以反编译加密过的CLASS???
  • ??请问在windows下怎样配置sh的configure文件 许多开放源码项目在编译前都要配置configure才能编译. 可...
  • 请问用javac编译一般*.java能通过,但不能编译Servlet写的*.java.提示javax.servlet.http不存在。
  • 菜鸟问题: redhat linux 编译一个最简单的c程序, 其中包含了<studio.h>头文件,但在gcc编译时,提示找不到studio.h文件,请问各位大大
  • 请问一个关于gcc编译的问题
  • 请问Linux下,有图形界面的编译器吗?
  • 请问编译器是干什么用的
  • 请问如何编译EJB的源文件?
  • 请问怎么重新编译后里面的文件还存在呢?
  • 请问学编译原理的用途?
  • 请问高手:sun下如何编译informix的C++,也就是嵌套sql的c++,急呀
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问在Redhat 9里,我从登录就是图形介面,请问如何在图形介面内进入命令行方式呢,谢谢
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!
  • 主机是WIN2000,我用的是LUNIX,请问是否可以共享上网? 如果可以请问如何设置? 500分答谢,龟儿食言!
  • 请问linux下GUI开发的问题!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3