Не удалось загрузить собственную библиотеку libnative-platform.so для Linux amd64.

Во-первых, если это относится к Ask Ubuntu, мои извинения... Я не совсем уверен, к какому форуму это относится.

Я пытаюсь разветвить и создать проект Android из Github, используя PHP и сценарий оболочки. По сути, я распечатываю некоторый вывод из сценария оболочки, который я написал, на веб-сайт. Когда вы посещаете страницу и нажимаете несколько кнопок, проект разветвляется и строится с использованием Gradle. Код PHP запускает сценарий оболочки, а затем выводит вывод в браузер по мере выполнения команды.

Однако я получаю эту ошибку в качестве вывода моего скрипта:

FAILURE: Build failed with an exception.

* What went wrong:
Failed to load native library 'libnative-platform.so' for Linux amd64.

Сценарий пока просто работает gradle build, но я собираюсь изменить его позже... сейчас я просто работаю над созданием корневого проекта и выводом результата.

Вот результат, если я запускаю команду с флагом --stacktrace:

* Exception is:
net.rubygrapefruit.platform.NativeException: Failed to load native library 'libnative-platform.so' for Linux amd64.
    at net.rubygrapefruit.platform.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:49)
    at net.rubygrapefruit.platform.Native.init(Native.java:55)
    at org.gradle.internal.nativeintegration.services.NativeServices.initialize(NativeServices.java:74)
    at org.gradle.internal.nativeintegration.services.NativeServices.initialize(NativeServices.java:60)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:203)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
    at org.gradle.launcher.Main.doAction(Main.java:33)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:622)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
Caused by: java.io.IOException: No such file or directory
    at java.io.UnixFileSystem.createFileExclusively(Native Method)
    at java.io.File.createNewFile(File.java:959)
    at net.rubygrapefruit.platform.internal.NativeLibraryLocator.find(NativeLibraryLocator.java:39)
    at net.rubygrapefruit.platform.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:41)
    ... 16 more

А вот вывод с флагом --debug:

06:21:43.710 [ERROR] [org.gradle.BuildExceptionReporter] 
06:21:43.740 [ERROR] [org.gradle.BuildExceptionReporter] FAILURE: Build failed with an exception.
06:21:43.747 [ERROR] [org.gradle.BuildExceptionReporter] 
06:21:43.747 [ERROR] [org.gradle.BuildExceptionReporter] * What went wrong:
06:21:43.748 [ERROR] [org.gradle.BuildExceptionReporter] Failed to load native library 'libnative-platform.so' for Linux amd64.
06:21:43.749 [ERROR] [org.gradle.BuildExceptionReporter] 
06:21:43.750 [ERROR] [org.gradle.BuildExceptionReporter] * Exception is:
06:21:43.752 [ERROR] [org.gradle.BuildExceptionReporter] net.rubygrapefruit.platform.NativeException: Failed to load native library 'libnative-platform.so' for Linux amd64.
06:21:43.753 [ERROR] [org.gradle.BuildExceptionReporter]    at net.rubygrapefruit.platform.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:49)
06:21:43.753 [ERROR] [org.gradle.BuildExceptionReporter]    at net.rubygrapefruit.platform.Native.init(Native.java:55)
06:21:43.754 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.internal.nativeintegration.services.NativeServices.initialize(NativeServices.java:74)
06:21:43.754 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.internal.nativeintegration.services.NativeServices.initialize(NativeServices.java:60)
06:21:43.755 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:203)
06:21:43.756 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:169)
06:21:43.756 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
06:21:43.756 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
06:21:43.757 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.launcher.Main.doAction(Main.java:33)
06:21:43.758 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
06:21:43.759 [ERROR] [org.gradle.BuildExceptionReporter]    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
06:21:43.759 [ERROR] [org.gradle.BuildExceptionReporter]    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
06:21:43.760 [ERROR] [org.gradle.BuildExceptionReporter]    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
06:21:43.760 [ERROR] [org.gradle.BuildExceptionReporter]    at java.lang.reflect.Method.invoke(Method.java:622)
06:21:43.761 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:54)
06:21:43.761 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:35)
06:21:43.762 [ERROR] [org.gradle.BuildExceptionReporter]    at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
06:21:43.762 [ERROR] [org.gradle.BuildExceptionReporter] Caused by: java.io.IOException: No such file or directory
06:21:43.763 [ERROR] [org.gradle.BuildExceptionReporter]    at java.io.UnixFileSystem.createFileExclusively(Native Method)
06:21:43.763 [ERROR] [org.gradle.BuildExceptionReporter]    at java.io.File.createNewFile(File.java:959)
06:21:43.764 [ERROR] [org.gradle.BuildExceptionReporter]    at net.rubygrapefruit.platform.internal.NativeLibraryLocator.find(NativeLibraryLocator.java:39)
06:21:43.764 [ERROR] [org.gradle.BuildExceptionReporter]    at net.rubygrapefruit.platform.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:41)
06:21:43.765 [ERROR] [org.gradle.BuildExceptionReporter]    ... 16 more
06:21:43.765 [ERROR] [org.gradle.BuildExceptionReporter]

Я провел небольшое исследование по этому вопросу и нашел это сообщение на форуме, но это не дало мне никаких указаний относительно того, как решить проблему.

Дальнейшие исследования привели меня к проблеме с Github, которая, похоже, относится к NixOS, но я м под управлением Ubuntu 12.04 CLI. Кроме того, я должен упомянуть, что я также использую Gradle 2.10.

Я также пытался запустить gradle -Dorg.gradle.native=false build, но результат был таким же.

Теперь, что касается того, какой пользователь вызывает скрипт, я считаю, что это www-данные, поскольку я запускаю веб-сервер Apache2 и PHP.

Вот небольшой фрагмент кода PHP, который запускает скрипт, который я нашел в другом сообщении SO:

<?php
    $command = "sh /home/andrew/scripts/build.sh 2>&1";
    while (@ ob_end_flush()); // end all output buffers if any
    $proc = popen($command, 'r');
    echo '<pre style="border-radius: 5px; padding:4px; color:black; background:#ffffff" align="left">';
    while (!feof($proc)){
        echo fread($proc, 1024);
        @ flush();
    }
    echo '</pre>';
?>

Сейчас я в растерянности, поэтому я надеюсь, что кто-то может привести меня к новому надежному ответу.


person Andrew Quebe    schedule 22.07.2016    source источник
comment
если вы запустите этот скрипт из терминала /home/andrew/scripts/build.sh, он будет работать как положено?   -  person Pawel Dubiel    schedule 24.07.2016
comment
Ну, дело в том, что если я разветвляю репозиторий в своем домашнем каталоге, он работает так, как задумано. Но PHP-скрипт разветвляет его в веб-каталог, где скрипт запускает /var/www/public_html/script.php, а затем создает его.   -  person Andrew Quebe    schedule 24.07.2016
comment
Я ничего не знаю о Gradle, но сначала я бы проверил, видны ли все ожидаемые переменные среды при выполнении скрипта через PHP. например, GRADLE_USER_HOME и т.д.. .. А также будет дважды проверять, доступны ли для записи эти пути среды пользователю www-data.   -  person Pawel Dubiel    schedule 25.07.2016


Ответы (6)


Если сценарий разветвления и сборки работает нормально, когда он выполняется под вашей учетной записью в терминале, проблема, скорее всего, связана с переменными среды и правами доступа к файлам.

1 Возможно, путь, определенный в GRADLE_USER_HOME, недоступен для записи пользователю www-data. Чтобы изменить домашний каталог, вы можете выполнить gradle -g /path/writable/by-www-user непосредственно перед запуском скрипта сборки или использовать в PHP putenv() для изменения «GRADLE_USER_HOME».

Если вы измените GRADLE_USER_HOME, также переместите файлы, такие как gradle.properties, которые могут быть важны для вашей сборки.

2 Проверьте, может ли команда gradle выполняться с помощью www-data

sudo -u www-data `gradle --version`

Как проверить переменные среды для www-пользователя и для вашего пользователя:

вы можете использовать в терминале printenv для печати переменных среды. Например, для пользователя www-data это будет sudo -u www-data printenv, а для вашего пользователя просто printenv.

вы можете сохранить их в файлы и сравнить

sudo -u www-data printenv > wwwdata-env
printenv > my-env
diff --side-by-side --suppress-common-lines wwwdata-env my-env

Затем используйте метод PHP putenv() - чтобы установить все отсутствующие переменные, связанные с Gradle и проектом, который вы создаете.

person Pawel Dubiel    schedule 25.07.2016
comment
Я поэкспериментирую с этим ... спасибо за предложения, поскольку это не приходило мне в голову. - person Andrew Quebe; 25.07.2016
comment
@AndrewQuebe здесь похожая проблема, и она также не работает с неправильным пользователем discuss.gradle.org/t/ ... - person Pawel Dubiel; 25.07.2016
comment
Вызов gradle -g приводит к той же ошибке... даже если я вызываю это как пользователь, вошедший в систему через SSH. Вызов gradle --v как www-data также вызывает исключение, а вызов его как моего основного пользователя - нет. Он установлен изначально... Я не хотел использовать локальные обертки в проекте. /etc/environment не показывает признаков какой-либо переменной GRADLE_USER_HOME... должен ли я ее определить? - person Andrew Quebe; 25.07.2016
comment
Я думаю, не заглядывайте в /etc/environment, просто используйте printenv в терминале, если у вас есть переменная GRADLE_USER_HOME для вашего основного пользователя, тогда вы также должны определить ее для www-данных (с новым путем, доступным для записи www-data). Я попробую это неделю, чтобы установить gradle и воспроизвести вашу проблему с php. - person Pawel Dubiel; 25.07.2016
comment
Другая идея - запустить php-resque lib, добавить задание сборки в очередь и выполнить все из cron под своим пользователем. - person Pawel Dubiel; 25.07.2016
comment
@AndrewQuebe Я пробовал аналогичную среду, но не могу воспроизвести вашу проблему. Сборка через PHP работает нормально (Ubuntu 14.04.4 LTS), но я использую более старую версию Gradle 1.4. Также мой build.gradle очень прост и просто печатает привет, мир. Может попробовать добавить в build.sh файл cd в правильную директорию с проектом. - person Pawel Dubiel; 30.07.2016
comment
У меня 12.04, может поэтому. - person Andrew Quebe; 31.07.2016
comment
@AndrewQuebe Я не знаю. Чтобы избежать таких проблем, я обычно запускаю все на сервере с помощью Docker и docker-compose (это требует больше усилий для настройки, но впоследствии значительно экономит время). Поэтому я всегда запускаю практически одну и ту же конфигурацию в производстве и разработке без каких-либо неприятных сюрпризов в производстве (может быть, попробуйте запустить с помощью VirtualBox новую машину Ubuntu). Возможно, из-за этого моя сборка в build.gradle очень проста. - person Pawel Dubiel; 31.07.2016
comment
В основном я пытаюсь создавать приложения для Android с помощью PHP-кода, который будет выполняться для пользовательской базы. Мне нужно что-то, что я мог бы отслеживать сборки для проверки ошибок, но Gradle — это единственное, что компилирует приложения для Android. - person Andrew Quebe; 31.07.2016

Я решил это, переопределив переменную среды GRADLE_USER_HOME.

В файле ~/.bashrc добавьте следующую строку:

export GRADLE_USER_HOME=/home/www-data/.gradle

Где www-data — имя пользователя.

И перезапустите сеанс или выполните source ~/.bashrc, чтобы применить изменения.

person Estuardolh    schedule 31.07.2020

Я сталкиваюсь с этой проблемой, потому что ~/.gradle является неработающей символической ссылкой. Надеюсь, поможет.

person wukong    schedule 22.11.2019

Я использую gradle 3.0, и ему нужен каталог, указанный в параметре -g, чтобы иметь разрешение на выполнение. Когда мы получили эту ошибку, он не был исполняемым, и его выполнение решило проблему.

person user872858    schedule 13.01.2017

Для меня ответ @Pawel Dubiel не сработал, поэтому я обнаружил, что добавление «-g gradle-user-home» к команде Gradle решило проблему.

gradle build -g gradle-user-home
person Shahar Hamuzim Rajuan    schedule 07.08.2019

Либо вам не хватает переменной $GRADLE_HOME, либо отсутствует каталог, определенный в этой переменной. Убедитесь, что у вашего пользователя есть права на запись в этот каталог.

person Nedeljko Markovic    schedule 26.03.2021
comment
Спасибо за Ваш ответ. Но это дубликат ответов, которые уже были даны. - person shaedrich; 26.03.2021