【发布时间】:2011-04-26 22:49:03
【问题描述】:
这是潜在问题的背景,我正在与一个小组合作开展一个使用 Swt 库的项目,并且我正在尝试打包软件以进行部署。事实证明SWT 非常依赖于平台/架构。我希望能够将所有六个jars(linux、mac、win 和 32/64 位)打包到同一个包中,并根据系统使用适当的库。我意识到这是一个艰巨的挑战,但是现在切换到Swing(或其他任何东西)并不是一个真正的选择。
我发现了许多相关的线程(@Aaron Digulla's thread 和@mchr's thread),它们为我提供了有关手头问题的宝贵见解。我试图实施@Alexey Romanov here 提出的解决方案。有一个区别,因为他提出的loadSwtJar() 方法不是静态的,我实例化了对象,然后立即运行该方法,然后对对象进行任何其他操作。
显示为加载过程无法正常工作。我对这种说法的推理如下:
- 如果所有
Swtjars 都从可执行jar 文件的classpath 中删除,则Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/events/MouseListener被抛出,这是由于:java.lang.ClassNotFoundException: org.eclipse.swt.events.MouseListener引起的
对我来说,这意味着在类路径中找不到库,我弄错了吗?
- 如果
swtjar 留在类路径中,则系统在执行期间将使用第一个 jar 文件。这意味着如果 gtk-linux-x86_64 恰好是 jar 列表中的第一个 swt jar,那么系统会尝试使用它,无论系统是 win32 还是 Mac OSX。
我尝试添加一些输出以查看loadSwtJar() 方法是否选择了正确的 jar,并且在我尝试过的所有平台上输出似乎都是正确的,因为选择了正确的包(并且文件确实存在于可运行的 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 文件中 64 位和 32 位 swt 库的出现顺序,这是我在 Linux 机器上遇到的错误)
那么,这里的问题似乎是什么?我是否遗漏了一些细节,或者根本无法检查系统属性并相应地加载适当的库?
最后是我的构建文件的摘录,认为它可能有助于找到问题的根源。
提前致谢,
编辑:在与同事进行长时间的调试会话后,问题得到解决(除了我提到的有关 MacOS 上的线程管理的恼人错误 here)。它涉及调整 ANT 构建以及编写主类的方式。 (事实证明,主类正在扩展和实现来自 SWT 库的引用,这意味着代码根本无法编译,用另一个类包装主类并从那里加载 SWT jar,这似乎就足够了解决问题)
感谢和问候所有做出贡献的人,尤其是@Aaron。真的很感激!
【问题讨论】:
标签: java build cross-platform swt