Mic*_*son 13 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"
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行一个简单的测试时,我得到:
TestTest > testSqlite4Basic FAILED
com.almworks.sqlite4java.SQLiteException at TestTest.java:15
Caused by: java.lang.UnsatisfiedLinkError at TestTest.java:15
Run Code Online (Sandbox Code Playgroud)
(我在IntelliJ中构建,但是使用了gradle构建选项 - 所以我不认为ItelliJ在运行测试时会填充类路径......)
我很确定我第一次尝试构建时得到了一些关于无法解压缩libsqlite4java-osx ZIP文件的消息,(毫不奇怪,maven central称其为dylib文件).
我需要做些什么来让gradle做正确的事情?
ASIDE:我能够通过手动将下载.dylib的maven缓存复制到我所在的地方java.library.path(想想我$HOME/Library/Java/Extensions在我的Mac上使用)来运行代码.但这似乎与包装.gradle文件中所有设置和依赖关系的整个方面相悖,并且不会让我稍后轻易分发任何内容.
我想,您需要使用额外的gradle插件来处理本机库或制定您自己的特定任务,以便将原生库上传并放置在正确的位置,以便找到并链接它们.
目前我只知道一个这样的插件,希望它可以解决你的问题https://github.com/cjstehno/gradle-natives
编辑: 在您的情况下插件的问题是这样的事实,您的dependecny"com.almworks.sqlite4java:libsqlite4java-osx:1.0.392"本身就是本机库,而不是像我想的那样包含本机库的jar.因此,在这种情况下,您可以简单地在构建脚本的依赖项中添加此依赖项,因为它已经完成,然后创建自定义复制任务,将其放在您需要的任何位置.试图用Win7上的gradle 2.6来做,看起来像:
task copyNtiveDeps(type: Copy) {
from (configurations.compile+configurations.testCompile) {
include "libsqlite4java-osx-1.0.392.dylib"
}
into "c:\\tmp"
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您只需要将"into"属性设置为java.library.path中的某个路径.第二,您可以使用gradle任务属性dependsOn和mustRunAfter自动运行此任务.
这是基于斯坦尼斯拉夫的评论的完整答案.
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'
}
Run Code Online (Sandbox Code Playgroud)
并运行示例测试源:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3873 次 |
| 最近记录: |