??xml version="1.0" encoding="utf-8" standalone="yes"?>
我这里用的是1.1.0.1Qƈ且页面上有推荐?/span>Eclipse3.1.1Q?/span>EMF,GEF。都下蝲了!
2.按照Eclipse安装插g的方法,安装SWT,EMF,GEF?/span>
3.如果不出意外Q就可以正常使用了!
q里有一个徏议:最好用纯?/span>EclipseQ我开始用WTP版的Q怎么配置也不行?/span>
可以建立Visual ClassQ但是不能可视化d控gQ或者看不到控g的属性,或?/span>Text,TextArea控g无法d。后来按照以上方法,重新来了一ơ,OK?/span>!
二打包发?/span>SWTE序
1.因ؓ需?/span>SWT?/span>jar.但是Eclipse3.1.1配合的的SWT不是通过SWT.jar发布的!?/span>org.eclipse.swt.win32.win32.x86_3.1.0.jar。里面包括了JINI?/span>DLL?/span>SWTcL件?/span>
需要下?/span>
http://www.eclipse.org/downloads/download.php?file=/eclipse/dow ... 09290840/swt-3.1.1-win32-win32-x86.zip
q里?/span>SWT.jarQ和3?/span>DLL,把他们解压羃出来Q备用!
2.通过Eclipse的导出功能,生成一个可执行?/span>jarQ?/span>MANIFEST.MF文g选择?/span>Eclipse生成Qƈ且保存到目中?/span>
3.上面2的步骤,只是Z得到MANIFEST.MF文g。下面修改一下这个文件?/span>
加上 Class-Path: SWT.jar
如果q有其他?/span>jar,用空格分开Q加到后?/span>
4.再生成一?/span>jar,MANIFEST.MF选择修改后的?/span>
5.打包的jar,SWT.jar,3?/span>DLL攑ֈ一个文件夹下,双击可执行的jarQ程序运行!
?/span>jar?/span>EXE
1.打开JSmooth0.9.9-7?/span>http://www610.fixdown.com/jsmooth-0.9.9-7-setup.exe
2.选择skeleton,?/span>skeleton properties中先?/span>Launch java app in the exe process,Debug console选中。可以查看生?/span>EXE文g执行q程信息?/span>
3.选择Executable.
选择生成?/span>EXE文g存放位置?/span>
选择EXE文g图标
讄当前路径Q选择要{换的jar文g所在文件夹
4.选择Application
讄Main Class,可执?/span>jar中的Main Class注意写类全名
讄Application Argument,如果需要传入参敎ͼ写到q里
讄Embedded jar: 可执行的jar
讄ClasspathQ?/span>SWT.jar 如果有其他的l箋d
5.选择JVM Selection。默认吧?/span>
6.JVM Configuration:
可以讄java properties,内存使用
7.炚w轮。生成!看是否有错误?/span>
8.EXE执行需要的文gQ?/span>EXE,3?/span>DLLQ?/span>SWT.jar
把他们考到其他目录Q一样可以执行!
9.Lskeleton properties中的Launch java app in the exe process,Debug console选项?/span>
重新生成。应?/span>OK了!
-----
看了q个Q终于完成了SWTE序打包Q太爽了
<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE project>
<project name="JavaMailClient" default="usage" basedir=".">
<property name="project-name" value="JavaMailClient"/>
<property name="build" value="build"/>
<property name="lib" value="lib"/>
<property name="src" value="src"/>
<property name="build.classes" value="${build}/classes" />
<property file="build.properties"/>
<property name="jar.dir" value="jar"/>
<property name="jar-file-name" value="${project-name}" />
<path id="Third-Part Lib">
<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
</path>
<target name="usage" description="Build file usage info (default task)">
<echo message=" " />
<echo message="${project-name} " />
<echo message="-------------------------------------------------------" />
<echo message="Available Targets:" />
<echo message=" ***" />
<echo message=" Compiling:" />
<echo message=" compile - Compiles the source code" />
<echo message=" ***" />
<echo message=" Cleaning up:" />
<echo message=" clean - Delete class files" />
<echo message=" ***" />
<echo message=" JAR:" />
<echo message=" jar - Generate an .jar for source code" />
<echo message=" ***" />
<echo message=" Executing:" />
<echo message=" run - Execute the JavaMail client ! Get email of the latest two days from server" />
<echo message=" ***" />
<echo message="-------------------------------------------------------" />
</target>
<target name="prepare" >
<mkdir dir="${build.classes}" />
<mkdir dir="${jar.dir}" />
</target>
<target name="clean" >
<delete dir="${build}" />
<delete dir="${jar.dir}" />
</target>
<target name="compile" depends="clean,prepare">
<echo message="Compiling the source code!"/>
<javac
srcdir="${src}"
destdir="${build.classes}"
deprecation="true"
failonerror="true" debug="true"
>
<classpath refid="Third-Part Lib"/>
</javac>
</target>
<!-- <target name="run" description="Receive email! " depends="compile"> -->
<!-- 已经可以正确q行Q注意:classpath="${build.classes}" 一定要加上Q否则会?java.lang.NoClassDefFoundError"的错误!-->
<!--
<target name="run" description="Receive email! ">
<java classname="POP3MailReceiver" classpath="${build.classes}" fork="true" maxmemory="256m">
<classpath refid="Third-Part Lib"/>
</java>
</target>
-->
<target name="run" description="Receive email! ">
<java jar="${jar.dir}/${jar-file-name}.jar" fork="true" maxmemory="256m"/>
</target>
<target name="jar" depends="compile">
<jar destfile="${jar.dir}/${jar-file-name}.jar" basedir="${build.classes}">
<manifest>
<!-- 此处需要根据需要进行修?-->
<attribute name="Main-Class" value="POP3MailReceiver"/>
<attribute name="Class-Path" value="../${lib}/commons-email-1.0.jar ../${lib}/mail.jar ../${lib}/activation.jar"/>
</manifest>
</jar>
</target>
</project>
附:Jar包的正确q行ҎQ{Q?/font>
-jar参数q行应用时classpath的设|方?nbsp;
你是否在使用java -jar参数q行打包好的jar应用E序的时候发现应用程序无法找到classpath下设|好的第三方cd的内容?无论怎么讄classpath参数都无于事,L会报ClassNotFound的错误?那么本篇帖子可以帮助你摆q?:)
当用java -jar yourJarExe.jar来运行一个经q打包的应用E序的时候,你会发现如何讄-classpath参数应用E序都找不到相应的第三方c,报ClassNotFound错误。实际上q是׃当?jar参数q行的时候,java VM会屏蔽所有的外部classpath,而只以本wyourJarExe.jar的内部class作ؓcȝL范围?/font>
解决Ҏ
一 BootStrap class扩展Ҏ
Java 命o行提供了如何扩展bootStrap U别class的简单方法:
-Xbootclasspath: 完全取代基本核心的Java class 搜烦路径.
不常?否则要重新写所有Java 核心class
-Xbootclasspath/a: 后缀在核心class搜烦路径后面.常用!!
-Xbootclasspath/p: 前缀在核心class搜烦路径前面.不常?避免
引v不必要的冲突.
语法如下:
(分隔W与classpath参数cMQunix使用:?windows使用;Pq里以unixZ)
java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar
?extend class 扩展Ҏ
Java exten class 存放在{Java_home}\jre\lib\ext目录?当调用Java?Ҏ展class路径的搜索是自动?M搜烦?q样,解决的方案就很简单了,所有要使用的第三方的jar包都复制到ext 目录?
Q自评:不推荐用,自适应性很差!Q?/font>
?User class扩展Ҏ
当?jar执行可执行Jar包时,JVMJar包所在目录设|ؓcodebase目录,所有的class搜烦都在q个目录下开?所以如果用了其他W三方的jar?一个比较可以接受的可配|方?是利用jar包的Manifest扩展机制.
步骤如下:
1.需要的W三方的jar?复制在同可执行jar所在的目录或某个子目录? 比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包复制到/usrhome目录下或/usrhome/lib {类似的子目录下.
2.修改Manifest 文g
在Manifest.mf文g里加入如下行
Class-Path:classes12.jar lib/thirdlib.jar
Class-Path 是可执行jar包运行依赖的关键?详细内容可以参考:http://java.sun.com/docs/books/tutorial/ext/index.html
以上三种Ҏ推荐W一U,扩展性好Q操作v来也最方便.
另外~写自己的ClassLoader,来动态蝲入class,是更加复杂和高技?限于幅,不赘q?有兴了解可以去google一下custom classloader
Java的安全机刉不同的JDK版本有不同的变化,会媄响很多核心CLASS,比如Thread,所以很多大型商业Y?要求JDK的版本很严格.部分原因也在?q也要求在发布自q写的应用时?不管大小,都要说明开发和试的JDK版本.
本文所q方法测试基于j2sdk 1.4.2_04-b05
----------------------------------------------------------------------------------------------
?背景知识
自JDK 1.2以后,JVM采用了委?delegate)模式来蝲入classQ采用这U设计的原因可以参?a >http://java.sun.com/docs/books/tutorial/ext/basics/load.html
归纳来讲:是基于JVM sandbox(沙盒)安装模型上提供应用层的可定制的安全机?
Java虚拟?JVM)LClass的顺?/p>
1. Bootstrap classes
属于Java q_核心的class,比如java.lang.String{?及rt.jar{重要的核心U别的class.q是由JVM Bootstrap class loader来蝲入的.一般是攄在{java_home}\jre\lib目录?/p>
2. Extension classes
ZJava扩展机制,用来扩展Java核心功能模块.比如Java串口通讯模块comm.jar.一般放|在{Java_home}\jre\lib\ext目录?/p>
3. User classes
开发h员或其他W三方开发的JavaE序?通过命o行的-classpath?cp,或者通过讄CLASSPATH环境变量来引?JVM通过攄在{java_home}\lib\tools.jar来寻扑֒调用用户U的class.常用的javac也是通过调用tools.jar来寻扄h定的路径来编译Java源程?q样引ZUser class路径搜烦的顺序或优先U别的问?
3.1 ~省?调用Java或javawa的当前\?.),是开发的class所存在的当前目?br />
3.2 CLASSPATH环境变量讄的\?如果讄了CLASSPATH,则CLASSPATH的g覆盖~省?br />
3.3 执行Java的命令行-classpath?cp的?如果制定了这两个命o行参C一,它的g覆盖环境变量CLASSPATH的?br />
3.4 -jar 选项:如果通过java -jar 来运行一个可执行的jar?q当前jar包会覆盖上面所有的?换句话说,-jar 后面所跟的jar包的优先U别最?如果指定?jar选项,所有环境变量和命o行制定的搜烦路径都将被忽?JVM APPClassloader只会以jar包ؓ搜烦范围.
有关可执行jar有许多相关的安全斚w的描q?可以参?a >http://java.sun.com/docs/books/tutorial/jar/ 来全面了?
q也是ؓ什么应用程序打包成可执行的jar包后,不管你怎么讄classpath都不能引用到W三方jar包的东西?