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

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

Ради полноты и не помещали слова в чужой рот, я хотел взвесить.

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

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

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

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

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

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

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

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

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

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

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

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