2012-08-30 10 views
5

Attualmente sto cercando di creare il mio progetto con maven e sqlite4java. Che è disponibile nei repository Maven ufficiali. L'ufficiale sqlite4java page on google code ha una configurazione di esempio ma è un po 'obsoleto e non soddisfa le mie esigenze. Voglio avere un singolo file .jar alla fine che posso distribuire altrove. Il problema qui è la depenenza di oggetti condivisa. Sto usando l'obiettivo ufficiale di costruzione dalla loro pagina per copiare il modo al build.dir/lib, ma i miei assemblaggio obiettivo crash con: sbagliatoIncluso l'oggetto condiviso nel gruppo di esperti

[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'. 

Che cosa sto facendo? Qui è il mio pom.xml corrente spogliato da alcune dipendenze estranei a questo 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> 

risposta

1

Edit:

Credo che il descrittore di assemblaggio vaso-con-dipendenze cerca di decomprimere le dipendenze.

consultare il link:

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

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

<unpack>true</unpack> 

E naturalmente non riesce a decomprimere il .so

Quindi potrebbe essere necessario utilizzare un assembly personalizzato per eseguire ciò che si desidera fare

+0

-rw-rw-r-- 1 lhw lhw 716k 30 Agosto 00:23 .m2/repository/com/almworks/sqlite4java/libsqlite4java-linux-i386/0,282/libsqlite4java-linux-i386-0.282.so Sì, il file esiste e viene copiato su target/lib quando viene eseguito l'obiettivo di compilazione. – lhw

+0

Come hai installato/distribuito il "così" al repository? mvn clean install: install-file? Hai un pom per questa dipendenza installata? Se sì, hai impostato il tipo e il pacchetto della dipendenza in "così"? Si può provare a installarlo con mvn clean install: install-file -Dpackaging = so –

+0

libsqlite4java-linux-i386 È la dipendenza dell'oggetto condiviso che è di tipo così come si può vedere abvoe. Viene scaricato automaticamente nel repository locale. sqlite4java è disponibile nei repository standard di Maven se vuoi provarlo tu stesso. – lhw

0

È possibile creare un jar eseguibile con un descrittore di assieme "jar-with-dependencies" e senza utilizzare shell di avvio/script batch. Tuttavia, richiede soluzioni alternative che non implichino molte configurazioni di Maven.

  1. Abbiamo bisogno di mettere tutte le librerie native (included in sqlite4java zip download) a /main/Risorse src directory. Rimuovi anche la dipendenza dalla libreria nativa di sqlite4java dal tuo file Maven POM.
  2. Perché nativo biblioteca caricatore di sqlite4java non guarda classpath o all'interno del file JAR, è necessario estrarre librerie native all'avvio, e insieme di proprietà di sistema "sqlite4java.library.path" in fase di esecuzione. Si prega di consultare il seguente codice di esempio:

/** 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(); 
} 

Ora la vostra applicazione dovrebbe essere edificabile con lo standard descrittore "vaso-con-le dipendenze", e la vostra applicazione è eseguibile con lo standard "java-jar your_jar.jar" comando.

Ovviamente, se sqlite4java riceve aggiornamenti in futuro, è necessario aggiornare manualmente le librerie native nella directory delle risorse.

Se si dispone di una soluzione migliore, meno sporca, per favore fatemelo sapere!

+0

Se hai votato, per favore suggeriscimi una soluzione migliore e/o cosa ne pensi, così posso rivedere questo post. – NullNoname

Problemi correlati