【问题标题】:"no swt-win32 in java.library.path" on runtime jar运行时 jar 上的“java.library.path 中没有 swt-win32”
【发布时间】:2014-10-07 04:43:24
【问题描述】:

我是 Java 和 Eclipse 的新手。我有一个带有对话框的基于窗口的应用程序,它在 IDE 中运行良好。但是,当我尝试导出 JAR 以使其在 IDE 之外可执行(因此可重新分发)时,我使用以下命令执行它:

java -jar MyLibrary-app.jar

我得到了例外:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons:
        no swt-win32-4427 in java.library.path
        no swt-win32 in java.library.path
        Can't load library: C:\Users\jay.imerman\.swt\lib\win32\x86\swt-win32-4427.dll
        Can't load library: C:\Users\jay.imerman\.swt\lib\win32\x86\swt-win32.dll
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:327)
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:236)
    at org.eclipse.swt.internal.C.<clinit>(C.java:21)
    at org.eclipse.swt.widgets.Display.<clinit>(Display.java:138)
    at org.jimerman.MyLibrary.MainWindow.open(MainWindow.java:51)
    at org.jimerman.MyLibrary.MainWindow.main(MainWindow.java:40)

我不知道导出 JAR 和 Runnable JAR 之间有什么区别,我都试过了。在前者上,我还尝试包含来自 swt 项目的 src,以及我引用的另一个 Java 类库项目。我习惯于 Visual Studio 和 Setup 项目,它检测依赖关系并收集部署的引用。我错过了什么?如果我要使用 Maven 之类的东西,我该如何去学习所有的术语和概念,甚至理解它的含义以及构建可再分发文件需要什么?

【问题讨论】:

  • 好的,我想我取得了一些进展。在查看错误的开头时,它说它无法加载 DLL - 我从 Eclipse.org 下载了 SWT (4.4),打开了 zip。显然只是将 swt.jar 文件放在与我的 jar 相同的路径中,或者将其放在 .swt 路径中是不够的。我打开 swt.jar 并找到了 DLL,并将它们放在它正在寻找它们的路径中(开头的错误),现在我的应用程序运行了。现在如何自动化收集和打包,以便可以将单个文件分发到另一台计算机以运行我的应用程序?令人困惑。
  • 另一件事有效 - 当我在 MyLibrary 项目上选择导出时,我展开 swt 项目并从主文件夹中选择要包含在我的 JAR 文件中的 DLL。这也正确执行。另外,它是一个单一的 JAR zip,所以它是一个干净的构建版本。

标签: java eclipse maven jar swt


【解决方案1】:

您可以选择在 eclipse 中导出到 runnable-jar 并保存 ant.xml。它应该看起来像

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="create_run_jar" name="Create Runnable Jar for Project MyLibrary-app">
    <!--this file was created by Eclipse Runnable JAR Export Wizard-->
    <!--ANT 1.7 is required                                        -->
    <target name="create_run_jar">
        <jar destfile="MyLibrary-app" filesetmanifest="mergewithoutmain">
            <manifest>
                <attribute name="Main-Class" value="MainClass"/>
                <attribute name="Class-Path" value="."/>
            </manifest>
            <fileset dir="bin"/>
            <zipfileset excludes="META-INF/*.SF" src="{Eclipse_HOME}/plugins/org.eclipse.swt.win32.win32.x86_x.x.x.vxxxxa.jar"/>
        </jar>
    </target>
</project>

【讨论】:

  • 那么这对我到底有什么作用呢? ANT到底是什么?我想我很困惑,我从一个具体的问题开始——如何运行我在 Eclipse 之外制作的 Java 应用程序。
  • 这个 ant.xml 在你导出一个可运行的 jar 时由 eclipse 创建,对于创建的这个文件,你应该在向导中选中一个框。然后检查您是否在此答案中发布了 jar 条目。你需要那个 jar,如果它不存在,那么你应该配置 buildpath。
猜你喜欢
  • 2014-11-12
  • 2011-09-29
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多