Как кросс-компилировать исходный код Java в JavaScript? - PullRequest
50 голосов
/ 13 января 2009

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

GWT - один из вариантов, но каждый пример, который я видел до сих пор, нацелен на создание модных веб-сайтов. Простой случай использования простого преобразования исходного кода Java в Javascript, который можно использовать вместе с JavaScript , созданным вручную, не был хорошо документирован .

Я создал ветку в списке рассылки GWT на эту тему, но мнения о том, возможно ли это вообще, смешаны.

Один человек дал очень полезный совет, который должен был проверить GWT-Exporter . Проблема в том, что ни исходный код, ни документация не доступны, хотя есть это и это .

edit: исходный код GWT-Exporter здесь

Я также видел Java2Script . Но, опять же, я не смог найти примеры того, как решить мой простой вариант использования.

Как лучше всего подойти к этой проблеме? Есть ли что-то лучшее, что мне не хватает?

Ответы [ 7 ]

10 голосов
/ 13 января 2009

Когда вы используете GWT, вы в основном преобразуете часть пользовательского интерфейса в Javascript (и предполагается, что вы используете виджеты пользовательского интерфейса, предоставляемые при написании Java). Только некоторые из библиотек Java доступны в Javascript. Как правило, в приложении GWT все, что интенсивно использует библиотеки Java, запускается на стороне сервера и подключается к Javascript как AJAX (который GWT обрабатывает для вас). Поэтому GWT не обязательно конвертирует ваше полное приложение в Javascript (хотя может, если вы хотите ограничить использование библиотек Java и некоторых функций).

В любом случае, если вам подходит этот подход (обращение к Java, работающему на сервере из Javascript), одним из приятных вариантов является DWR , который в основном позволяет вашему Javascript напрямую вызывать методы в Java классы, работающие на сервере (без необходимости создавать веб-сервис или другой интерфейс). Я знаю не то, что ты спросил.

Более того, похоже, что есть исходный код для примера приложения, демонстрирующего использование gwt-exporter .

9 голосов
/ 16 декабря 2015

Я не уверен, подходит ли он для вашего случая использования, но если вы согласны отказаться от API Java и использовать API JavaScript из Java, то вы можете использовать JSweet , транспортер Java в JavaScript, построенный на вершине TypeScript. Он предоставляет вам доступ к сотням хорошо написанных API-интерфейсов JavaScript (DOM, jQuery, подчеркивание, angularjs и т. Д.). Он генерирует код JavaScript, и вы можете смешивать его с устаревшими кодами JavaScript и TypeScript.

Примечание: JSweet будет не работать для устаревшего кода Java и устаревших API-интерфейсов Java, но в вашем случае использования не упоминалось повторное использование устаревшего кода.

[ОБНОВЛЕНИЕ] Начиная с версии 1.1, JSweet теперь также поддерживает некоторые API Java, такие как Коллекции (java.util). Таким образом, можно в определенной степени повторно использовать устаревший код Java. Также довольно просто добавить собственную поддержку API Java.

8 голосов
/ 17 ноября 2015

Хотя вопрос касается компиляции исходников Java в JavaScript, я думаю, стоит упомянуть, что существует TeaVM , который компилирует байт-код Java в JavaScript. Я никогда не пробовал, но это выглядит очень многообещающе.

3 голосов
/ 15 июля 2018

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

Хотя существует множество решений для преобразования приложений Java в Javascript , вас интересует решение, в котором новый код JavaScript может взаимодействовать с результирующим кодом. Это обновление (с 2018 года) других ответов.

Существуют разные типы инструментов. Например, вы можете найти инструменты, которые позволят вам (1) преобразовать код Java в код JavaScript; (2) конвертировать байт-код в javascript, asm.js или веб-сборку; (3) выполнять приложения Java непосредственно в браузере и (4) создавать решения, которые сочетают в себе Java и JavaScript. Вы должны выбрать решение для использования в зависимости от ваших требований.


Преобразование исходного кода Java в Javascript

Некоторые решения берут исходный код java и создают эквивалентную версию javascript. Обычно эти решения преобразуют Java в Javascript, но не поддерживают все поведения и библиотеки среды выполнения Java. Полученный код может не поддерживать некоторые стандартные библиотеки Java. Как правило, они используются для создания HTML-приложения с использованием Java, но не для переноса кода. Плюсы: Полученное решение может содержать очень маленькие файлы. Вы можете использовать его для повторного использования ваших собственных классов бизнес-логики без учета графического интерфейса или библиотек, специфичных для платформы. Минусы: возможно, что вы не можете использовать некоторые функциональные возможности платформы Java. Требуется доступ к исходному коду.

  • JSweet преобразует Java в JavaScript. Он включает в себя привязки API для более 1000 библиотек JavaScript. Вы можете написать код Java, который использует эти библиотеки.
  • j2s , это компилятор, используемый платформой Eclipse RAP для перевода java-кода в javascript. Он используется для преобразования виджетов SWT (GUI) в javascript и HTML. Он не поддерживает все стандартные библиотеки Java

Преобразование байт-кода Javascript в javascript

Эти решения берут скомпилированный код Java (файлы .class) и создают эквивалентный код в javascript, asm.js или веб-сборке. Учитывая, что код Java может зависеть от стандартных библиотек Java (т. Е. JRE), эти решения обычно включают в себя портированные и предварительно скомпилированные библиотеки. Плюсы: вам не нужно ничего менять в своем коде. Вам также не нужен исходный код. Минусы: Полученное решение может потребовать загрузки большого количества файлов.

  • Bck2Brwsr , виртуальная машина Java, которая может заранее скомпилировать байт-код java в javascript. Он создает файл javascript для каждого файла .jar.
    • Вы можете использовать объект vm javascript для загрузки класса в javascript и выполнения статических методов (используя vm.loadClass(.., function(class){..}}). В документации есть пример для плагина gradle и задачи maven .
  • TeaVM - еще одна виртуальная машина Java, которая может заранее преобразовать код в javascript. В отличие от Bck2Brwsr, он поддерживает потоки, создает один файл для всех ваших классов и обеспечивает лучшую поддержку отладки.
  • DukeScript , перенос Java-кода и байт-кода в JavaScript с использованием Bck2Brwsr или TeaVM.
  • Dragome , перенос байт-кода Java в JavaScript.
  • CheerpJ (коммерческий продукт) может запускать полные Java-приложения с использованием Swing и AWT. Он обеспечивает очень полную среду javascript, которая поддерживает функциональные возможности операционной системы, потоков и сети.
    • Предоставляет полный API времени выполнения . Вы можете запустить метод main, используя cheerpjRunMain( <class>, <jar> ). Вы можете создавать объекты, используя cjNew( <class>, <params>...), и вызывать статические методы, используя cjCall( <class>,<method>,<params>...). Есть много других методов, которые вы можете рассмотреть.

Запуск Java-кода в Javascript

DoppioJVM - это полная JVM, написанная на Typescript. Плюсы: Он эмулирует множество элементов операционной системы, включая файловые системы, консоли TTY и потоки. Минусы: Учитывая, что это интерпретатор, он может работать медленнее, чем другие решения. (Я не проверял это)

  • DoppioJVM - это JVM, написанная на Typescript
    • Документация содержит фрагменты кода для загрузки и запуска классов. Вы можете запустить статический метод, используя jvm.runClass( <class>, [ <args>...], function(response){..}). Вы можете запустить файл Jar и выполнить множество других задач.

Создание приложений, сочетающих Java и Javascript

Некоторые другие решения предоставляют не только инструменты для компиляции кода, но также фреймворки и решения для создания решений java и javascript. Например, CheerpJ имеет полные версии библиотек Swing и AWT для графических пользовательских интерфейсов, но они могут работать очень медленно. Вы можете заменить пользовательский интерфейс, используя новые версии HTML, которые работают быстрее в браузере. Плюсы: Вы можете повторно использовать существующий код без изменений, в основном некоторые библиотеки и бизнес-логику. Вы можете удалить из своих решений библиотеки, которые неэффективно работают в браузере. Минусы: Если вы хотите продолжать поддерживать версию Java для рабочего стола, вы должны иметь дело с другим кодом для браузера.

  • GWT преобразует код Java в javascript, но использует другой набор библиотек для пользовательского интерфейса и обмена данными между клиентом и сервером.
  • Dukescript использует инструменты преобразования, упомянутые ранее.
    • Он предоставляет библиотеку Knockout4j , которая может легко взаимодействовать с HTM, DOM и дополнительным кодом JavaScript.
  • Dragome не только конвертирует Java-код, но и включает средства взаимодействия с HTML / DOM
  • HTML / Java API - это проект Apache, который стандартизирует доступ к HTML / DOM / javascript из переданного кода
    • Это было пожертвовано Dukescript и другими поставщиками инструментов.

Рекомендация

  • Если вы хотите повторно использовать несколько классов, созданных вами, вы можете попробовать JSweet . Вы можете создавать модули javascript (библиотеки), которые можно легко использовать с javascript и typcript.
  • Если вы хотите повторно использовать среднюю или большую кодовую базу, использующую несколько библиотек Java, вы можете попробовать CheerpJ , Dukescript или Dragome . Вы можете повторно использовать большие части своего кода и создавать (постепенно) пользовательский интерфейс и взаимодействие между клиентом и сервером, используя технологии, более удобные для браузера.
  • Если вы хотите запускать полные Java-приложения без изменений, вы можете попробовать CheerpJ . Он может запускать пользовательские интерфейсы Swing и AWT. Это также обеспечивает бегун апплета .
3 голосов
/ 03 сентября 2016

Не совсем по теме, но Kotlin - это 100% совместимый с Java язык, который может компилироваться в JavaScript.

IntelliJ IDEA может автоматически конвертировать Java в Kotlin и компилировать его для запуска на Node или в браузере.

3 голосов
/ 13 февраля 2015

Вот еще два варианта, на которые стоит обратить внимание, и третий вариант - не конвертировать, а просто жить вместе.

  1. Java2Javascript

Я давно хотел попробовать это - выглядит ближе к тому, что спросили. Цитирование веб-страницы:

плагин компилятора Eclipse Java to JavaScript и реализация JavaScript-версии Eclipse Standard Widget Toolkit (SWT) с другими распространенными утилитами, такими как java.lang. * И java.util. *. Java2Script Pacemaker позволяет преобразовать основанную на SWT Rich Client Platform (RCP) в многофункциональное интернет-приложение (RIA).

Ограниченный опыт Java в Javascript - вам нужно будет перенести необходимые зависимости или найти альтернативы с помощью таких инструментов, как jQuery и т. Д.

  1. DukeScript

Когда я просматриваю DukeScript, он компилирует некоторый интерфейсный Javascript и вызывает Java из Javascript браузера. Это более или менее гибридный подход, поэтому вы можете использовать множество библиотек Java из Javascript. Я не справлюсь с политикой безопасности браузера для Java.

Более полный Javascript на Java, использующий среду выполнения Java. Если бы я хотел этого вне среды браузера, я бы использовал Javascript на Java.

  1. Nashhorn

Рассмотрим это в качестве примера использования ресурсов Java в качестве основы для Javascript: Nashorn и JavaFX , в качестве примера для клиента с богатым Javascript. В любом случае, с движком Javascript внутри Java вам не нужно много переводить между Javascript-VM в объектный код и Java-VM.

1 голос
/ 06 октября 2013

Учитывая набор файлов исходного кода Java, как я могу скомпилировать их в один или более файлов JavaScript, которые можно использовать в ручном режиме JavaScript

Нет прямой связи между встроенными функциями Java API и языка Java, а также функциями JavaScript. Поэтому любая попытка создать «конвертер» будет неполной. В качестве фундаментального примера классы Java не имеют прямой соответствующей идиомы JavaScript.

Будет ли неполный инструмент преобразования работать для вашего варианта использования, невозможно узнать без исходного кода.


Тем не менее, мое предложение для решения вашей проблемы будет состоять в том, чтобы сначала попытаться использовать GWT : создать демонстрационный проект, открыть исходный код вашей библиотеки и вызвать его со стороны JavaScript и посмотреть, что GWT выводит в файл .js. Некоторые другие инструменты, предложенные другими авторами здесь, определенно стоит проверить.

Если это будет плодотворно и даст вам часть пути, прекрасно.

Оттуда вам нужно / нужно сделать оставшуюся часть преобразования вручную. В конце концов, если вы хотите, чтобы код действительно функционировал правильно, ручная проверка определенно была бы в порядке. Некоторые юнит-тесты, конвертируемые вместе с ним, также были бы идеальными.

Вы не указываете, насколько велик источник вашего проекта, но если он небольшой (скажем, менее тысячи строк кода), даже полное преобразование вручную не должно быть чрезвычайно сложным. Если он намного больше этого, я бы посоветовал проверить, действительно ли вы хотите использовать его как код JavaScript.

...