2012-08-30 12 views
5

Obecnie próbuję zbudować mój projekt z maven i sqlite4java. Który jest dostępny w oficjalnych repozytoriach maven. Oficjalna sqlite4java page on google code ma przykładową konfigurację, ale jest nieco przestarzała i nie odpowiada moim potrzebom. Chcę mieć pojedynczy plik .jar w końcu, który mogę wdrożyć w innym miejscu. Problemem jest tu depedencja współdzielonego obiektu. Używam oficjalny cel kompilacji z ich strony, aby skopiować więc do build.dir/lib, ale moi montażowe awarii bramki:W tym obiekt współdzielony w zespole 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'. 

Co robię źle? Oto mój obecny pom.xml usunięte z pewnych zależnościach niezwiązane z tym tematem

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

Odpowiedz

1

Edit:

myślę, że deskryptor słoik z zależnościami-montaż próbuje rozpakować zależności.

Patrz link:

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

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

<unpack>true</unpack> 

I oczywiście to nie trafia do wypakowania .so

Może być konieczne użycie niestandardowego zespołu, aby wykonać to, co chcesz zrobić,

+0

-rw-rw-r-- 1 LHW LHW 716K 30 sierpnia 12:23 .m2/repozytorium/pl/almworks/sqlite4java/libsqlite4java-Linux-i386/0,282/libsqlite4java-linux-i386-0.282.so Tak, plik istnieje i jest kopiowany do miejsca docelowego/lib podczas wykonywania celu kompilacji. – lhw

+0

W jaki sposób zainstalowałeś/wdrożyć "tak" na repo? Instalacja mvn clean: install-file? Czy masz pom dla tej zainstalowanej zależności? Jeśli tak, czy ustawiłeś typ i opakowanie zależności na "tak"? Możesz spróbować zainstalować z mvn clean install: install-file -Dpackaging = so –

+0

libsqlite4java-linux-i386 Jest zależnością typu współdzielonego obiektu, która jest typem, tak jak widać abvoe. Jest automatycznie pobierany do lokalnego repozytorium. sqlite4java jest dostępna w standardowych repozytoriach maven, jeśli chcesz ją wypróbować samodzielnie. – lhw

0

Możliwe jest utworzenie pliku wykonywalnego ze słownym deskryptorem montażowym "jar-with-dependencies" i bez użycia skryptów startowych/skryptów startowych. Wymaga to jednak brudnych rozwiązań, które nie wymagają wielu konfiguracji Mavena.

  1. Musimy umieścić wszystkie rodzime biblioteki (included in sqlite4java zip download) do src/main/resources katalogowych. Usuń również zależność biblioteki natywnej sqlite4java z pliku Maven POM.
  2. Bo rodzimy ładowarka biblioteka sqlite4java nie wygląda na ścieżce klas lub wewnątrz pliku JAR, trzeba ekstrakt natywnych bibliotek przy starcie i zestaw „sqlite4java.library.path” właściwość systemu przy starcie. Zobacz następujący przykładowy kod:

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

Teraz aplikacja powinna być buildable ze standardowym „Jar-z zależnościami” deskryptora, a aplikacja jest runnable ze standardowym „java -jar your_jar.jar” dowództwo.

Oczywiście, jeśli sqlite4java otrzyma aktualizacje w przyszłości, należy ręcznie zaktualizować biblioteki natywne w katalogu zasobów.

Jeśli masz lepsze, mniej brudne rozwiązanie, daj nam znać!

+0

Jeśli zagłosujesz na to, proszę zaproponuj mi lepsze rozwiązanie i/lub co o tym myślisz, więc mogę poprawić ten post. – NullNoname

Powiązane problemy