重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
把 java项目 打包成 exe 可执行文件! 打包跨平台的.exe文件。安装后运行左窗窗口标有十步。
创新互联业务包括:成品网站、企业产品展示型网站建设、品牌网站建设、电子商务型网站建设、成都外贸网站建设公司(多语言)、商城网站建设、按需定制开发、全网整合营销推广等。效率优先,品质保证,用心服务是我们的核心价值观,我们将继续以良好的信誉为基础,秉承稳固与发展、求实与创新的精神,为客户提供更全面、更优质的互联网服务!
第1步 : 完全略过,直接点Next
第2步 : 选择“JAR in EXE mode” 就是选择已经有制作好的jar文件。
第3步 : 上面是项目名称,可随便填写,下面一个写出想要将打包后的exe文件输出的目录的是“桌面\project\”。
第4步 : 由于演示程序是图形的,所以选第一个,如果程序是控制台的,则选择第二个,Executable name写将要生成的.exe文件的名字,Icon File可以选择生成文件的图标。
第5步 : 先别管上面的,先在下面单击绿色的“+”号,在弹出的窗口中点Archive,然后找到起初已经做好的 CAMP_fat.jar(详见1.3)文件,"OK"后返回,在下面的Class Path里就出现jar文件路径后,再在上面Main Class栏内点击找到main所在的类。
第6步 : 系统的JRE版本,一般是填个1.3,下面填1.6在这里单击advanced options,选择search sequence。选这个就是因为要把JDK环境也打包进来,好让程序能跨平台使用。首先要从系统的JDK下的JRE目录copy到.exe文件的输出目录下“桌面\project\JRE”,然后回到exe4j中在弹出窗口删除列表中的所有项。是三项,一个注册表的,一个JAVA环境变量的,一个JDK环境变量的,都不要。然后单击绿“+”,选择directory并选择JRE的根目录,是“桌面\project\JRE”就是 copy后的目录,选完后exe4j弹出窗口中的Directory里会显示“.\JRE”。点OK关闭该窗口,返回exe4j的主窗口,就可以看到刚加的路径。再从主窗口左侧窗口中单击advanced options,并选择preferred VM,在弹出的窗口中选择client hostspot VM,单击next按钮继续。
第7、8步 : 是一些个性设置默认即可。
第9步 : 编译
第10步 : 点那个“Click Here to Start the Application”按钮就可以看到程序运行效果了,然后再点”Seave as”保存一个exe4j生成的一个文件,随便存哪里都行,和.exe程序无关。
若要生成一个名为 cal.jar 的可执行jar文件:(文件名可以是任意合法名字)
(这是我认为简单实用的一种方法,还有很多别的方法在此就不介绍了)
第一 把程序生成的所有字节码文件(即.class文件)放在同一个目录下(如:D:/chat/).
第二 在该目录下新建一个manifest.mf文件,文件内容格式如下(划线中内容):
manifest.mf文件中的格式:
Main-Class: (空格)calDemo (注意:冒号和类名之间一定要有一个空格)
注意: calDemo代表主类名(即要运行的类名,只能有一个,不要文件扩展名)
Main与Class中间不是下划线,而是短横线
Main-Class:与calDemo中间必须要有空格
Main-Class: calDemo之后必须要回车
然后用jar命令生成可执行的jar文件,例如:
(执行该命令前先要转到该目录下 D:/chat/ )
jar cvfm cal.jar manifest.mf *.class
jar用法:(仅供参考,初学者可跳过这部分内容)
jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
-c 创建新的存档
-t 列出存档内容的列表
-x 展开存档中的命名的(或所有的〕文件
-u 更新已存在的存档
-v 生成详细输出到标准输出上
-f 指定存档文件名
-m 包含来自标明文件的标明信息
-0 只存储方式;未用ZIP压缩格式
-M 不产生所有项的清单(manifest〕文件
-i 为指定的jar文件产生索引信息
-C 改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvfm classes.jar mymanifest -C foo/ .
jar 运行
java -jar *.jar
楼主是说解压了的文件大小只有33.1MB,但是却占了51.2MB的空间吗?
如果是这个意思的话,那我要告诉楼主,首先这个问题和JAVA没有关系,根据你的截图,可以断定你用的是FAT32文件系统。这只是文件存储的形式,很正常。
简单的说,磁盘存储数据的最小单位是簇,比方说你的簇大小为128K,一个簇只能存放一个文件,然后你的一个文件只有16K,它占了这个簇,然后还有112K没有用,是吧。但是那112K就不能再存放其它文件了。如果要存放其它文件,就要占另一个簇。
楼主,懂了吧,这跟簇的大小有关,但是也不是簇越小越好,簇越小,读写性能都有所下降。这是正常现象。如果你非觉得不舒服,那就用NTFS文件系统吧,把压缩打开,就不会有这种情况了,希望对你有帮助
通过jar命令
jar命令的用法:
下面是jar命令的帮助说明:
用法:jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项包括:
-c 创建新的归档文件
-t 列出归档目录
-x 解压缩已归档的指定(或所有)文件
-u 更新现有的归档文件
-v 在标准输出中生成详细输出
-f 指定归档文件名
-m 包含指定清单文件中的清单信息
-e 为捆绑到可执行 jar 文件的独立应用程序,指定应用程序入口点
-0 仅存储;不使用任何 ZIP 压缩
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含其中的文件
如果有任何目录文件,则对其进行递归处理。清单文件名、归档文件名和入口点名的指定顺序与 "m"、"f" 和 "e" 标志的指定顺序相同。
package com.io2.homework;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/*压缩文件夹*/
public class MyMultipleFileZip
{
private String currentZipFilePath = "F:/MyZip.zip";
private String sourceFilePath;
private ZipOutputStream zos;
private FileInputStream fis;
public MyMultipleFileZip(String sourceFilePath)
{
try
{
this.sourceFilePath = sourceFilePath;
zos = new ZipOutputStream(new FileOutputStream(currentZipFilePath));
//设定文件压缩级别
zos.setLevel(9);
} catch (FileNotFoundException e)
{
e.printStackTrace();
}
}
// 在当前条目中写入具体内容
public void writeToEntryZip(String filePath)
{
try
{
fis = new FileInputStream(filePath);
} catch (FileNotFoundException e1)
{
e1.printStackTrace();
}
byte[] buff = new byte[1024];
int len = 0;
try
{
while ((len = fis.read(buff)) != -1)
{
zos.write(buff, 0, len);
}
} catch (IOException e)
{
e.printStackTrace();
}finally
{
if (fis != null)
try
{
fis.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
// 添加文件条目
public void addFileEntryZip(String fileName)
{
try
{
zos.putNextEntry(new ZipEntry(fileName));
} catch (IOException e)
{
e.printStackTrace();
}
}
public void addDirectoryEntryZip(String directoryName)
{
try
{
zos.putNextEntry(new ZipEntry(directoryName + "/"));
} catch (IOException e)
{
e.printStackTrace();
}
}
// 遍历文件夹
public void listMyDirectory(String filePath)
{
File f = new File(filePath);
File[] files = f.listFiles();
if(files!=null)
{
for (File currentFile : files)
{
// 设置条目名称(此步骤非常关键)
String entryName= currentFile.getAbsolutePath().split(":")[1].substring(1);
// 获取文件物理路径
String absolutePath = currentFile.getAbsolutePath();
if (currentFile.isDirectory())
{
addDirectoryEntryZip(entryName);
//进行递归调用
listMyDirectory(absolutePath);
}
else
{
addFileEntryZip(entryName);
writeToEntryZip(absolutePath);
}
}
}
}
// 主要流程
public void mainWorkFlow()
{
listMyDirectory(this.sourceFilePath);
if(zos!=null)
try
{
zos.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
new MyMultipleFileZip("F:/fountainDirectory").mainWorkFlow();
}
}