说明一下本人的开发环境:
Ubuntu6.10
JDK1.5.0_08-b03(用APT安装)
Eclipse3.2.0(带有VE1.2.0)
新建SWT程序过程:
新建项目->JAVA项目->填写JAVA项目名,点击“下一步”->定义Java构建路径中,在“库”选项卡,点击右边的“添加库”
->选择“SWT”,点击“下一步”->选择“IDEPlatform”,勾选“包含JFace库”,点击“完成”->点击“完成”。
以上创建了一个SWT程序,重要的一步是把SWT库添加到项目构件路径中,并且包含了JFace库的支持。当然,也可以在项目创建后通过修改项目的属性->Java构件路径->库 来修改。
编写SWT程序。对于其中的主类,点击主类的.java文件->右键>运行方式->SWT应用程序,可以正常运行,出现SWT窗口界面。
接着偿试进行项目的打包。Eclipse提供了用于打包的“导出”向导,项目可以导出为了个jar包,前提是需要一个清单文件MANIFEST.MF,还有就是解决好一些库的依赖关系。
创建一个MANIFEST.MF文件,内容大概如下:
Manifest-Version: 1.0
Class-Path: ./lib/org.eclipse.jface.jar \
./lib/org.eclipse.swt.gtk.linux.x86.jar \
./lib/org.eclipse.core.commands.jar \
./lib/org.eclipse.equinox.common.jar
Main-Class: edu.scut.link.test
可以看出都是一些字段和值的关系对,其中一些字段的解释如下:
Manifest-Version
用来定义manifest文件的版本,例如:Manifest-Version:1.0
Class-Path
应用程序或者类装载器使用该值来构建内部的类搜索路径。项目需要依赖的库可以在项目的构件路径的库中得知。如以上四个jar文件都来自于系统为SWT程序
应用程序(即为项目添加了SWT库并增加JFace支持后)默认添加的库。可以从Eclipse安装目录的plugin目录下找到这些jar包。如果不知
道项目依赖于哪些库,可以根据出错信息一个个的添加。
Main-Class
定义jar文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过 java -jar x.jar来运行该jar文件。
需要注意的是,这个文件的书写要求是很严格的,比如在“Class-Path:”后必须有一个空格,如果没有,打包将失败。
在项目图标上右键->导出->选择Java类别下的Jar文件,“下一步”->选中要导出的资源->勾选“导出生成的类文件和
资源”->填写导出目录->“下一步”->Jar打包选项接受默认->“下一步”->指定清文件为“从工作空间中选择现有
清单”,并浏览到刚刚创建的MANIFEST.MF文件。点击完成。如果清单文件编写无误,项目可导出为一个Jar包,如test.jar。
最后,新建一个文件夹存放打包的项目。如App。把test.jar放在APP文件夹内。在APP中新建一个子目录lib,从Eclipse安装目录的plugin子目录把上面Class-Path所提到的四个包拷到lib目录下。最后的目录结构应该如下:
+--App
+--lib
+-- org.eclipse.jface.jar
+-- org.eclipse.swt.gtk.linux.x86.jar
+-- org.eclipse.core.commands.jar
+-- org.eclipse.equinox.common.jar
+--test.jar
如些,在终端命令行下,进入App目录,打入命令java-jartest.jar。应该可以弹出窗口了吧?结果得到出错信息:
Exception in thread"main" java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3232 injava.library.path
郁闷中...回到Eclipse,捣弄一阵,发现将程序主Java文件的运行方式选择“Java应用程序”,抛出同样的异常。无比的郁闷中……
Google之,好久,终于在官方网站上发现到这个好东西(http://)。
Q: Why do I get the error"java.lang.UnsatisfiedLinkError: no swt-win32-3232 injava.library.path."?
A:
You need to placethe SWT JNI libraries that allow Java to use the
native widgets ina place where the Java Virtual Machine will findthem.
The SWT JNI libraries are included in the SWTdownload.
A Java application can be informed of thelocation of the libraries in several ways:
1. Set the library path in the VM launcharguments.
In
the Launch Configuration Dialog of eclipse select the Argumentspage,
and in the VM arguments field
enter:-Djava.library.path={runtime-library-path} Where
theruntime-library-path is the absolute path to the directorycontaining
the native code library (see above).
This solution means that the SWT libraries have to be manuallyadded to every project that uses SWT.
2. Set the library location in an environmentvariable.
For Windows this is done by editing the PATH environment variableto include the above mentionedruntime-library-path.
in Win 9X this is done by editing the Autoexec.batfile,
on NT or 2K the variable is edited through My Computer >Properties > Advanced > EnvironmentVariables.
On linux/unix, modify the LD_LIBRARY_PATH environment variable toinclude the runtime-library-path.
3. Copy the SWT library to a directory that is already on the Javalibrary path. For example, the jre/bin directory.
The
disadvantage of this solution is that every time you upgradeeclipse you
have to remember to copy the native codelibrary.
Starting
with Eclipse 3.1, the SWT plugin that comes with Eclipse,includes the
JNI libraries in the SWT jar. This was done to supportOSGi and Eclipse
RCP. If you are using the plugin you must extractthe libraries to
include them in the path.
大意即,如果SWT应用程序用到了SWT组件,则还必须将SWT的本地化文件加入到JVM可以找到的路径中。方法有三个:
1.修改每个工程运行时的运行VM参数,用-Djava.library.path={runtime-library-path}把本地化SWT库文件通知JVM。显然,这是指在Eclipse平台下运行,而且每个工程都要修改一次,很麻烦。
2.在环境变量中设置库路径。对于Linux,就是修改LD_LIBRARY_PATH这个环境变量,让它指到本地化SWT库中。
3.拷贝本地化SWT库文件到已经指定的Java库路径中。
问题基本解决。问题是本地化SWT库文件在哪里?答案就是Eclipse安装目录下的plugin目录下,把swt.jar包解压出来,里面的这几个文件就是了:
libswt-atk-gtk-3232.so
libswt-cairo-gtk-3232.so
libswt-gnome-gtk-3232.so
libswt-gtk-3232.so
libswt-mozilla-gtk-3232.so
libswt-pi-gtk-3232.so
接下来,把这些文件拷贝到某个目录如swt下,再exportLD_LIBRARY_PATH=..../swt:$LD_LIBRARY_PATH,就
搞定了。总之,无论放在哪里,只要让运行时库路径LD_LIBRARY_PATH包括这些libswt-***.so文件即可。如果不想每次都做这样的事
情,也可以把export加入到/etc/profile文件中,让每次开机的时候自动加载。
如果是把文件拷贝到已经存指定的Java库路
径中,即错误信息中提到的java.library.path中去,也是可以的。问题是,java.library.path的值是什么?打开
Eclipse->帮助->关于EclipseSDK->详细配置信息,仔细查看,在我机上可以发现这一行:
java.library.path=/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/lib/i386/client:/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/lib/i386:/usr/lib/jvm/java-1.5.0-sun-1.5.0.08/jre/../lib/i386:/usr/lib/mozilla/
那么,把这些libswt-***.so拷到上面的某个目录下即可。
这里我采用了用Shell脚本设置LD_LIBRARY_PATH这个变量的办法来解决。如下:
根据错误信息把libswt-pi-gtk-3232.so拷到上面提到的App文件中,在App文件夹中再编写一个很简单的Shell脚本,如run.sh:
#!/bin/sh
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
java -jar table.jar
直接把Shell脚本的当前目录加入到LD_LIBRARY_PATH路径中。可以,对Shell脚本赋予可执行的权限,这样,直接执行Shell脚本或者点击图标即可运行程序。这里,我在运行这个脚本的时候,又遇到了这样的错误:
Exception in thread"main" java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3232 injava.library.path
有了上面的经验,我们知道,只要把libswt-gtk-3232.so这个目录再拷贝到App文件夹下即可,至于需要哪些.so文件,是根据程序的不同而定的。最后,我的App文件的目录结构如下:
+--App
+--lib
+-- org.eclipse.jface.jar
+-- org.eclipse.swt.gtk.linux.x86.jar
+-- org.eclipse.core.commands.jar
+-- org.eclipse.equinox.common.jar
+--test.jar
+--libswt-pi-gtk-3232.so
+--libswt-gtk-3232.so
到目前为止,根据个人最浅显的理解,认为这种脚本设置LD_LIBRARY_PATH的方法是一个解决
java.lang.UnsatisfiedLinkError:no swt-pi-gtk-3232
injava.library.path这类错误,打包发布SWT应用程序的比较好的办法,更好的方法正在思考和寻找中。
阅读(871) | 评论(2) | 转发(0) |