我的swing项目用的NetBeans开发
项目目录
exe4j目录
innosetup目录
一.打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,没用到