2012-08-30 14 views
5

Actualmente estoy intentando construir mi proyecto con maven y sqlite4java. Que está disponible en los repositorios oficiales de maven. El sqlite4java page on google code oficial tiene una configuración de ejemplo, pero está un poco desactualizado y no se ajusta a mis necesidades. Quiero tener un solo archivo .jar al final que pueda implementar en otro lugar. El problema aquí es la dependencia del objeto compartido. Estoy utilizando el objetivo oficial de construcción de su página para copiar el modo a la build.dir/lib pero mis montaje accidentes objetivo con: malIncluyendo el objeto compartido en el ensamblaje de maven

[INFO] Failed to create assembly: Error adding file-set for 'com.almworks.sqlite4java:libsqlite4java-linux-i386:so:0.282' to archive: Error adding archived file-set. PlexusIoResourceCollection not found for: /home/lhw/.m2/repository/com/almworks/sqlite4java/libsqlite4java-linux-i386/0.282/libsqlite4java-linux-i386-0.282.so 
No such archiver: 'so'. 

¿Qué estoy haciendo? Aquí está mi actual pom.xml despojado de algunas dependencias no relacionado con este tema

<?xml version="1.0"?> 
<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>de.ring0.lhw</groupId> 
    <artifactId>system</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <dependencies> 
    <dependency> 
     <groupId>com.almworks.sqlite4java</groupId> 
     <artifactId>sqlite4java</artifactId> 
     <version>${sqlite4java.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.almworks.sqlite4java</groupId> 
     <artifactId>libsqlite4java-linux-i386</artifactId> 
     <version>${sqlite4java.version}</version> 
     <type>so</type> 
    </dependency> 
    </dependencies> 
    <properties> 
    <sqlite4java.version>0.282</sqlite4java.version> 
    </properties> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-dependency-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>copy</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>copy</goal> 
      </goals> 
      <configuration> 
       <artifactItems> 
       <artifactItem> 
        <groupId>com.almworks.sqlite4java</groupId> 
        <artifactId>libsqlite4java-linux-i386</artifactId> 
        <version>${sqlite4java.version}</version> 
        <type>so</type> 
        <overWrite>true</overWrite> 
        <outputDirectory>${project.build.directory}/lib</outputDirectory> 
       </artifactItem> 
       </artifactItems> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>2.5.1</version> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.12.2</version> 
     <configuration> 
      <skipTests>true</skipTests> 
      <systemProperties> 
      <property> 
       <name>sqlite4java.library.path</name> 
       <value>${project.build.directory}/lib</value> 
      </property> 
      </systemProperties> 
     </configuration> 
     </plugin> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <archive> 
       <manifest> 
        <mainClass>de.ring0.lhw.Init</mainClass> 
       </manifest> 
       </archive> 
       <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Respuesta

1

Editar:

Creo que el descriptor de montaje jar-con-dependencias intenta descomprimir las dependencias.

Ver el enlace:

http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html

maven.apache.org/plugins/maven-assembly-plugin/... ...

<unpack>true</unpack> 

Y por supuesto, no puede descomprimir el .so

Así que es posible que deba utilizar un conjunto personalizado para realizar lo que desea hacer

+0

-rw-rw-r-- 1 lhw lhw 716k Ago 30 de 12:23 .m2/repositorio/com/almworks/sqlite4java/libsqlite4java-linux-i386/0,282/libsqlite4java-linux-i386-0.282.so Sí, el archivo existe y se copia a target/lib cuando se ejecuta el objetivo de compilación. – lhw

+0

¿Cómo instaló/implementó el 'así' para el repositorio? mvn clean install: install-file? ¿Tiene un pom para esta dependencia instalada? En caso afirmativo, ¿configuró el tipo y el paquete de la dependencia a 'tan'? Puede intentar instalarlo con mvn clean install: install-file -Dpackaging = so –

+0

libsqlite4java-linux-i386 Es la dependencia del objeto compartido que es de tipo para que pueda ver abvoe. Se descarga automáticamente al repositorio local. sqlite4java está disponible en los repositorios maven estándar si quieres probarlo tú mismo. – lhw

0

Es posible crear un archivo jar ejecutable con el descriptor de ensamblaje "jar-with-dependence" de stock y sin utilizar ninguna secuencia de arranque shell/batch. Sin embargo, requiere soluciones sucias que no involucran muchas configuraciones de Maven.

  1. Tenemos que colocar todas las bibliotecas nativas (included in sqlite4java zip download) a /main/resources src de directorio. También elimine la dependencia de la biblioteca nativa sqlite4java de su archivo Maven POM.
  2. Debido cargador de biblioteca nativa de sqlite4java no se fija en la ruta de clases o en el interior del archivo JAR, tiene que bibliotecas nativas de extractos en el arranque, y conjunto de propiedades del sistema "sqlite4java.library.path" en tiempo de ejecución. Consulte el siguiente código de ejemplo:

/** List of native libraries you put in src/main/resources */ 
public static final String[] NATIVE_LIB_FILENAMES = { 
    "libsqlite4java-linux-amd64.so", 
    "libsqlite4java-linux-i386.so", 
    "libsqlite4java-osx.jnilib", 
    "libsqlite4java-osx-10.4.jnilib", 
    "libsqlite4java-osx-ppc.jnilib", 
    "sqlite4java-win32-x64.dll", 
    "sqlite4java-win32-x86.dll", 
}; 

/** 
* Extract native libraries to the current directory. 
* This example needs Apache Commons IO (https://commons.apache.org/proper/commons-io/) 
*/ 
public static void extractNativeResources() { 
    for(String filename: NATIVE_LIB_FILENAMES) { 
     // Change "DemoSQLite2" to your class name 
     final InputStream in = DemoSQLite2.class.getResourceAsStream("/"+filename); 

     if(in != null) { 
      try { 
       System.out.println("Extracting " + filename); 
       FileUtils.copyInputStreamToFile(in, new File(filename)); 
      } catch (IOException e) { 
       System.err.println("Can't extract " + filename); 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

/** 
* Delete native libraries in the current directory 
*/ 
public static void removeNativeResources() { 
    for(String filename: NATIVE_LIB_FILENAMES) { 
     File file = new File(filename); 
     file.delete(); 
    } 
} 

public static void main(String[] args) throws Exception { 
    boolean deleteNativesOnExit = false; // Delete natives on exit 

    // Extract native libraries if sqlite4java.library.path property is not set 
    String sqlitePath = System.getProperty("sqlite4java.library.path"); 
    if(sqlitePath == null) { 
     System.setProperty("sqlite4java.library.path", "."); // Read natives from current directory 
     extractNativeResources(); 
     deleteNativesOnExit = true; 
    } 

    // Do SQLite jobs here 
    final SQLiteConnection db = new SQLiteConnection(new File("test.db")); 
    try { 
     db.open(); 
     db.dispose(); 
     System.out.println("Success"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.err.println("FAILED"); 
    } 

    // Delete the native libraries we extracted 
    if(deleteNativesOnExit) removeNativeResources(); 
} 

Ahora su aplicación debería ser edificable con descriptores estándar "jar-con-dependencias", y que su aplicación es ejecutable con la norma "java-jar your_jar.jar" mando.

Por supuesto, si sqlite4java recibe actualizaciones en el futuro, debe actualizar manualmente las bibliotecas nativas en su directorio de recursos.

Si tiene una solución mejor, menos sucia, ¡por favor hágamelo saber!

+0

Si lo vota por favor, sugiera una mejor solución y/o lo que piensa al respecto, para poder revisar esta publicación. – NullNoname

Cuestiones relacionadas