Создайте банку с двоичными файлами только для необходимой платформы (javacpp)

Я хочу создать толстую банку для tesseract. Со следующими настройками сборки я получаю jar около 68 МБ с зависимостями для всех поддерживаемых платформ:

dependencies {
    implementation group: 'org.bytedeco', name: 'tesseract-platform', version: '4.1.1-1.5.3'
}
jar {
    manifest { attributes 'Main-Class': 'BasicExample' }
    from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}

Чтобы уменьшить этот размер, я попытался включить зависимости только для своей платформы в соответствии с это руководство - но безуспешно, см. также это SO question и ответ @Samuel Audet на него (я хочу придерживаться gradle). Поэтому я решил вручную включить только необходимые зависимости из файл POM:

dependencies {
    implementation group: 'org.bytedeco', name: 'tesseract', version: '4.1.1-1.5.3'
    implementation group: 'org.bytedeco', name: 'tesseract', version: '4.1.1-1.5.3', classifier: 'windows-x86_64'
    implementation group: 'org.bytedeco', name: 'leptonica', version: '1.79.0-1.5.3', classifier: 'windows-x86_64'
}

Это уменьшает размер jar примерно до 7 МБ и работает нормально (по крайней мере, для основной пример). Тем не менее я получаю предупреждения:

Warning: Could not load ...: java.lang.UnsatisfiedLinkError: no jnijavacpp in java.library.path: ...

Сравнив две банки, я обнаружил, что в маленькой банке отсутствует путь lib со всеми библиотеками so вместе с файлами заголовков, cmake и pkgconfig, и я предполагаю, что это является причиной предупреждений.

Итак, мои вопросы:

  1. Если эти файлы видимо не нужны для запуска jar, то почему они включаются нормально?
  2. Как я могу предотвратить эти предупреждения, сохраняя при этом небольшой размер банки?

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


person Stef    schedule 15.05.2020    source источник


Ответы (1)


Мне придется немного обновить это руководство, спасибо за сообщение! Теперь нам также нужен javacpp-platform, что даст нам что-то вроде этого для windows-x86_64 в этом случае:

dependencies {
    implementation group: 'org.bytedeco', name: 'tesseract', version: '4.1.1-1.5.3'
    implementation group: 'org.bytedeco', name: 'tesseract', version: '4.1.1-1.5.3', classifier: 'windows-x86_64'
    implementation group: 'org.bytedeco', name: 'leptonica', version: '1.79.0-1.5.3', classifier: 'windows-x86_64'
    implementation group: 'org.bytedeco', name: 'javacpp', version: '1.5.3', classifier: 'windows-x86_64'
}

Это необходимо для устранения некоторых проблем во время загрузки, как описано в этом выпуске:
https://github.com/bytedeco/javacv/issues/1305

ОБНОВЛЕНИЕ: теперь можно использовать Gradle JavaCPP, чтобы сделать это проще:

plugins {
    id 'java-library'
    id 'org.bytedeco.gradle-javacpp-platform' version "$javacppVersion"
}

// We can set this on the command line too this way: -PjavacppPlatform=linux-x86_64,macosx-x86_64,windows-x86_64,etc
ext {
    javacppPlatform = 'linux-x86_64,macosx-x86_64,windows-x86_64,etc' // defaults to Loader.getPlatform()
}

dependencies {
    api "org.bytedeco:tesseract-platform:$tesseractVersion"
}
person Samuel Audet    schedule 15.05.2020
comment