2015-09-02 11 views
13

sqlite4java kullanarak ve java kullanarak bina basit bir java test projesine başlıyorum.sqlite4java'yı kullanan basit bir projeyi nasıl kurabilirim?

Çekirdek sqlite4java kütüphanesini kolayca indirebilirim, ancak yerel kütüphaneleri indirmek ve doğru yere yerleştirmek için en iyi (herhangi bir!) Yolun ne olduğundan emin değilim.

Bu

benim build.gradle dosyasıdır:

apply plugin: 'java' 

/* We use Java 1.7 */ 
sourceCompatibility = 1.7 
targetCompatibility = 1.7 
version = '1.0' 

repositories { 
    mavenCentral() 
} 

sourceSets { 
    main { 
     java.srcDir 'src' 
     output.classesDir = 'build/main' 
    } 
    test { 
     java.srcDir 'test' 
     output.classesDir = 'build/test' 
    } 
} 


dependencies { 
    testCompile group: 'junit', name: 'junit', version: '4.11' 
    compile "com.almworks.sqlite4java:sqlite4java:1.0.392" 
    compile "com.almworks.sqlite4java:libsqlite4java-osx:1.0.392" 
} 

Ama basit bir test çalıştırdığınızda alıyorum:

TestTest > testSqlite4Basic FAILED 
    com.almworks.sqlite4java.SQLiteException at TestTest.java:15 
     Caused by: java.lang.UnsatisfiedLinkError at TestTest.java:15 

(I IntelliJ içinden inşa ediyorum, ama gradle kullanıyorum seçenekleri oluşturmak - bu yüzden test çalıştırırken ItelliJ sınıf yolunu dolduran olduğunu sanmıyorum ...)

İnşa etmeye çalıştığım ilk seferde, " e libsqlite4java-osx ZIP dosyası, (şaşırtıcı bir şekilde maven merkezi bir dylib dosyasının olduğunu söylüyor).

Doğru şeyi yapmak için ne yapmam gerekiyor?

KENARA: yere benim java.library.path listelenen içine ben (benim mac $HOME/Library/Java/Extensions kullandık mı) elle maven önbellekten indirilen .dylib kopyalayarak çalıştırmak için kodu almak mümkün. Ancak bu, tüm kurulum ve bağımlılıkları .gradle dosyasındaki tüm paketleme koşullarına aykırı ve daha sonra kolayca bir şey dağıtmama izin vermiyor.

+0

görünüyor - https://github.com/nhachicha/android-native-dependencies Ancak bu OS-X'i desteklemiyor gibi görünüyor. Ve bunu kullanmanın başka bir sorun olup olmadığını bilmiyorum. –

+0

Üzgünüz, sorunu hemen çözemiyorum, ancak bunun yalnız olmadığınızı ve bunu sqlite özgü değil https://discuss.gradle.org/t/how-can-i-add-a -dylib-to-a-project-dependenies/3115 –

+0

http://stackoverflow.com/questions/29437888/using-gradle-with-native-dependencies de alakalı görünüyor –

cevap

4

İşte Stanislav'un ​​yorumlarına dayanan eksiksiz bir cevap.

apply plugin: 'java' 

/* We use Java 1.8 */ 
sourceCompatibility = 1.8 
targetCompatibility = 1.8 
version = '1.0' 

repositories { mavenCentral() } 

dependencies { 
    testCompile group: 'junit', name: 'junit', version: '4.11' 
    compile "com.almworks.sqlite4java:sqlite4java:1.0.392" 
    compile "com.almworks.sqlite4java:libsqlite4java-osx:1.0.392" 
} 

sourceSets { 
    main { 
     java.srcDir 'src' 
     output.classesDir = 'build/main' 
    } 
    test { 
     java.srcDir 'test' 
     output.classesDir = 'build/test' 
    } 
} 

/* Copy the native files */ 
task copyNativeDeps(type: Copy) { 
    from (configurations.compile+configurations.testCompile) { 
     include "*.dylib" 
    } 
    into 'build/libs' 
} 

/* Make sure we setup the tests to actually copy 
* the native files and set the paths correctly. */ 
test { 
    dependsOn copyNativeDeps 
    systemProperty "java.library.path", 'build/libs' 
} 

Ve örnek testi kaynak Kaçmak için:

neredeyse android gradle için bunu yapar bir şey gibi
import com.almworks.sqlite4java.SQLiteConnection; 
import com.almworks.sqlite4java.SQLiteStatement; 
import org.junit.Test; 

import java.io.File; 

public class SqliteTest { 

    @Test public void aTest() throws Exception { 
     SQLiteConnection db = new SQLiteConnection(new File("/tmp/database")); 
     db.open(true); 

     SQLiteStatement st = db.prepare("SELECT name FROM dummy"); 
     try { 
      while(st.step()) { 
       System.err.printf("name = %s\n", st.columnString(1)); 
      } 
     } finally { 
      st.dispose(); 
     } 
    } 
} 
6

Sanırım, yerel kütüphaneleri işlemek veya kendi özel görevlerinizi yapmak, yerel kütüphaneleri doğru yere yerleştirmek ve yerleştirmek için ek yer değiştirme eklentisi kullanmanız gerekir. senin durumunda eklenti ile sorun gerçektir , bu senin dependecny "com.almworks: Ben sadece yaklaşık böyle bir eklenti biliyor anda

, bu sorununuzu https://github.com/cjstehno/gradle-natives

Düzenleme çözebilir umut .sqlite4java: libsqlite4java-osx: 1.0.392 "kendiliginden yerli libstur, varsayilan olarak dahil ettigi yerel lib ile bir jar degildir. Yani, bu durumda, bu bağımlılığı, zaten yaptığınız gibi, yapı betiğinin bağımlılıkları için ekleyebilir ve sonra istediğiniz yere koymak için özel bir kopyalama görevi oluşturabilirsiniz. Senin durumunda

task copyNtiveDeps(type: Copy) { 
    from (configurations.compile+configurations.testCompile) { 
    include "libsqlite4java-osx-1.0.392.dylib" 
    } 
    into "c:\\tmp" 
} 

, sadece java.library.path bazı yola mülkiyet "içine" ayarlamanız gerekir: gibi Win7 üzerinde gradle 2.6 ile yapmak çalıştı, bak. Ve ikincisi, bu görevi kademeli görev özellikleri dependsOn ve mustRunAfter ile otomatik olarak çalıştırabilirsiniz.

+0

Bu eklenti aslında kütüphaneleri çekmiyor gibi görünüyor maven'den aşağı, onları zaten yüklü ve sınıf yolunda gerektirir. Ayrıca eklentiyi indirip kurmanız ve yerel bir mavna önbelleğine koymanız gerekiyor - bu kadar basit bir görev için çok iş gibi görünüyor. –

+0

Bunun için neden eklentinin sizin için bir karar olmadığını buldum, bu yüzden cevabımda bazı değişiklikler yaptım. Herhangi bir maven bağımlılığını, ihtiyacınız olan herhangi bir yola elle kopyalayabilirsiniz. – Stanislav

+0

Eklentinin kendisi için. Bağımlılık çekmez, normal bir şekilde yapılmalıdır, sadece bu bağımlılıklardan yerli libleri çıkarır. Ve bu eklenti wotk'u bir gradyanın içine yerleştirmek için herhangi bir ek çalışma yapmaya gerek yoktur, sadece buradscript bağımlılığı eklemek ve – Stanislav

İlgili konular