- PVSM.RU - https://www.pvsm.ru -
Однажды меня посетила мысль о том, что надо закодить что-нибудь на Java для RaspberryPI. Предыстория того, как я дошёл до жизни такой, сама по себе потянет на отдельный пост. Но вот сочные технические подробности, трудности и счастливый конец ниже под катом.
Немного разочаровавшись в движении проекта satnogs [1], я решил попробовать сам написать базовую станцию для приёма радио сигналов на raspberry pi [2]. Проанализировав текущую функциональность satnogs и сложив с собственным заскорузлым enterprise пониманием того, что такое стабильная платформа, я придумал следующие требования:
В результате в противоречие вступают только два требования: Java и низкое потребление ресурсов.
В этот момент я почему то вспомнил древний древний слоган «Java — write once, run everywhere» и присказку, что Java может запускаться на кофеварке. С этого момента началось погружение в Java Embedded.
Если вкратце, то в Java существуют две платформы для написания под маленькие устройства: Java ME [3] и Java Embedded. Первая платформа предназначена для совсем маленьких (кофеварки) устройств, а вторая для тех, что чуть-чуть покрупнее. Я выбрал Java Embedded.
Сама Java Embedded в Java 8 претерпела изменения. Теперь её можно собрать с различными профайлами: compact1, compact2, compact3. По сути, это depedency management для бедных. Каждый профайл содержит какие-то части rt.jar [4], тем самым уменьшая минимальное потребление памяти JVM при загрузке. На моих как-бы тестах (колонка %RES в выводе команды top), я получил следующее потребление:
Для начала я выбрал самый хардкорный вариант: compact1. Нo если не получится найти под него библиотеки, то можно попробовать compact2.
После выбора версии Java нужно выбрать библиотеки. И вот тут дикий-дикий запад. Поскольку в Java мире всё течёт неспеша и с оглядкой на обратную совместимость, то никто из разработчиков библиотек не побежал оптимизировать свой код под новые профайлы. Тем более скоро выходит Java 9, где всё может ещё раз измениться.
Дальше я проанализировал, минимальный набор библиотек для создания не слишком нагруженного web приложения.
Какой же Java проект без базы данных. Но тут есть один подвох: в compact1 нет java.sql api. Поэтому я первым делом посмотрел на базы с native api без jdbc:
И с jdbc:
Есть ещё куча других мелких непонятных embedded баз данных, которые можно было бы попробовать. Но отлавливать их баги под raspberry pi у меня желания нет.
Зато есть пара других идей:
if ((name != null) && name.startsWith("java.")) {
throw new SecurityException
("Prohibited package name: " +
name.substring(0, name.lastIndexOf('.')));
}
Вообще непонятно почему существует такой maven артефакт, если его даже теоретически нельзя загрузить.
В общем отказался совсем от базы. Посмотрим надолго ли.
После нескольких запусков и сборке всего вместе выплыло несколько косяков, но их можно поправить конфигурацией. Например:
https://stackoverflow.com/questions/13825403/java-how-to-get-logger-to-work-in-shutdown-hook [21]
Автор: dernasherbrezon
Источник [23]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/260520
Ссылки в тексте:
[1] satnogs: https://satnogs.org
[2] raspberry pi: https://www.raspberrypi.org
[3] Java ME: https://habrahabr.ru/post/210592/
[4] какие-то части rt.jar: http://www.oracle.com/technetwork/java/embedded/resources/tech/compact-profiles-overview-2157132.html
[5] Dagger: https://github.com/google/dagger
[6] Feather: https://github.com/zsoltherpai/feather
[7] Guice: https://github.com/google/guice
[8] guava: https://github.com/google/guava
[9] picocontainer: http://picocontainer.com
[10] berkleydb: http://www.oracle.com/technetwork/database/berkeleydb/overview/index-093405.html
[11] sqlite: https://github.com/xerial/sqlite-jdbc
[12] java.sql api: https://mvnrepository.com/artifact/org.xerial.thirdparty/jdbc-api/1.4
[13] tomcat: https://github.com/apache/tomcat
[14] jetty: http://www.eclipse.org/jetty/
[15] nanohttpd: https://github.com/NanoHttpd/nanohttpd
[16] jtwig: http://jtwig.org
[17] только: https://jira.qos.ch/browse/LOGBACK-1071
[18] gson: https://github.com/google/gson
[19] jacksonxml: https://github.com/FasterXML/jackson-databind
[20] https://github.com/ralfstx/minimal-json: https://github.com/ralfstx/minimal-json
[21] https://stackoverflow.com/questions/13825403/java-how-to-get-logger-to-work-in-shutdown-hook: https://stackoverflow.com/questions/13825403/java-how-to-get-logger-to-work-in-shutdown-hook
[22] https://github.com/dernasherbrezon/r2cloud: https://github.com/dernasherbrezon/r2cloud
[23] Источник: https://habrahabr.ru/post/333430/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.