彻底解决SWT运行出错(2)修改系统环境变量
很多刚搞SWT的朋友都会遇到这样一个问题:
写的SWT在eclipse中可以运行,但是用命令行去执行就会报错。
今天就和大家一起彻底解决这个问题。
比如我们先写一个这样的小程序:
?
import org.eclipse.swt.SWT;? import org.eclipse.swt.widgets.Display;? import org.eclipse.swt.widgets.Shell;? ? ? public class BasicSwt extends Shell {? ????? /**?????? * Launch the application????? * @param args????? */???? public static void main(String args[]) {???????? try {???????????? Display display = Display.getDefault();???????????? BasicSwt shell = new BasicSwt(display, SWT.SHELL_TRIM);???????????? shell.open();???????????? shell.layout();???????????? while (!shell.isDisposed()) {???????????????? if (!display.readAndDispatch())???????????????????? display.sleep();???????????? }???????? } catch (Exception e) {???????????? e.printStackTrace();???????? }???? }????? /**????? * Create the shell????? * @param display????? * @param style????? */???? public BasicSwt(Display display, int style) {???????? super(display, style);???????? createContents();???? }????? /**????? * Create contents of the window????? */???? protected void createContents() {???????? setText("SWT Application");???????? setSize(500, 375);???????? //???? }????? @Override???? protected void checkSubclass() {???????? // Disable the check that prevents subclassing of SWT components???? }??}在eclipse中运行,ok,可以看到一个空白窗体。
运行CMD,到项目目录,运行java BasicSwt,结果报错了:
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Shell
??????? at java.lang.ClassLoader.defineClass1(Native Method)
??????? at java.lang.ClassLoader.defineClass(Unknown Source)
??????? at java.security.SecureClassLoader.defineClass(Unknown Source)
??????? at java.net.URLClassLoader.defineClass(Unknown Source)
??????? at java.net.URLClassLoader.access$000(Unknown Source)
??????? at java.net.URLClassLoader$1.run(Unknown Source)
??????? at java.security.AccessController.doPrivileged(Native Method)
??????? at java.net.URLClassLoader.findClass(Unknown Source)
??????? at java.lang.ClassLoader.loadClass(Unknown Source)
??????? at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
??????? at java.lang.ClassLoader.loadClass(Unknown Source)
??????? at java.lang.ClassLoader.loadClassInternal(Unknown Source)
为什么?
因为我们缺少运行SWT需要的类库和相关DLL链接库
首先我们先下载一个文件:
到http://download.eclipse.org/eclipse/downloads/drops/R-3.2.2-200702121330/
下载swt-3.2.2-win32-win32-x86.zip
解压缩,主要到里面的两个文件:
swt.jar
swt-win32-3236.dll
本例中,我们先把这两个文件放到H:\
然后把我们执行:java -classpath h:\swt.jar BasicSwt
这时候可以看到出错信息变了Exception in thread "main" java.lang.NoClassDefFoundError: BasicSwt
ok,再改,执行:java -classpath h:\swt.jar; -Djava.library.path=h:\ BasicSwt
ok,正常啦
稍微解释下-Djava.library.path=h:\
这里指定的是swt-win32-3236.dll存放的路径
?
上面的介绍比较适合程序发布和给客户使用的时候,那么我们自己开发的时候老是这么用也不方便,
下面我们彻底解决这个问题:
把
?swt-awt-win32-3236.dll
?swt-gdip-win32-3236.dll
?swt-wgl-win32-3236.dll
?swt-win32-3236.dll
全部拷贝到\Windows\System32下面
修改系统环境变量:
classpath=.;d:\JAVA6\lib\tools.jar;d:\JAVA6\lib\dt.jar;d:\JAVA6\bin;h:\swt.jar;
解释一下:
“.”是指当前目录
“d:\JAVA6\lib\tools.jar;d:\JAVA6\lib\dt.jar;d:\JAVA6\bin;”是为了JAVA6配置的
“h:\swt.jar;”是咱们SWT.JAR的路径
关掉CMD,重新打开,不然CMD不会重新加载环境变量。
到项目目录,运行java BasicSwt
ok,正常运行了,不用那么长的命令行了
?