Как я могу создать простой проект gradle, который использует sqlite4java?
Я запускаю простой тестовый проект java с использованием sqlite4java и с использованием 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 заполняет путь класса при запуске тестов...)
Я уверен, что в первый раз, когда я попытался построить, у меня появилось сообщение о том, что вы не можете распаковать ZIP файл libsqlite4java-osx (не удивительно, поскольку maven central говорит о своем файле dylib).
Что мне нужно сделать, чтобы сделать gradle правильной?
ASIDE. Я могу получить код для запуска, вручную скопировав загруженный .dylib
из кэша maven в место, указанное в моем java.library.path
(думаю, я использовал $HOME/Library/Java/Extensions
on мой mac). Но это, по-видимому, противоречит целям упаковки всех настроек и зависимостей в файле .gradle
и не позволит мне распространять что-либо легко позже.
Ответы
Ответ 1
Здесь полный ответ, основанный на комментарии Станислава.
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
Я полагаю, вам нужно использовать дополнительный плагин gradle для обработки собственных библиотек или создания собственных конкретных задач, для загрузки и размещения собственных библиотек в нужном месте, чтобы их можно было найти и связать.
На данный момент я знаю только один такой плагин, надеюсь, что он сможет решить вашу проблему https://github.com/cjstehno/gradle-natives
Edit:
Проблема с плагином в вашем случае заключается в том, что ваш зависимый "com.almworks.sqlite4java: libsqlite4java-osx: 1.0.392" - это собственный lib сам по себе, а не банка с включенным встроенным lib, как я предполагал. Таким образом, в этом случае вы можете просто добавить эту зависимость в пар зависимостей build script, как это уже сделано, а затем создать специальную задачу копирования, чтобы поместить ее в нужное место. Пытался сделать это с помощью gradle 2.6 на Win7, выглядите так:
task copyNtiveDeps(type: Copy) {
from (configurations.compile+configurations.testCompile) {
include "libsqlite4java-osx-1.0.392.dylib"
}
into "c:\\tmp"
}
В вашем случае вам просто нужно установить свойство "в" для некоторого пути из java.library.path. А во-вторых, вы можете сделать эту задачу автоматизированной с gradle свойствами задачи dependOn и mustRunAfter.