Включение выходных данных сборки проекта в файл JAR и путь к библиотеке времени выполнения - PullRequest
0 голосов
/ 18 января 2019

У меня есть приложение Java, которое использует JNI, и я использую gradle для создания разделяемой библиотеки C ++, содержащей код, который я загружаю как часть JNI. Сборка C ++ является подпроектом корневой сборки. Я могу поставить зависимость на :jnisubproject:assembleRelease от задач run или jar моего корневого проекта, который создает общую библиотеку (на jnisubproject/build/lib/main/release/libjnisubproject.so), но не добавляет эту общую библиотеку в мой файл JAR, ни это настраивает мой путь к библиотеке Java, чтобы иметь возможность доступа к общему объекту во время выполнения. С помощью некоторых хакеров (явно изменив системное свойство java.library.path в моей задаче запуска), я могу заставить его работать, когда использую gradle run, но я хотел бы иметь возможность создать JAR-файл для перераспределения.

Я попытался добавить подпроект как зависимость времени выполнения, добавив

dependencies {
    runtime project(":jnisubproject")
    // runtime ":jnisubproject:assembleRelease" also doesn't work
}

к зависимостям моего корневого проекта, но этого недостаточно для получения gradle jar для создания подпроекта или для включения его файлов в JAR; это на самом деле, кажется, ничего не делает. Если я добавлю явную зависимость в задачу JAR, например:

jar {
    dependsOn ":jnisubproject:assembleRelease"
}

он создаст мой подпроект при запуске gradle jar, но неудивительно, что разделяемая библиотека не попадает в JAR. Последнее, что я попробовал, был приведенный выше фрагмент с явной зависимостью в дополнение к добавлению зависимости файла в выходной каталог:

dependencies {
    runtime files('jnisubproject/build/lib/main/release/*')    
}

но это и то, и другое кажется невероятным и не работает, потрясающая комбинация. Если я явно включаю встроенные файлы в JAR, выполнив

jar {
    include 'jnisubproject/build/lib/main/release/*'
}

Тогда мой JAR-файл оказывается полностью пустым, кроме манифеста.

Короче говоря, моя проблема заключается в следующем:

  • У меня есть подпроект, который создает общую библиотеку
  • Я хочу, чтобы корневой проект (проект Java) выражал зависимость от этой общей библиотеки.
  • Я хочу, чтобы эта зависимость добавляла общую библиотеку в java.library.path и в мой выходной JAR-файл.

Есть идеи?

1 Ответ

0 голосов
/ 22 января 2019

Попробуйте это в своем корневом проекте:

processResources {
    from project(':jnisubproject').buildDir + '/lib/main/release/*'
}

В основной задаче processResources будет указано включение вашей библиотеки.

Что касается дополнения java.library.path, я не думаю, что можно напрямую связать библиотеку из Jar-файла. Больше информации здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...