Использование нескольких языков JVM в одном проекте

Я хотел бы использовать Kotlin и Scala вместе в проектах и, возможно, некоторые другие языки, но я не видел хорошего способа сделать это. Единственный способ, который я придумал, - это скомпилировать один язык и декомпилировать его в Java для работы с другим. Есть ли альтернативы?


person phase    schedule 09.06.2015    source источник
comment
Более конкретный вопрос может дать вам более конкретный ответ, например, у меня есть класс, определенный в Scala. Как я могу создать его экземпляр из Котлина?   -  person user253751    schedule 09.06.2015
comment
Могли бы вы использовать Gradle и плагины Kotlin и Scala?   -  person Seer    schedule 13.06.2015
comment
Это действительно зависит от того, работаете ли вы в среде IDE и в какой среде IDE. И используете ли вы инструмент сборки, и какой инструмент сборки. Ваш вопрос требует дополнительных разъяснений. Также добавьте пример вашего текущего макета кода, какую структуру каталогов вы используете, находятся ли они в одном или отдельных модулях (подпроектах) и т. Д.   -  person Jayson Minard    schedule 05.01.2016
comment
Также обратите внимание на то, что вы пробовали раньше, но это не сработало.   -  person Jayson Minard    schedule 05.01.2016


Ответы (2)


Ради полноты и не вкладывать слова в чьи-то уста, хотелось взвесить.

Я согласен с последним предложением ответа ziggystar. Правильнее всего использовать компонентный подход и не пытаться комбинировать несколько языков в одном компоненте или проекте.

С технической точки зрения каждый из языков JVM имеет свой собственный компилятор. Некоторые из них, например Scala, могут компилировать файлы как Scala, так и Java. Однако это может быть, а может и не быть верным для других компиляторов. Чтобы избежать странных процессов сборки, хорошим подходом было бы использовать один язык для каждого встроенного модуля.

Поскольку вы придерживаетесь языков JVM, все языки могут быть скомпилированы в JAR, поэтому вы можете легко распространять исполняемый двоичный файл в виде одного файла JAR со всеми компонентами, заключенными в него. Это подход Fat JAR (см. этот вопрос о переполнении стека, этот пост о гиках кода Java ).

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

person Thomas Owens    schedule 09.06.2015

Вы можете использовать Scala и Java одновременно, поскольку scalac понимает и компилирует файлы Java. То же самое, вероятно, относится и к другим языкам. Проблемы могут возникнуть при использовании нескольких альтернативных языков JVM, поскольку, например, компилятор Kotlin, вероятно, не может понять файлы Scala и наоборот.

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

Что я имею в виду под модулем?

Под модулем я имею в виду набор исходных файлов, которые переводятся в один (двоичный) артефакт, то есть в файл jar. В других случаях я бы просто назвал модуль проектом. Обратите внимание, что модуль может зависеть от других модулей на двоичном уровне (например, имеет некоторые файлы jar в качестве зависимостей).

Поддержка нескольких модулей в IDE

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

Терминология

Для Intellij IDEA один из моих модулей называется module. Для Eclipse это будет называться проектом.

person ziggystar    schedule 09.06.2015
comment
Я хочу использовать несколько альтернативных языков в одном проекте. Все они переводятся в байт-код, поэтому до этого должен быть способ использовать их вместе. - person phase; 09.06.2015
comment
@Phase Что вы подразумеваете под одним проектом? Вы имеете в виду одну вещь, которую можно доставить? Один корневой уровень в исходном коде? Или один проект уровня IDE? - person Thomas Owens; 09.06.2015
comment
Кроме того, что означает @ziggystar под модулем? (См. Комментарий Томаса Оуэнса) - person user253751; 09.06.2015
comment
@ThomasOwens Я бы подумал, что это проект уровня IDE, но я не вижу способа сделать это в IDE. Я хотел бы получить одну банку из файлов разных типов (.java, .scala и .kt). - person phase; 09.06.2015
comment
Тогда я считаю, что последнее предложение этого ответа правильное. Java, Scala и Kotlin (и другие языки JVM) компилируются в файлы JAR. Создайте отдельные проекты IDE для каждого модуля и создайте каждый из них в JAR с четко определенными интерфейсами. В конце вам понадобится основная точка входа, чтобы вы могли упаковать все свои JAR-файлы компонентов на разных языках в один JAR-файл в конце. - person Thomas Owens; 09.06.2015