2012-08-30 13 views
5

Şu anda projemi maven ve sqlite4java ile oluşturmaya çalışıyorum. Hangi resmi maven depolarında mevcuttur. Resmi olmayan sqlite4java page on google code bir örnek yapılandırmasına sahiptir, ancak biraz modası geçmiş ve gereksinimlerime uymuyor. Sonunda başka bir yere dağıtabileceğim tek bir .jar dosyasına sahip olmak istiyorum. Sorun, paylaşılan nesne bağımlılığıdır.Paylaşılan nesneyi maven derlemesine dahil

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

Ben ne yapıyorum yanlış: build.dir/lib ama benim montaj hedefi çöker için bu yüzden kopyalamak için kendi sayfasından resmi inşa golü kullanıyorum? İşte bazı bağımlılıkları çıkartılır benim şimdiki pom.xml ilgisiz bu konuya olan

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

cevap

1

Düzenleme:

Ben kavanoz-ile-bağımlılıkları montaj açıklayıcısı bağımlılıkları açmak çalışır düşünüyorum.

bağlantısına bakın:

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

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

<unpack>true</unpack> 

Ve tabii açmak için başarısız

.so

Ne yapmak istediğinizi gerçekleştirmek için özel bir derleme kullanmanız gerekebilir

+0

-rw-rw-r-- 1 avantaj sağlayabilir avantaj sağlayabilir 716k 30 Ağustos 00:23 .m2/depo/com/almworks/sqlite4java/libsqlite4java-linux-i386/0.282/libsqlite4java-linux-i386-0.282.so Evet, dosya mevcut ve derleme hedefi yürütüldüğünde hedef/lib'a kopyalanır. – lhw

+0

Repo'ya 'nasıl' kurdunuz/dağıtdınız? mvn clean install: install-file? Bu yüklü bağımlılık için bir pom var mı? Evet ise, bağımlılığın türünü ve paketini 'öyle' olarak ayarladınız mı? mvn temiz yüklemeyle yüklemeyi deneyebilirsiniz: install-file -Dpackaging = öyleyse –

+0

libsqlite4java-linux-i386 Paylaşılan nesne bağımlılığı, abvo görebildiğiniz şekilde yazılmıştır. Yerel depoya otomatik olarak indirilir. Eğer bunu denemek istiyorsanız sqlite4java standart maven depolarında mevcuttur. – lhw

0

Stokta "jar-with-dependencies" derleme tanıtıcısıyla ve herhangi bir başlangıç ​​kabuk/toplu komut dosyası kullanmadan yürütülebilir bir jar oluşturmak mümkündür. Ancak, çok fazla Maven yapılandırması içermeyen kirli çözümler gerektirir.

  1. Hepimiz yerel kütüphaneleri (included in sqlite4java zip download)için src// ana kaynaklar dizin yerleştirmek gerekir. Ayrıca Maven POM dosyanızdan sqlite4java yerel kütüphane bağımlılığını kaldırın.
  2. sqlite4java doğal kütüphane yükleyici Sınıfyolu veya JAR dosyasının içinde görünmüyor Çünkü
  3. , başlangıçta de özü yerli kütüphaneleri zorunda ve zamanında de seti "sqlite4java.library.path" sistem özelliği. Aşağıdaki örnek kodu bakın:

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

Artık, uygulama standart "Kavanoz-ile-bağımlılıkları" tanımlayıcısı ile buildable olmalı ve uygulama "jar your_jar.jar java" standart ile çalıştırılabilir olduğunu komut.

Elbette, eğer sqlite4java güncellemeleri gelecekte alırsa, kaynak dizininizdeki yerel kitaplıkları el ile güncellemeniz gerekir.

Daha iyi, daha az kirli bir çözüme sahipseniz, lütfen bana bildirin!

+0

Oy verirseniz, lütfen bana daha iyi bir çözüm ve/veya bunun hakkında ne düşündüğünüzü önerin, bu yüzden bu yazıyı gözden geçirebilirim. – NullNoname