Java 如何使用Maven构建SWT应用程序

Java 如何使用Maven构建SWT应用程序,java,maven-2,swt,Java,Maven 2,Swt,我试图学习swt,我在所有构建中都使用maven,在IDE中使用eclipse。从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.Runt

我试图学习swt,我在所有构建中都使用maven,在IDE中使用eclipse。从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)
线程“main”java.lang.UnsatifiedLinkError中出现异常:java.library.path中没有swt-pi-gtk-3034
位于java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
位于java.lang.Runtime.loadLibrary0(Runtime.java:823)
位于java.lang.System.loadLibrary(System.java:1030)
位于org.eclipse.swt.internal.Library.loadLibrary(Library.java:100)
位于org.eclipse.swt.internal.gtk.OS.(OS.java:19)
位于org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:63)
位于org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:54)
在org.eclipse.swt.widgets.Display上(Display.java:112)
位于wenzlick.test.swt.main.main.main(main.java:30)
有没有人成功地使用maven构建并运行swt应用程序

编辑:我做了一些研究,发现了问题。请看我下面的帖子,它来自

如果Java虚拟机找不到声明为本机的方法的适当本机语言定义,则引发


我自己没有试过,但我认为您不仅需要下载主SWT jar,还需要为您的平台下载一个支持“本机”jar。例如,如果您使用的是linux,则使用swt linux gtk?

听起来Maven使用的是旧版本的swt。从v3.4(及更高版本)开始,您只需要swt.jar。SWT将根据需要自动提取
.so
s、
.jnilib
s或
.dll
s。您需要担心的唯一棘手的事情是确保获得正确的swt.jar(对于您的平台而言)


尝试手动在本地存储库中安装SWT3.4。如果这仍然会给你带来同样的问题,那么有些事情可能是可疑的。之后,我将尝试手动提取
.so
s,然后使用
-D
打开调用指定
java.library.path
变量。有时在Linux上,库的加载可能会由于依赖性问题而失败(例如libpango)。在这种情况下,错误通常只是泛型的
未满足链接错误
,使问题难以调试。

我对此做了更多的研究,发现swt jar位于maven存储库中的两个不同位置。我使用的是swt组发布的JAR,但是在四处查看之后,我发现了org.eclipse.swt.gtk.linux组发布的用于linux(org.eclipse.swt.win32.win32 for Windows)的JAR。这适用于swt的3.3版本。仍在寻找3.4。

我已将最新SWT版本(4.2.2)的win32/64&osx工件上载到googlecode存储库,您可以在这里找到它:

要使用它,只需在pom.xml中添加以下内容:

<repositories>
    <repository>
        <id>swt-repo</id>
        <url>https://swt-repo.googlecode.com/svn/repo/</url>
    </repository>
</repositories>

swt回购
https://swt-repo.googlecode.com/svn/repo/
然后,您可以只引用与您的平台相关的SWT依赖项。例如:

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

org.eclipse.swt
org.eclipse.swt.win32.win32.x86
4.2.2
对于其他平台,只需使用适当的值替换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
其他平台和旧版本的工件也可用,请访问上面的存储库链接查找它们


快乐编码

自2013年(成立后的这一年)以来,情况发生了变化。SWT现已在Maven Central上发布。 以下是撰写本文时的坐标:

<dependency>
    <groupId>org.eclipse.platform</groupId>
    <artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId>
    <version>${swt.version}</version>
</dependency>

org.eclipse.platform
有趣


适用于windows 64位的最新SWT人工制品:

我将github与最新的Eclipse产品一起使用: . 我建议你读一下

为我工作的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>

4.0.0
不管怎样
无论什么
0.0.1-快照
罐子
swt
http://maven.apache.org
马文日食回购
http://maven-eclipse.github.io/maven
UTF-8
1.8
1.8
4.6
朱尼特
朱尼特
4.12
测试
org.eclipse.swt
org.eclipse.swt.win32.win32.x86_64
${swt.version}
org.eclipse.swt
org.eclipse.swt.win32.win32.x86
${swt.version}
调试
org.eclipse.swt
org.eclipse.swt.gtk.linux.x86
${swt.version}
org.eclipse.swt
org.eclipse.swt.gtk.linux.x86_64
${swt.version}
org.eclipse.swt
org.eclipse.swt.cocoa.macosx.x86_64
${swt.version}

如果这对某人有帮助,我已经开始在我的公共存储库中部署SWT工件:不,它们不是。顺便说一句,我的repo URL已经改变了:请参阅下面我的答案,以获取关于即将消亡的谷歌代码服务的最新存储库SWT 3.7.2工件:看看这个更新的答案:maven repo——自2014年以来。SWT现在发布在maven Central上。看看这个anwser:Quick:maven回购——自2014年以来。谷歌代码已经死了。