下面是潜在问题的背景,我正在与一个小组合作一个项目,该项目使用
Swt
SWT
非常依赖于平台/架构。我想把六个都打包
jar
将s(linux、mac、win和32/64位)放入同一个包中,并根据系统使用相应的库。我意识到这是一个艰难的挑战,但是,转换到
Swing
(或其他)现在不是一个真正的选择。
我找到了一些相关的线索(
@Aaron Digulla's thread
和
@mchr's thread
)这让我对手头的问题有了宝贵的见解。我试图实现@Alexey Romanov提出的解决方案
here
. 有一点不同
loadSwtJar()
他提出的方法不是静态的,我实例化了对象,紧接着,在对对象做任何其他操作之前运行该方法。
这似乎是因为加载程序不能正常工作。我对这一说法的理由如下:
-
如果全部
Swt公司
jar从可执行jar文件的类路径中删除,然后
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/events/MouseListener
是由以下原因引发的:
java.lang.ClassNotFoundException: org.eclipse.swt.events.MouseListener
-
如果
swt
jar留在类路径上,然后系统在执行期间使用第一个jar文件。也就是说,如果gtk-linux-x86_64恰好是jar列表中的第一个swtjar,那么系统将尝试使用它,而不管系统是win32还是Mac OSX。
我试图添加一些输出以查看
loadSwtJar()
方法正在选择正确的jar,并且输出似乎在我尝试过的所有平台上都是正确的,就像选择了正确的包一样(并且文件确实存在于runnable jar中)。但是,没有加载正确的库,因此会发生执行错误:
Exception in thread "main" java.lang.reflect.InvocationTargetException
由以下原因引起:
Caused by: java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
(注意,如果我更改了
build.xml
那么,这里的问题是什么?我是否遗漏了一些细节,或者根本无法检查系统属性并相应地加载适当的库?
最后,下面是我的构建文件的一个摘录,它可能有助于找到问题的根源。
提前谢谢你,
编辑:
在与同事进行了长时间的调试之后,问题就解决了(除了我提到的MacOS上的线程管理方面的一个恼人的错误
here
). 它涉及到调整ANT构建以及编写主类的方式。(事实证明,主类正在扩展和实现SWT库中的引用,这意味着代码根本无法编译,用另一个类包装主类,并从那里加载SWT jar,这似乎足以解决问题)
感谢并问候所有贡献的人,特别是“亚伦”。非常感谢!