如何设置使用sqlite4java的简单gradle项目?

时间:2015-09-02 23:58:45

标签: java gradle sqlite4java

我正在使用sqlite4java开始一个简单的java测试项目并使用java构建。

我可以轻松下载核心sqlite4java库,但我不确定最好的(任何!)方式可以让gradle下载本地库并将它们放在正确的位置。

这是我的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构建选项 - 所以我认为在运行测试时ItelliJ不会填充类路径...)

我非常肯定我第一次尝试构建时得到了一些关于无法解压缩libsqlite4java-osx ZIP文件的消息,(毫不奇怪,maven central称其为dylib文件)。

我需要做些什么来让gradle做正确的事?

ASIDE :我可以通过手动将已下载的.dylib从maven缓存复制到我的java.library.path中列出的位置来运行代码(想想我用过我的mac上$HOME/Library/Java/Extensions。但这似乎与在.gradle文件中打包所有设置和依赖关系的整个观点相悖,并且不会让我稍后轻易分发任何内容。

4 个答案:

答案 0 :(得分:6)

我想,您需要使用额外的gradle插件来处理本机库或制作您自己的特定任务,以便将原生库上传并放置在正确的位置,以便找到并链接它们。

目前我只知道一个这样的插件,希望它能解决你的问题https://github.com/cjstehno/gradle-natives

修改 在您的情况下插件的问题是,您的dependecny“com.almworks.sqlite4java:libsqlite4java-osx:1.0.392”本身就是本机lib,而不是像我想的那样包含本机库的jar。因此,在这种情况下,您可以简单地在构建脚本的依赖项中添加此依赖项,因为它已经完成,然后创建自定义复制任务,将其放在您需要的任何位置。尝试使用Win7上的gradle 2.6来执行此操作,如下所示:

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

在您的情况下,您只需要将“into”属性设置为java.library.path中的某个路径。第二,您可以使用gradle任务属性dependsOn和mustRunAfter自动运行此任务。

答案 1 :(得分:5)

根据斯坦尼斯拉夫的评论,这是一个完整的答案。

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

答案 2 :(得分:0)

我使用这种方法在anroid studio 3.1.4中设置sqlite4java。

首先从此链接下载库: https://bitbucket.org/almworks/sqlite4java

下载内容将包含一个zip文件,其中包含一个名为android的文件夹以及其他.jar,.so和.dll文件。

将android中的三个文件夹(即“ armeabi”,“ armeabi-v7a”和“ x86”)复制到名为“ jniLibs”的文件夹中。

将上述文件夹“ jniLibs”复制到yourproject / app / src / main /文件夹中。

然后实现java4sqlite的gradle依赖项:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "your.project.name"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}




dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.readystatesoftware.sqliteasset:sqliteassethelper:2.0.1'
    implementation "com.almworks.sqlite4java:sqlite4java:1.0.392"
    implementation "com.almworks.sqlite4java:libsqlite4java-osx:1.0.392"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'


}

答案 3 :(得分:0)

要编译自己的sqlite3库,可以检查weekday

对于当前的Android Studio(3.3.1),您只需在.so内添加app/build.gradle文件,如下所示:

android {
    ...

    sourceSets {
        main {
            jniLibs.srcDirs += ['<your-path>/your-libs']
        }
    }

    ...
}

说明

jniLibs.srcDirs是指向jni库的gradle路径,运算符 += 表示 其他 jni库以及app/src/main/jniLibs中的默认值如下:

app/
├──libs/
|  └── *.jar           <-- java libs
├──src/
   └── main/
       ├── AndroidManifest.xml
       ├── java/
       └── jniLibs/    <-- default directory for jni libs, i.e. <ANDROID_ABI>/**.so

请注意,jni库必须根据android ABI进行组织,即

your-libs/
├── arm64-v8a/                       <-- ARM 64bit
│   └── lib-your-abc.so
├── armeabi-v7a/                     <-- ARM 32bit
│   └── lib-your-abc.so
├── x86_64/                          <-- Intel 64bit
│   └── lib-your-abc.so
└── x86/                             <-- Intel 32bit
    └── lib-your-abc.so