Codename One сделал свой JavaScript-порт бесплатным и открытым: что это значит для разработчиков
Компания Codename One открыла исходный код своего JavaScript-порта на базе ParparVM, сняла ограничения по тарифным планам и позволила собирать веб-приложения локально без облачного аккаунта.
Открытый JavaScript-порт — это не просто смена лицензии. Это сигнал о том, что Codename One ставит на доступность: теперь любой разработчик может проверить свой Java-проект в браузере без платной подписии и ожидания в очереди на облачную сборку.
Что вообще такое Codename One
Если вы не следите за миром мобильной разработки, кратко: Codename One — это фреймворк с открытым исходным кодом, который позволяет писать приложения для iOS, Android, десктопа и веба на Java или Kotlin, используя одну кодовую базу. Принцип «пиши один раз — запускай везде», но без утрированной абстракции Cordova: код транслируется в нативный для каждой платформы.
До недавнего времени сборка в JavaScript (то есть для запуска в браузере) была доступна только на платном Enterprise-плане. Теперь это изменилось.
Пару слов о том, что именно открыли
В основе обновления — Pull Request #5423. Он делает порт на базе ParparVM дефолтным для JavaScript-цели и выпускает его под той же лицензией GPLv2 с Classpath Exception, что и остальной фреймворк. Ранее веб-цель использовала сторонний проект TeaVM — и он остаётся доступным как запасной вариант. Но теперь ParparVM — основной путь.
ParparVM — это виртуальная машина, которую Codename One использует для трансляции Java-байткода в нативный код различных платформ. Раньше она обслуживала iOS и десктоп, а теперь к списку добавился полноценный браузерный таргет.
Ключевые изменения:
- JavaScript-сборка бесплатна на любом тарифе, включая Free.
- Локальная сборка без аккаунта — можно собрать веб-приложение на своей машине одной командой Maven, без облачных сервисов Codename One.
- TeaVM не удалили — если что-то сломалось, можно переключиться обратно через хинт сборки.
Зачем это нужно обычному разработчику
Допустим, вы пишете приложение на Java и хотите быстро посмотреть, как оно выглядит в браузере. Раньше для этого нужен был платный план и облачная сборка — ну или умение самостоятельно разобраться с TeaVM. Теперь достаточно сгенерировать Maven-проект и выполнить локальную команду. Статический HTML-файл на выходе — без серверной части, без ожидания.
Это удобно для прототипирования, демонстраций заказчику и быстрого тестирования UI. Для продакшена, конечно, потребуется больше настроек — но входной порог стал заметно ниже.
Как устроен новый порт под капотом
Техническая деталь, которая стоит упомянуть: Java-код теперь выполняется не в основном потоке браузера, а в Web Worker — изолированном фоновом потоке. У него нет доступа к DOM, document и прочим глобальным объектам браузера. Вместо этого тонкий мост сообщений связывает Worker с фронтенд-слоем, который уже работает с канвасом, буфером обмена, Bluetooth и прочим.
Это архитектурно чистое решение: бизнес-логика изолирована от специфики браузера, а браузерные ограничения (например, требование HTTPS для Web Bluetooth) живут в слое порта, а не в коде приложения.
Для тех, кто столкнётся с CORS-проблемами при обращении к внешним API: новый сборщик автоматически генерирует прокси-обёртку. Можно выбрать цель развёртывания — Jakarta Servlet, Node.js, Cloudflare Workers, AWS Lambda и другие. По умолчанию используется Jakarta Servlet.
Android API 36: изменения на следующей неделе
Отдельная новость для мобильных разработчиков: следующей неделе Codename One переключит дефолтный Android target на API level 36 (Android 16). Google Play уже рассылает уведомления разработчикам, чьи приложения ещё не адаптированы.
Если вы используете Codename One, имеет смысл уже сейчас протестировать приложение с хинтом android.targetSDKVersion=36 — особенно части, связанные с системным UI, уведомлениями, Bluetooth и нативными библиотеками. При обнаружении регрессий можно временно откатиться на API 35.
Новые возможности: календарь, Bluetooth, редакторы текста
Помимо JavaScript-порта, обновление затронуло сразу несколько крупных подсистем. Это не косметические правки — каждое заслуживает отдельного разговора, но обозначу главное.
API календаря
Новый модуль com.codename1.calendar предоставляет единый интерфейс для работы с локальными календарями устройства, Google Calendar, Microsoft Outlook, CalDAV-серверами и .ics-файлами. Поддерживается рекуррентность, задачи, инкрементная синхронизация, офлайн-очередь мутаций и обработка конфликтов.
Для разработчика это значит: не нужно писать отдельную логику под каждый источник. Один API — разные бэкенды. В симуляторе используется изолированная in-memory база, так что тесты не затрагивают реальный календарь.
Bluetooth в ядре
Bluetooth раньше был отдельной библиотекой, основанной на наработках Cordova. Теперь он переписан с нуля и встроен в ядро фреймворка. Поддерживается BLE (центр и периферия), GATT, L2CAP, классический RFCOMM, Web Bluetooth для браузеров и реальные радиостанции на десктопе.
Важный момент: API честно сообщает о возможностях платформы. Браузеры позволяют только центральную GATT-роль через пользовательский диалог выбора. iOS не даёт доступа к произвольному RFCOMM. Приложение, которое не использует Bluetooth, не получает соответствующих разрешений — ни в манифесте, ни в сборке.
Редакторы без нативного оверлея
Раньше при редактировании текста Codename One накладывал нативное текстовое поле поверх компонента. Это работало для простых форм, но не позволяло рисовать подсветку синтаксиса, inline-объекты или пользовательские выделения.
Теперь EditField, RichTextArea и CodeEditor могут редактировать и отрисовывать текст целиком внутри слоя Codename One. Операционная система по-прежнему предоставляет клавиатуру и метод ввода (IME), но рендеринг и управление курсором — на стороне фреймворка.
Отдельно обновили буфер обмена: теперь он поддерживает не только plain text, но и HTML, RTF, Markdown, AsciiDoc, изображения и ссылки на файлы.
Лёгкий рендеринг форматированного текста
Новый компонент RichTextComponent умеет отображать HTML, Markdown, AsciiDoc и RTF внутри обычных лейаутов Codename One — без встраивания полноценного браузера. Это что-то среднее между SpanLabel (простой текст) и BrowserComponent (полноценный WebView). Подходит для отображения форматированного контента в приложении, где скрипты и CSS-вёрстка не нужны.
Компактные строки
Оптимизация на уровне виртуальной машины: ParparVM теперь хранит строки в byte[], если все символы помещаются в один байт (а это подавляющее большинство латинских текстов, URL, JSON-ключей, имён классов и чисел). Раньше все строки занимали char[] — два байта на символ. Теперь — вдвое меньше памяти для типичных данных.
Почему это важно — и где подвох
Стоит отнеститься к новостям с долей скепсиса. Открытие JavaScript-порта — красивый ход, но Codename One сама признаёт, что рассчитывает на рост сообщества, который компенсирует потерю дохода от Enterprise-планов. Для небольшой компании отказ от платной фичи — непростое решение.
С другой стороны, техническая сторона выглядит продуманной: изоляция в Web Worker, единый рантайм для всех целей, локальная сборка без зависимости от облака. Это не маркетинговая «открытость» с оговорками, а реальная возможность собрать и запустить.
Однако масштаб Codename One всё ещё сравнительно невелик по сравнению с Flutter, React Native или Compose Multiplatform. Если вы выбираете кроссплатформенный фреймворк для серьёзного проекта, открытый JavaScript-порт — приятный бонус, но не замена экосистеме, документации и количеству готовых решений.
Итого
Codename One сделал конкретный шаг навстречу разработчикам: бесплатный JavaScript-порт, локальная сборка, открытый исходный код. Параллельно обновились сразу несколько крупных подсистем — от календаря и Bluetooth до редакторов текста и оптимизации памяти.
Если вы уже используете этот фреймворк — обновление явно стоит внимания. Если только присматриваетесь — стал входной порог ниже, и теперь можно проверить гипотезу без финансовых обязательств.