如何使用Maven构建一个SWT应用程序

25

我正在尝试学习 SWT,我使用 Maven 进行所有的构建工作,并且使用 Eclipse 作为我的 IDE。当从 Maven 存储库获取 SWT jar 包时,我遇到了以下问题:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3034 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1030)
    at org.eclipse.swt.internal.Library.loadLibrary(Library.java:100)
    at org.eclipse.swt.internal.gtk.OS.<clinit>(OS.java:19)
    at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:63)
    at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:54)
    at org.eclipse.swt.widgets.Display.<clinit>(Display.java:112)
    at wenzlick.test.swt.main.Main.main(Main.java:30)

有人成功地使用Maven构建和运行了SWT应用程序吗?

编辑:我进行了一些研究并找到了问题。请查看下面的我的帖子。


快速提示:Maven仓库已经迁移到https://github.com/maven-eclipse/maven-eclipse.github.io -- 自2014年起,Google Code已经关闭。 - leo
6个回答

19
我已将最新的SWT版本(4.2.2)的win32/64和osx构件上传到googlecode存储库中,您可以在此处找到它:https://swt-repo.googlecode.com/svn/repo/
只需将以下内容放入您的pom.xml文件中即可使用:
<repositories>
    <repository>
        <id>swt-repo</id>
        <url>https://swt-repo.googlecode.com/svn/repo/</url>
    </repository>
</repositories>

那么你只需要引用与你的平台相关的SWT依赖项。例如:

    <dependency>
        <groupId>org.eclipse.swt</groupId>
        <artifactId>org.eclipse.swt.win32.win32.x86</artifactId>
        <version>4.2.2</version>
    </dependency>

对于其他平台,只需将artifactId替换为适当的值:

  • org.eclipse.swt.win32.win32.x86
  • org.eclipse.swt.win32.win32.x86_64
  • org.eclipse.swt.cocoa.macosx
  • org.eclipse.swt.cocoa.macosx.x86_64

额外平台和旧版本的构件也可用,请访问上面的存储库链接查找它们。

愉快编码!


2
关于即将停止的Google Code服务:请查看此更新的答案:https://dev59.com/yG445IYBdhLWcg3wAFYC#9985222 - hennr
Maven仓库 https://github.com/maven-eclipse/maven-eclipse.github.io -- 自2014年起。 - leo
SWT现在已经发布到Maven Central。请参考此答案:https://dev59.com/4XVC5IYBdhLWcg3wcgqd#15487277 - Stephan

9
听起来Maven正在引入一个旧版本的SWT。从v3.4(及以上版本)开始,swt.jar是您所需要的全部内容。SWT将根据需要自动提取.so、.jnilib或.dll文件。您需要担心的唯一棘手的问题是确保获取适合您平台的正确swt.jar。
尝试手动在本地存储库中安装SWT 3.4。如果仍然出现相同的问题,则可能有问题。之后,我会尝试手动提取.so文件,然后使用调用时的-D开关指定java.library.path变量。有时,在Linux上由于依赖性问题(例如libpango),库的加载可能会失败。在这种情况下,通常错误只是通用的UnsatisifedLinkError,使问题难以调试。

7

3
我使用了最新版本的Eclipse和github,以下是我使用的链接https://github.com/maven-eclipse/maven-eclipse.github.io ,建议您阅读一下。
以下是对我有用的pom.xml内容:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.whatever</groupId>
  <artifactId>whatever</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>swt</name>
  <url>http://maven.apache.org</url>

    <repositories>
        <repository>
            <id>maven-eclipse-repo</id>
            <url>http://maven-eclipse.github.io/maven</url>
        </repository>
    </repositories>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <swt.version>4.6</swt.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
        <!-- select prefered one, or move the preferred on to the top: -->
        <dependency>
            <groupId>org.eclipse.swt</groupId>
            <artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId>
            <version>${swt.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.swt</groupId>
            <artifactId>org.eclipse.swt.win32.win32.x86</artifactId>
            <version>${swt.version}</version>
            <!-- To use the debug jar, add this -->
            <classifier>debug</classifier>
        </dependency>       
        <dependency>
            <groupId>org.eclipse.swt</groupId>
            <artifactId>org.eclipse.swt.gtk.linux.x86</artifactId>
            <version>${swt.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.swt</groupId>
            <artifactId>org.eclipse.swt.gtk.linux.x86_64</artifactId>
            <version>${swt.version}</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.swt</groupId>
            <artifactId>org.eclipse.swt.cocoa.macosx.x86_64</artifactId>
            <version>${swt.version}</version>
        </dependency>

  </dependencies>
</project>

2

UnsatisfiedLinkError的API中得知:

如果Java虚拟机找不到声明为本地方法的适当的本地语言定义,则抛出此异常。

我自己没有尝试过,但我认为你不仅需要下载主要的SWT JAR文件,还需要下载支持你平台的“本地”JAR文件。例如,如果你使用的是Linux系统,则需要下载swt-linux-gtk。


1

我对此进行了更深入的研究,并发现在Maven存储库中,swt jar位于几个不同的位置。我曾经使用过由swt组发布的jar文件,但是在稍微查找一下后,我发现了由org.eclipse.swt.gtk.linux组为Linux(org.eclipse.swt.win32.win32为Windows)发布的jar文件。这是针对3.3版本的swt。仍在寻找3.4版本。


3
如果这能帮到某些人,我已经开始在我的公共代码库上部署 SWT 项目:http://maven.ju-n.net/maven2/org/swt/ - nicoulaj
不是的。顺便说一下,我的仓库网址已经改变了:http://maven.ju-n.net/public/ - nicoulaj
请查看我的答案,其中包含SWT 3.7.2构件的最新存储库。 - urish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接