把 java項目 打包成 exe 可執(zhí)行文件! 打包跨平臺的.exe文件。安裝后運行左窗窗口標有十步。?
創(chuàng)新互聯(lián)業(yè)務包括:成品網(wǎng)站、企業(yè)產(chǎn)品展示型網(wǎng)站建設、品牌網(wǎng)站建設、電子商務型網(wǎng)站建設、成都外貿(mào)網(wǎng)站建設公司(多語言)、商城網(wǎng)站建設、按需定制開發(fā)、全網(wǎng)整合營銷推廣等。效率優(yōu)先,品質(zhì)保證,用心服務是我們的核心價值觀,我們將繼續(xù)以良好的信譽為基礎,秉承穩(wěn)固與發(fā)展、求實與創(chuàng)新的精神,為客戶提供更全面、更優(yōu)質(zhì)的互聯(lián)網(wǎng)服務!
第1步 : 完全略過,直接點Next
第2步 : 選擇“JAR in EXE mode” 就是選擇已經(jīng)有制作好的jar文件。
第3步 : 上面是項目名稱,可隨便填寫,下面一個寫出想要將打包后的exe文件輸出的目錄的是“桌面\project\”。
第4步 : 由于演示程序是圖形的,所以選第一個,如果程序是控制臺的,則選擇第二個,Executable name寫將要生成的.exe文件的名字,Icon File可以選擇生成文件的圖標。
第5步 : 先別管上面的,先在下面單擊綠色的“+”號,在彈出的窗口中點Archive,然后找到起初已經(jīng)做好的 CAMP_fat.jar(詳見1.3)文件,"OK"后返回,在下面的Class Path里就出現(xiàn)jar文件路徑后,再在上面Main Class欄內(nèi)點擊找到main所在的類。
第6步 : 系統(tǒng)的JRE版本,一般是填個1.3,下面填1.6在這里單擊advanced options,選擇search sequence。選這個就是因為要把JDK環(huán)境也打包進來,好讓程序能跨平臺使用。首先要從系統(tǒng)的JDK下的JRE目錄copy到.exe文件的輸出目錄下“桌面\project\JRE”,然后回到exe4j中在彈出窗口刪除列表中的所有項。是三項,一個注冊表的,一個JAVA環(huán)境變量的,一個JDK環(huán)境變量的,都不要。然后單擊綠“+”,選擇directory并選擇JRE的根目錄,是“桌面\project\JRE”就是 copy后的目錄,選完后exe4j彈出窗口中的Directory里會顯示“.\JRE”。點OK關閉該窗口,返回exe4j的主窗口,就可以看到剛加的路徑。再從主窗口左側(cè)窗口中單擊advanced options,并選擇preferred VM,在彈出的窗口中選擇client hostspot VM,單擊next按鈕繼續(xù)。
第7、8步 : 是一些個性設置默認即可。
第9步 : 編譯
第10步 : 點那個“Click Here to Start the Application”按鈕就可以看到程序運行效果了,然后再點”Seave as”保存一個exe4j生成的一個文件,隨便存哪里都行,和.exe程序無關。
若要生成一個名為 cal.jar 的可執(zhí)行jar文件:(文件名可以是任意合法名字)
(這是我認為簡單實用的一種方法,還有很多別的方法在此就不介紹了)
第一 把程序生成的所有字節(jié)碼文件(即.class文件)放在同一個目錄下(如:D:/chat/).
第二 在該目錄下新建一個manifest.mf文件,文件內(nèi)容格式如下(劃線中內(nèi)容):
manifest.mf文件中的格式:
Main-Class: (空格)calDemo (注意:冒號和類名之間一定要有一個空格)
注意: calDemo代表主類名(即要運行的類名,只能有一個,不要文件擴展名)
Main與Class中間不是下劃線,而是短橫線
Main-Class:與calDemo中間必須要有空格
Main-Class: calDemo之后必須要回車
然后用jar命令生成可執(zhí)行的jar文件,例如:
(執(zhí)行該命令前先要轉(zhuǎn)到該目錄下 D:/chat/ )
jar cvfm cal.jar manifest.mf *.class
jar用法:(僅供參考,初學者可跳過這部分內(nèi)容)
jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目錄] 文件名 ...
選項:
-c 創(chuàng)建新的存檔
-t 列出存檔內(nèi)容的列表
-x 展開存檔中的命名的(或所有的〕文件
-u 更新已存在的存檔
-v 生成詳細輸出到標準輸出上
-f 指定存檔文件名
-m 包含來自標明文件的標明信息
-0 只存儲方式;未用ZIP壓縮格式
-M 不產(chǎn)生所有項的清單(manifest〕文件
-i 為指定的jar文件產(chǎn)生索引信息
-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沒有關系,根據(jù)你的截圖,可以斷定你用的是FAT32文件系統(tǒng)。這只是文件存儲的形式,很正常。
簡單的說,磁盤存儲數(shù)據(jù)的最小單位是簇,比方說你的簇大小為128K,一個簇只能存放一個文件,然后你的一個文件只有16K,它占了這個簇,然后還有112K沒有用,是吧。但是那112K就不能再存放其它文件了。如果要存放其它文件,就要占另一個簇。
樓主,懂了吧,這跟簇的大小有關,但是也不是簇越小越好,簇越小,讀寫性能都有所下降。這是正?,F(xiàn)象。如果你非覺得不舒服,那就用NTFS文件系統(tǒng)吧,把壓縮打開,就不會有這種情況了,希望對你有幫助
通過jar命令
jar命令的用法:
下面是jar命令的幫助說明:
用法:jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
選項包括:
-c 創(chuàng)建新的歸檔文件
-t 列出歸檔目錄
-x 解壓縮已歸檔的指定(或所有)文件
-u 更新現(xiàn)有的歸檔文件
-v 在標準輸出中生成詳細輸出
-f 指定歸檔文件名
-m 包含指定清單文件中的清單信息
-e 為捆綁到可執(zhí)行 jar 文件的獨立應用程序,指定應用程序入口點
-0 僅存儲;不使用任何 ZIP 壓縮
-M 不創(chuàng)建條目的清單文件
-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();
}
}
// 在當前條目中寫入具體內(nèi)容
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);
//進行遞歸調(diào)用
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();
}
}