Как создать приложение SWT с помощью Maven
Вопрос
Я пытаюсь изучить SWT и использую Maven для всех своих сборок и eclipse для своей IDE.При извлечении файлов SWT из репозитория Maven я получаю:
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)
Кто-нибудь успешно получил приложение SWT для сборки и запуска с помощью Maven?
Редактировать:Я провел небольшое исследование и нашел проблему.посмотри на мой пост ниже
Решение
Похоже, что Maven использует старую версию SWT. Начиная с версии 3.4 (и выше), swt.jar - это все , что вам нужно. SWT автоматически извлечет .so
, .jnilib
или .dll
по мере необходимости. Единственное, о чем вам нужно беспокоиться, это убедиться, что вы получите правильный swt.jar (то есть для вашей платформы).
Попробуйте вручную установить SWT 3.4 в вашем локальном хранилище. Если это все еще дает вам ту же проблему, то, возможно, что-то подозрительно. После этого я бы попытался извлечь файлы .so
вручную, а затем указать переменную java.library.path
, используя переключатель -D
при вызове. , Иногда в Linux загрузка библиотек может быть неудачной из-за проблем с зависимостями (например, в libpango). В таких случаях часто ошибкой будет просто UnsatisifedLinkError
, что затрудняет отладку проблемы.
Другие советы
Я загрузил артефакты win32/64 и osx последней версии SWT (4.2.2) в репозиторий 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>
Для других платформ просто замените артефактId соответствующим значением:
- 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
Также доступны артефакты для дополнительных платформ и более старых версий. Чтобы найти их, перейдите по ссылке на репозиторий выше.
Приятного кодирования!
Из API UnsatisfiedLinkError р>
Брошенный, если Виртуальная машина Java не может найти соответствующее определение на родном языке метода, объявленного собственным.
Я сам не пробовал, но думаю, вам нужно не только загрузить основной файл SWT, но и вспомогательный «родной» файл JAR для вашей платформы. Например, swt-linux-gtk, если вы работаете в Linux?
Я использовал github с последними материалами Eclipse: https://github.com/maven-eclipse/maven-eclipse.github. Я предлагаю вам прочитать это.
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>
Я провел еще немного исследований по этому вопросу и обнаружил, что SWT-файл находится в нескольких разных местах в хранилище maven. Я использовал jar-файлы, выпущенные группой SWT, но, посмотрев немного, я обнаружил jar-файлы, выпущенные группой org.eclipse.swt.gtk.linux для linux (org.eclipse.swt.win32.win32 для Windows ). Это для версии 3.3 SWT. Все еще ищу 3.4.
С 2013 года (в этом году), ситуация изменилась. SWT теперь публикуется на Maven Central. Вот координаты на момент написания этой статьи:
<dependency>
<groupId>org.eclipse.platform</groupId>
<artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId>
<version>${swt.version}</version>
</dependency>
Вы можете найти этот билет интересным.
Последние SWT-артефакты для Windows 64bit: https://mvnrepository.com/artifact/org.eclipse.platform/org.eclipse.swt.win32.win32.x86_64 р>