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

2022-09-04 21:23:25

我正在使用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:我能够通过手动将maven缓存中下载的代码复制到我的某个地方(认为我在Mac上使用过)来运行代码。但这似乎与将所有设置和依赖项打包在文件中的全部意义背道而驰,并且不会让我以后轻松分发任何内容。.dylibjava.library.path$HOME/Library/Java/Extensions.gradle


答案 1

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

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

编辑:在你的情况下,插件的问题在于,你的依赖性“com.almworks.sqlite4java:libsqlite4java-osx:1.0.392”本身就是原生lib,而不是像我想象的那样包含原生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任务属性relaseOn和thournRunAfter使此任务自动运行。


答案 2

这是基于斯坦尼斯拉夫评论的完整答案。

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

推荐