Pregunta

Estoy tratando de aprender swt, y uso maven para todas mis compilaciones y eclipse para mi IDE. Al sacar los frascos swt del repositorio de Maven, obtengo:

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)

¿Alguien ha conseguido con éxito una aplicación swt para construir y ejecutar usando Maven?

Editar : Investigué un poco y descubrí el problema. mira mi publicación a continuación

¿Fue útil?

Solución

Parece que Maven está incorporando una versión antigua de SWT. A partir de v3.4 (y superior), el swt.jar es todo que necesita. SWT extraerá automáticamente los .so s, .jnilib s o .dll s según sea necesario. La única cosa difícil de la que debe preocuparse es asegurarse de obtener el swt.jar correcto (que significa para su plataforma).

Intente instalar SWT 3.4 en su repositorio local a mano. Si eso todavía te da el mismo problema, entonces probablemente hay algo sospechoso. Después de eso, intentaría extraer los .so s manualmente y luego especificar la variable java.library.path usando el interruptor -D en la invocación . A veces, en Linux, la carga de las bibliotecas puede fallar debido a problemas de dependencia (en cosas como libpango). En tales casos, a menudo el error será solo el UnsatisifedLinkError genérico, lo que dificultará la depuración del problema.

Otros consejos

He subido el win32 / 64 & amp; artefactos osx de la última versión SWT (4.2.2) a un repositorio de googlecode, puede encontrarlo aquí:

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

Para usarlo, solo ponga lo siguiente en su pom.xml:

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

Entonces puede hacer referencia a la dependencia SWT relevante para su plataforma. Por ejemplo:

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

Para otras plataformas, simplemente reemplace artifactId con el valor apropiado:

  • 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

Los artefactos para plataformas adicionales y versiones anteriores también están disponibles, visite el enlace del repositorio de arriba para encontrarlos.

¡Feliz codificación!

De la API de UnsatisfiedLinkError

  

Lanzado si la máquina virtual Java no puede encontrar una definición de idioma nativo apropiada de un método declarado nativo.

No lo he probado yo mismo, pero creo que no solo necesita descargar el archivo SWT principal, sino un JAR 'nativo' de soporte para su plataforma. Por ejemplo, swt-linux-gtk si estás en Linux?

Usé github con las últimas cosas de Eclipse: https://github.com/maven-eclipse/maven-eclipse.github. io . Te sugiero que leas eso.

El pom.xml que funcionó para mí:

<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>

Investigué un poco más sobre esto y descubrí que el frasco swt está en un par de lugares diferentes en el repositorio de Maven. Estaba usando jarras lanzadas por el grupo swt, pero después de mirar un poco, encontré las jarras lanzadas por el grupo org.eclipse.swt.gtk.linux para linux (org.eclipse.swt.win32.win32 para Windows ) Esto es para la versión 3.3 de swt. Todavía estoy buscando 3.4.

Desde 2013 (este año inicial), las cosas han cambiado. SWT ahora se publica en Maven Central. Aquí están las coordenadas al momento de escribir esto:

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

Puede encontrar este ticket interesante.

Últimos artefactos SWT para Windows de 64 bits: https://mvnrepository.com/artifact/org.eclipse.platform/org.eclipse.swt.win32.win32.x86_64

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top