Подтвердить что ты не робот

Как я могу создать простой проект 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 и не позволит мне распространять что-либо легко позже.

4b9b3361

Ответ 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.