2015-09-02 15 views
13

मैं जावा का उपयोग कर sqlite4java और इमारत का उपयोग कर एक साधारण जावा परीक्षण प्रोजेक्ट शुरू कर रहा हूं।मैं एक सरल ग्रेडल प्रोजेक्ट कैसे स्थापित कर सकता हूं जो sqlite4java का उपयोग करता है?

मैं कोर sqlite4java लाइब्रेरी आसानी से डाउनलोड कर सकता हूं, लेकिन मुझे यकीन नहीं है कि मूल पुस्तकालयों को डाउनलोड करने और उन्हें सही जगह पर रखने के लिए सबसे अच्छा (कोई भी!) तरीका क्या है।

यह मेरा build.gradle फ़ाइल है:

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" 
} 

लेकिन जब मैं एक साधारण परीक्षण चलाने मैं:

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

(मैं IntelliJ के भीतर से निर्माण कर रहा हूँ, लेकिन Gradle उपयोग कर रहा हूँ बिल्ड विकल्प - इसलिए मुझे नहीं लगता कि यह परीक्षण चलाने पर कक्षा पथ को भरने वाला इटेलिज़ है ...)

मुझे यकीन है कि पहली बार मैंने निर्माण करने की कोशिश की, मुझे कुछ अनदेखा करने में असमर्थ होने के बारे में कुछ संदेश मिला e libsqlite4java-osx ज़िप फ़ाइल, (आश्चर्य की बात नहीं है क्योंकि मैवेन सेंट्रल इसकी एक डाइलिब फ़ाइल कहता है)।

धीरे-धीरे सही काम करने के लिए मुझे क्या करने की ज़रूरत है?

एएसआईडीई: मैं में कहीं न कहीं मेरे java.library.path में सूचीबद्ध मैन्युअल Maven कैश से डाउनलोड .dylib को कॉपी करके चलाने के लिए कोड प्राप्त करने में सक्षम हूँ (थिंक आई पर अपने मैक $HOME/Library/Java/Extensions प्रयुक्त)। लेकिन यह .gradle फ़ाइल में सभी सेटअप और निर्भरताओं को पैकेजिंग के पूरे बिंदु के विपरीत लगता है, और मुझे बाद में आसानी से कुछ वितरित करने नहीं देगा।

+0

ऐसा लगता है कि कुछ है कि लगभग एंड्रॉयड Gradle के लिए इस करता है जैसे - https://github.com/nhachicha/android-native-dependencies लेकिन यह ओएस-एक्स का समर्थन नहीं करता है। और मुझे यकीन नहीं है कि ग्रेडल के एंड्रॉइड संस्करण के बाहर इसका उपयोग करने में अन्य समस्याएं हैं या नहीं। –

+0

क्षमा करें मैं तुरंत समस्या का समाधान नहीं कर सकता, लेकिन मुझे यह पता चला कि यह इंगित करता है कि आप अकेले नहीं हैं और यह विशिष्ट नहीं है https://discuss.gradle.org/t/how-can-i-add-a -डिलीब-टू-ए-प्रोजेक्ट-निर्भरता/3115 –

+0

http://stackoverflow.com/questions/29437888/using-gradle-with-native- निर्भरता भी प्रासंगिक दिखती है –

उत्तर

4

स्टैनिस्लाव की टिप्पणियों के आधार पर यहां एक पूर्ण उत्तर दिया गया है।

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' 
} 

और उदाहरण परीक्षण स्रोत इसके लिए चलाने के लिए:

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

मुझे लगता है कि आपको मूल पुस्तकालयों को संभालने के लिए अतिरिक्त ग्रेडल प्लगइन का उपयोग करने या अपने विशिष्ट कार्य करने, सही जगह पर देशी libs को अपलोड करने और रखने के लिए, उन्हें ढूंढने और लिंक करने के लिए उपयोग करने की आवश्यकता है।

पल मैं केवल बारे में ऐसे ही एक एक प्लगइन पता पर, आशा है कि यह आपकी समस्या https://github.com/cjstehno/gradle-natives

संपादित हल कर सकते हैं: प्लगइन आपके मामले में के साथ समस्या यह तथ्य है, कि अपने dependecny "com.almworks .sqlite4java: libsqlite4java-osx: 1.0.392 "मूल रूप से मूल lib है, जैसा कि मैंने माना था मूल देशी lib के साथ एक जार नहीं। तो, उस स्थिति में, आप बस इस स्क्रिप्ट को बिल्ड स्क्रिप्ट के समान निर्भरताओं में जोड़ सकते हैं, जैसा कि पहले से ही किया गया है, और उसके बाद इसे किसी भी स्थान पर रखने के लिए कस्टम कॉपी कार्य बनाएं।

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

आपके मामले में, तुम सिर्फ संपत्ति "में" java.library.path से कुछ पथ के लिए निर्धारित करने की आवश्यकता: Gradle 2.6 Win7 पर साथ यह करने की कोशिश की, की तरह लग रहे। और दूसरा, आप यह कार्य स्वचालित रूप से धीरे-धीरे काम कर सकते हैं, धीरे-धीरे कार्य गुणों पर निर्भर करता है और अनिवार्य है।

+0

ऐसा लगता है कि प्लगइन वास्तव में पुस्तकालयों को खींच नहीं पाता है मेवेन से नीचे, यह उन्हें पहले से ही स्थापित किया जाना चाहिए और आपके वर्ग पथ में। इसके अलावा आपको प्लगइन को डाउनलोड और निर्माण करने और इसे स्थानीय मैवेन कैश में रखने की आवश्यकता है - ऐसा लगता है कि इस तरह के एक साधारण कार्य के लिए बहुत सारे काम हैं। –

+0

मुझे कारण मिला, प्लगइन आपके लिए क्यों निर्णय नहीं है, इसलिए मैंने अपने जवाब में कुछ बदलाव किए। आप किसी भी मेवेन निर्भरता को मैन्युअल रूप से किसी भी पथ पर कॉपी कर सकते हैं। – Stanislav

+0

प्लगइन के लिए ही। यह किसी भी निर्भरता को खींचता नहीं है, इसे सामान्य क्रमिक तरीके से किया जाना चाहिए, यह केवल उन निर्भरताओं से देशी libs निकालता है। और इस प्लगइन को एक ग्रेडल के अंदर बनाने के लिए कोई अतिरिक्त काम करने की आवश्यकता नहीं है, बस एक बिल्डस्क्रिप्ट निर्भरता जोड़ने के लिए और इसे लागू करें – Stanislav

संबंधित मुद्दे

 संबंधित मुद्दे