Статьи

Аватар проекта – что это значит для Java EE 8?

С появлением Java EE 7 уже давно пришло время приступить к планированию следующей ревизии платформы, которая, скорее всего, будет называться Java EE 8. Oracle организовала  опрос сообщества,  с помощью которого они хотели бы получить информацию от сообщества относительно относительной важности некоторых функций, которые они намерены добавить. Прежде всего, это должно побудить заинтересованного читателя принять участие и  принять участие в опросе . Особое внимание уделяется поддержке динамических приложений на основе HTML 5. Хотя WebSocket и JSON Processing уже внедрили его в Java EE 7, на данный момент есть еще одна особенность, особенно в GlassFish и WebLogic (через  Джерси ), которая имеет некоторый потенциал для стандартизации. Сервер отправил события (SSE). Это уже является частью HTML5 спецификации  и будет очень хорошим кандидатом на стандартизацию. Но Oracle думает еще дальше и спрашивает, будет ли достаточно поддержки и интереса, чтобы реально стандартизировать использование JavaScript на серверах Java EE. Когда такого рода вопросы начали появляться на JavaOne 2012, его в основном называли  Node.jar  на  Nashorn . С сентября этого года мы знаем настоящее имя:  Project Avatar .

Аватар с первого взгляда
Project Avatar предоставляет уровень сервисов JavaScript, сосредоточенный на поддержке REST, WebSockets и событий, отправляемых сервером, и многофункциональную инфраструктуру на стороне клиента, которая предполагает очень незначительные знания JavaScript. Сторона служб ориентирована на создание служб данных с использованием JavaScript, а дополнительная сторона клиента полностью сосредоточена на поддержке HTML5 и TSA (архитектура тонкого сервера).

Проект Аватар (Источник:  avatar.java.net )

Архитектура тонкого сервера
С появлением HTML5, CSS3 и быстрых движков JavaScript современные браузеры стали мощной платформой. С появлением так называемого одностраничного приложения (SPA), также известного как одностраничный интерфейс (SPI), дизайн современных пользовательских интерфейсов сместился с генерации на стороне сервера на веб-приложения или веб-сайты, которые помещаются на одной веб-странице. с целью обеспечения более плавного взаимодействия с пользователем, похожего на настольное приложение. SPA перемещает логику с сервера на клиент. В результате роль веб-сервера превращается в чистый API данных или веб-сервис. Этот архитектурный подход был придуман как «Архитектура тонкого сервера», чтобы указать, что сложность переместилась с сервера на клиент при одновременном снижении общей сложности системы.

Что на самом деле в аватаре?
Но Аватар это гораздо больше, чем просто подход TSA. В основном он состоит из трех частей. Основой является готовящаяся Java 8 и включенная в нее реализация JavaScript под названием Nashorn. Вдобавок к этому Avatar Runtime, включающий дополнительный уровень компилятора и сервер на основе API сервлетов. Эти абстракции позволяют размещать его в различных средах выполнения. Приложения Avatar состоят из клиентских «представлений», серверных «служб» или обоих. Важно отметить, что между ними нет внутренней связи, которая позволяет представлениям взаимодействовать с существующими службами и использовать их для любого типа клиента. «Архив» приложения разворачивается на сервере и компилируется для генерации JavaScript с учетом приложения.Созданный JavaScript для представлений обрабатывает привязку данных с помощью DOM / UI, а также управление данными для удаленных служб и локального хранилища. Архивы Аватара несколько похожи на веб-архивы Java EE. Они состоят из папки WEB-INF, файла avatar.properties в корневом каталоге и каталога представлений и / или каталога служб. Обе директории файловой системы или файлы .zip (.war) поддерживаются Avatar.

Все, что осталось на сервере — Сервисы
Сервис расширяет абстракцию REST, WebSocket или Push (SSE), и его жизненный цикл полностью обрабатывается платформой. Реализации сервисов могут использовать как встроенные модули Node, так и большинство сторонних модулей. Благодаря поддержке Nashorn для прямого вызова кода Java вы также можете напрямую использовать большинство библиотек Java.

Сторона клиента — Представления
Представление — это HTML-код, требуемый браузером. Он также содержит пользовательские HTML-расширения «data-» и простые модели JavaScript. Эти представления передаются компилятором (на стороне сервера) перед отправкой полного HTML-файла SPA, включая сгенерированный пользователем JavaScript, в браузер.

Собираем все вместе. Простой пример.
Oracle предоставляет приличный набор примеров и документации для Avatar, чего в принципе достаточно для начала работы. Первое, что вы можете попробовать сами — это  сборка раннего доступа JDK 8  для вашей ОС. На момент написания статьи я попробовал это с последней версией Developer Preview b118. После установки вам необходимо получить последний  сервер GlassFish Open Source Edition 4.0  и разархивировать его в подходящее место. Убедитесь, что он работает с установленным JDK 8, либо поместив <jdk8> / bin в переменную окружения PATH, либо добавив следующую запись в <gf4> / glassfish / config asenv.bat / conf

set AS_JAVA=<jdk8>

Now go ahead to download latest avatar-1.0-ea.zip and expand it to the <gf4>/glassfish/ directory. After that you need to set a AVATAR_HOME environment variable and point it to the <gf4> install directory. And make sure to add %AVATAR_HOME%\glassfish\bin to your PATH environment variable.
If all of that is done you can switch to your workspace folder and issue the following command to have Avatar creating a simple example app for you:

avatar new --example=hello

It creates a basic «hello» application which only consists of a view. It is a good place to start exploring and you can directly start your Glassfish instance afterwards and deploy the application as you would with every typical Java EE application:

 
asadmin start-domain
asadmin deploy hello
The «hello-example» app.

Pointing your browser to 
http://localhost:8080/hello will display the application. You can start editing the view located at <workspace>/hello/view/src/hello.html directly. While the server is running Avatar takes care of re-compiling it directly for the next request. This ensures a rapid development. This behavior is controlled by the «debug=true» property in the avatar.properties file and can be altered for productive systems. Further on, setting it to false causes all .js and .css files to be minimized before delivery.

At least if you first download and add the required YUI Compressor (
jar download) to Avatar first. Due to license restrictions it hasn’t been bundled. Simply put it into <gf4>/glassfish/modules/avatar-ext/lib. You might need to create that directory first.

Beside this very simple example without any service at all there are more complex ones available with the distribution at %AVATAR_HOME%/Project-Avatar-examples/. For convenience reasons there is a complete examples.ear available which can be directly deployed and tested. To access the samples simply prefix the example name with «demo-«. So the «rest» example can be accessed via 
http://localhost:8080/demo-rest/.

TodoMVC — Example App with Avatar

You have to look out for different features to be showcased in the different examples. If you want to know how Avatar handles persistence you can exactly look into the rest example which uses a FileDataProvider to save the items. Another interesting example is the TodoMVC based app (
http://localhost:8080/demo-todo/). It showcases a more complex view which also has been styled.

What is next?

As of today nobody knows what is going to happen with Avatar. The community feedback hasn’t been tremendously loud or excited in general. I guess the reason for it is that nobody really knows what to do with it. The biggest drawback as of today is, that it only runs with GlassFish which will further limit adoption and community interest. Given the fact, that SSE isn’t part of the Java EE specification it might make it even more difficult to port it to other app-server. Even if the license (
GPL2 with Classpath Exception) should allow it. Back to the initial survey and the thought about specifying a server side JavaScript integration with Java EE, you know at least have a brief idea about what Oracle is talking if they are talking about Avatar. Go ahead and 
take that survey and tell them what you are thinking about having that kind of stuff in Java EE.
Meta: this post is part of the Java Advent Calendar and is licensed under the Creative Commons 3.0 Attribution license. If you like it, please spread the word by sharing, tweeting, FB, G+ and so on!