简体   繁体   English

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

[英]How do you build an SWT application with Maven

I trying to learn swt, and I use maven for all my builds and eclipse for my IDE. 我试图学习swt,我使用maven进行所有构建,并使用eclipse进行IDE。 When getting the swt jars out of the maven repository, I get: 当从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)

Has anyone successfully got a swt app to build and run using maven? 有没有人成功获得使用maven构建和运行的swt应用程序?

Edit : I did a little research and found the problem. 编辑 :我做了一点研究,发现了问题。 look at my post below 看看我下面的帖子

I have uploaded the win32/64 & osx artifacts of the latest SWT version (4.2.2) to a googlecode repository, you can find it here: 我已将最新SWT版本(4.2.2)的win32 / 64和osx工件上传到googlecode存储库,您可以在此处找到它:

https://swt-repo.googlecode.com/svn/repo/ https://swt-repo.googlecode.com/svn/repo/

To use it just put the following in your pom.xml: 要使用它,只需将以下内容放在pom.xml中:

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

Then you can just reference the SWT dependency relevant to your platform. 然后,您可以引用与您的平台相关的SWT依赖项。 For example: 例如:

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

For other platforms, just replace artifactId with the appropriate value: 对于其他平台,只需将artifactId替换为适当的值:

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

Artifacts for additional platforms and older versions are available as well, visit the repository link above to find them. 还可以使用其他平台和旧版本的工件,访问上面的存储库链接以查找它们。

Happy coding! 快乐的编码!

Sounds like Maven is pulling in an old version of SWT. 听起来Maven正在推出一个旧版本的SWT。 As of v3.4 (and higher), the swt.jar is all you need. 随着V3.4(或更高版本)中,SWT.JAR是你所需要 SWT will automatically extract the .so s, .jnilib s or .dll s as necessary. SWT将根据需要自动提取.so s, .jnilib.dll The only tricky thing you need to worry about is to ensure that you get the right swt.jar (meaning for your platform). 您需要担心的唯一棘手的事情是确保您获得正确的swt.jar(意味着您的平台)。

Try installing SWT 3.4 in your local repository by hand. 尝试手动在本地存储库中安装SWT 3.4。 If that still gives you the same problem, then something is probably fishy. 如果这仍然给你带来同样的问题,那么事情可能是多么可疑。 After that, I would try extracting the .so s manually and then specifying the java.library.path variable using the -D switch on invocation. 之后,我会尝试手动提取.so ,然后使用-D开关调用指定java.library.path变量。 Sometimes on Linux the loading of the libraries can fail due to dependency problems (in things like libpango). 有时在Linux上,由于依赖性问题(例如libpango之类的东西),库的加载可能会失败。 In such cases, often the error will be just the generic UnsatisifedLinkError , making the problem difficult to debug. 在这种情况下,错误通常只是通用的UnsatisifedLinkError ,使问题难以调试。

Since 2013 (this post inception year), things has changed. 自2013年(本年度开始)以来,情况发生了变化。 SWT is now published on Maven Central. SWT现在发布在Maven Central上。 Here are the coordinates as of this writing: 以下是撰写本文时的坐标:

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

You may find this ticket interesting. 你可能会觉得这张很有意思。

Latest SWT artefacts for windows 64bit: https://mvnrepository.com/artifact/org.eclipse.platform/org.eclipse.swt.win32.win32.x86_64 适用于Windows 64bit的最新SWT工件: https//mvnrepository.com/artifact/org.eclipse.platform/org.eclipse.swt.win32.win32.x86_64

From the API of UnsatisfiedLinkError 来自UnsatisfiedLinkError的API

Thrown if the Java Virtual Machine cannot find an appropriate native-language definition of a method declared native. 如果Java虚拟机无法找到声明为native的方法的适当本机语言定义,则抛出该异常。

I haven't tried it myself, but I think you not only need to download the main SWT jar, but a supporting 'native' JAR for your platform. 我自己没有尝试过,但我认为你不仅需要下载主要的SWT jar,而且需要为你的平台下载一个支持“原生”的JAR。 For example swt-linux-gtk if you're on Linux? 例如swt-linux-gtk如果你在Linux上?

I used github with latest Eclipse's stuff: https://github.com/maven-eclipse/maven-eclipse.github.io . 我使用了最新Eclipse的github: https//github.com/maven-eclipse/maven-eclipse.github.io I suggest you read that. 我建议你读一下。

The pom.xml that worked for me: 适合我的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>

I did a little more research on this and found that the swt jar is in a couple different places in the maven repository. 我对此进行了一些研究,发现swt jar位于maven存储库中的几个不同位置。 I was using jars put out by the swt group, but after looking around a bit, I found the jars put out by the org.eclipse.swt.gtk.linux group for linux (org.eclipse.swt.win32.win32 for Windows). 我正在使用swt小组推出的罐子,但是在看了一下之后,我发现了org.eclipse.swt.gtk.linux组为linux发布的jar(org.eclipse.swt.win32.win32 for Windows) )。 This is for the 3.3 version of swt. 这是针对swt的3.3版本。 Still looking for 3.4. 仍在寻找3.4。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM