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

标签 java gradle sqlite4java

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

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

这是我的 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 做正确的事情?

旁白:我可以通过手动将下载的 .dylib 从 Maven 缓存复制到我的 java 中列出的某个位置来运行代码。 library.path(假设我在我的 mac 上使用了 $HOME/Library/Java/Extensions)。但这似乎与将所有设置和依赖项打包在 .gradle 文件中的整个要点背道而驰,并且不会让我以后轻松分发任何东西。

最佳答案

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

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

编辑: 在您的情况下,插件的问题在于,您的 dependecny "com.almworks.sqlite4java:libsqlite4java-osx:1.0.392"本身就是 native 库,而不是我认为的包含 native 库的 jar。因此,在那种情况下,您可以简单地将此依赖项添加到构建脚本的 dependencies par 中,因为它已经完成,然后创建一个自定义复制任务,将其放在您需要的任何位置。尝试在 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 让这个任务自动运行。

关于java - 如何设置一个使用 sqlite4java 的简单 gradle 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32364999/

相关文章:

gradle - 可以在sonarqube gradle插件中覆盖sonar.modules吗?

eclipse - 如何让 Gradle 为 Eclipse 生成 java.library.path

java - 检查 Cookie 状态并限制用户不浏览 Web 应用程序 - 如何操作?

java - 如何将一个spring项目包含到另一个spring项目中

java - 如何开发安卓锁屏的替代品

java - 枚举包装器中的类型安全

android - android:使用Google Analytics(分析)后非零退出值2

java - 尝试访问 jar 文件中的资源时出现异常