我的swing项目用的NetBeans开发
一.打jar包
NetBeans可生成jar包
http://happyqing.iteye.com/blog/2064370
Eclipse也可以导出jar包
我是采用ant生成jar包
优点:可以自定义,去掉有些不需要的类,自定义生成的META-INF\MANIFEST.MF文件,指定Class-Path
buildProject.xml
<?xml version="1.0" encoding="UTF-8" ?> <!-- 1. 使用ant的javac命令来编译Java程序 2. 使用jar命令打包java项目 3. 使用war命令打包JavaEE项目 --> <project name="docProject" default="copy" basedir="../"> <!--属性--> <property name="build" value="${basedir}/ant" /> <property name="classes" value="${basedir}/bin/" /> <property name="lib" value="${basedir}/lib" /> <property name="jar" value="${build}/jar" /> <property name="exe4j" value="${basedir}/exe4j" /> <!--编译用的classpath--> <path id="classpath"> <fileset dir="${lib}"> <include name="*.jar"/> </fileset> </path> <!-- 清理 --> <target name="clean"> <echo message ="java_home:${java.home}"/> <delete includeemptydirs="true"> <fileset dir="${classes}"> <include name="**/*" /> </fileset> </delete> <delete file="${jar}/docProject.jar" /> </target> <!-- 编译 --> <target name="compile" depends="clean"> <!-- warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds --> <!-- 设置 includeantruntime="on" 或者 includeantruntime="false" Ant是否把它自己的 runtime包含进对 javac任务可见的classpath中 --> <javac encoding="utf-8" srcdir="${basedir}/src" destdir="${classes}" includeantruntime="false" bootclasspath="${java.home}/lib/rt.jar;${java.home}/lib/jce.jar" excludes="/com/urt/sample/*.*,/com/urt/license/*.*"> <classpath refid="classpath"/> <compilerarg value="-g:lines,vars,source" /> <!-- <compilerarg value="-Xlint:deprecation" /> <compilerarg value="-Xlint:unchecked" /> --> </javac> <copy todir="${classes}" includeEmptyDirs="true" overwrite="true"> <fileset dir="${basedir}/src"> <include name="*.properties"/> <include name="/**/*.properties"/> <include name="/images/*.*"/> </fileset> </copy> </target> <!-- 打成jar包 --> <target name="jar" depends="compile"> <pathconvert property="mf.classpath" pathsep=" "> <!--<path refid="classpath" />--> <path> <fileset dir="${lib}"> <include name="*.jar"/> </fileset> </path> <mapper> <chainedmapper> <!-- 移除绝对路径 --> <flattenmapper /> <!-- 加上lib前缀 --> <globmapper from="*" to="lib/*" /> </chainedmapper> </mapper> </pathconvert> <jar destfile="${jar}/docProject.jar" basedir="${basedir}/bin"> <!-- define MANIFEST.MF --> <manifest> <attribute name="Main-Class" value="com.urt.module.MainFrame"/> <attribute name="Class-Path" value="${mf.classpath} "/><!--这个可已没有--> </manifest> </jar> </target> <!-- 事后清理 --> <target name="afterClean" depends="jar"> <delete includeemptydirs="true"> <fileset dir="${classes}"> <include name="**/*" /> </fileset> </delete> </target> <target name="copy" depends="afterClean"> <copy todir="${exe4j}" includeEmptyDirs="true" overwrite="true"> <fileset dir="${jar}"> <include name="docProject.jar"/> </fileset> <fileset dir="${basedir}/src"> <include name="env.properties"/> </fileset> <fileset dir="${basedir}/build/classes"> <include name="license.dat"/> </fileset> </copy> </target> </project>
MANIFEST.MF
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.9.2 Created-By: 1.7.0_55-b13 (Oracle Corporation) Main-Class: com.urt.module.MainFrame Class-Path: lib/commons-lang-2.3.jar lib/commons-logging-1.1.jar lib/d om4j-1.6.1.jar lib/pdfbox-app-1.8.4.jar lib/poi-3.9-20121203.jar lib/ poi-examples-3.9-20121203.jar lib/poi-excelant-3.9-20121203.jar lib/p oi-ooxml-3.9-20121203.jar lib/poi-ooxml-schemas-3.9-20121203.jar lib/ poi-scratchpad-3.9-20121203.jar lib/stax-api-1.0.1.jar lib/xmlbeans-2 .3.0.jar
指定Class-Path为了打好的jar包能找到lib
二.jar包打成exe
1.可以用bat to exe(bat2exe)工具,把一个.bat批处理文件打包成exe文件,
我下载的工具文件名是:jfsky.com-ha_Bat_To_Exe_Converter.rar 中文版的
docProject.bat
jre7x64\bin\java -jar docProject.jar
可视性:隐藏应用程序,就不显示cmd窗口了。
可设置图标文件
优点:简单,
2.用exe4j打包
一键搞定Java桌面应用安装部署 —— exe4j + Inno Setup 带着JRE, 8M起飞
http://www.blogjava.net/huliqing/archive/2008/04/18/193907.html
这篇博客说的比较清楚了
exe4j有32位版,和64位版,要想打包64位应用程序,请下载64为安装包
我下载的是:exe4j_windows-x64_4_5_2.zip
欢迎页右下角是注册信息,自行解决。
第4步里边第4小步可配置输出日志 error.log output.log 程序的日志会转发的这上
第4步里边第4小步可配置打包64位应用程序
第5步设置Class Path
似乎设置lib目录不管用,我把lib下的jar包一个一个全加上就好了。
可以指定图标
优点:可配置输出日志 error.log output.log,
因为我的程序没配置log
exe4j.exe4j
<?xml version="1.0" encoding="UTF-8"?> <exe4j version="4.5.2" transformSequenceNumber="1"> <directoryPresets config="D:/zhao/Documents/NetBeansProjects/docProject/exe4j/lib" /> <application name="docProject" distributionSourceDir="D:/zhao/Documents/NetBeansProjects/docProject/exe4j"> <languages> <principalLanguage id="en" customLocalizationFile="" /> </languages> </application> <executable name="docProject" type="1" iconSet="true" iconFile="D:/zhao/Documents/NetBeansProjects/docProject/src/images/docProject.ico" executableDir="." redirectStderr="true" stderrFile="error.log" stderrMode="overwrite" redirectStdout="true" stdoutFile="output.log" stdoutMode="overwrite" failOnStderrOutput="true" executableMode="1" changeWorkingDirectory="true" workingDirectory="." singleInstance="false" serviceStartType="2" serviceDependencies="" serviceDescription="" jreLocation="" executionLevel="asInvoker" checkConsoleParameter="false" globalSingleInstance="false" amd64="true"> <messageSet /> <versionInfo include="true" fileVersion="" fileDescription="" legalCopyright="我的公司 2014" internalName="测试项目" productName="" companyName="我的公司" productVersion="1.0" /> </executable> <splashScreen show="false" autoOff="true" alwaysOnTop="true" width="0" height="0" bitmapFile="" java6SplashScreen="false"> <text> <statusLine x="20" y="20" text="" font="Arial" fontSize="8" fontColor="0,0,0" fontWeight="500" /> <versionLine x="20" y="40" text="version %VERSION%" font="Arial" fontSize="8" fontColor="0,0,0" fontWeight="500" /> </text> </splashScreen> <java mainClass="com.urt.module.MainFrame" vmParameters="-Xms128m -Xmx2048m -XX:MaxPermSize=256m" arguments="" allowVMPassthroughParameters="true" preferredVM="" bundleRuntime="true" minVersion="1.7" maxVersion="" allowBetaVM="false" jdkOnly="false"> <searchSequence> <directory location="./jre7x64" /> </searchSequence> <classPath> <archive location="./docProject.jar" failOnError="false" /> <archive location="./lib/commons-lang-2.3.jar" failOnError="false" /> <archive location="./lib/commons-logging-1.1.jar" failOnError="false" /> <archive location="./lib/dom4j-1.6.1.jar" failOnError="false" /> <archive location="./lib/pdfbox-app-1.8.4.jar" failOnError="false" /> <archive location="./lib/poi-3.9-20121203.jar" failOnError="false" /> <archive location="./lib/poi-examples-3.9-20121203.jar" failOnError="false" /> <archive location="./lib/poi-excelant-3.9-20121203.jar" failOnError="false" /> <archive location="./lib/poi-ooxml-3.9-20121203.jar" failOnError="false" /> <archive location="./lib/poi-ooxml-schemas-3.9-20121203.jar" failOnError="false" /> <archive location="./lib/poi-scratchpad-3.9-20121203.jar" failOnError="false" /> <archive location="./lib/stax-api-1.0.1.jar" failOnError="false" /> <archive location="./lib/swing-layout-1.0.4.jar" failOnError="false" /> <archive location="./lib/xmlbeans-2.3.0.jar" failOnError="false" /> </classPath> <nativeLibraryDirectories /> </java> <includedFiles /> <unextractableFiles /> </exe4j>
三.打安装包
用inno setup打安装包,这个比较简单,可以用向导配置
有中文版的,innosetup554H.zip
把jdk,lib目录,exe,jar,配置文件,一起打包。
jar要是找不到lib下的jar,可以配置jar包下的META-INF\MANIFEST.MF文件,指定Class-Path
或者把lib包下的jar包拷贝到jdk\lib\ext下,感觉这样不太好
向导说明:
第3个页面 应用程序文件夹
应用程序文件夹名称 安装后的主目录名称
第4个页面 应用程序文件
在添加文件夹后记得编辑一下,目标子文件夹,要不会少一级目录
第8个页面 编辑设置
自定义编译器输出文件夹 生成的安装包的存放位置,
不设置的话会保存在我的文档下的Output下,若先保存向导生成的文件,再编译,会生成在同iss文件同级目录的Output下
其他说明:
Inno Setup本身是32位的,似乎没有64位的,
他可以安装64位的程序
默认总是安装到C:\Program Files (x86) 32位目录下,
[Setup]
ArchitecturesInstallIn64BitMode=x64 ia64
加一句这个就好了,默认安装到C:\Program Files下了
这个是从样例里看的,
建议多看看样例 C:\Program Files (x86)\Inno Setup 5\Examples
我的样例:
; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "测试项目" #define MyAppVersion "1.0" #define MyAppPublisher "公司名称" #define MyAppURL "http://www.***.com/" #define MyAppExeName "docProject.exe" [Setup] ; 注: AppId的值为单独标识该应用程序。 ; 不要为其他安装程序使用相同的AppId值。 ; (生成新的GUID,点击 工具|在IDE中生成GUID。) AppId={{331BF6AF-1281-4074-BCC3-2852DDD39A4D} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\docProject DefaultGroupName={#MyAppName} OutputBaseFilename=docProjectSetup SetupIconFile=D:\zhao\Documents\NetBeansProjects\docProject\src\images\docProject.ico Compression=lzma SolidCompression=yes ArchitecturesInstallIn64BitMode=x64 ia64 [Languages] Name: "chinesesimp"; MessagesFile: "compiler:Default.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 [Files] Source: "D:\zhao\Documents\NetBeansProjects\docProject\exe4j\docProject.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "D:\zhao\Documents\NetBeansProjects\docProject\exe4j\docProject.jar"; DestDir: "{app}"; Flags: ignoreversion Source: "D:\zhao\Documents\NetBeansProjects\docProject\exe4j\env.properties"; DestDir: "{app}"; Flags: ignoreversion Source: "D:\zhao\Documents\NetBeansProjects\docProject\exe4j\jre7x64\*"; DestDir: "{app}\jre7x64"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "D:\zhao\Documents\NetBeansProjects\docProject\exe4j\lib\*"; DestDir: "{app}\lib"; Flags: ignoreversion recursesubdirs createallsubdirs ; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion” [Icons] Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
用wix打包成msi,没用到