Интеграция Scala в существующий проект в Java
у нас есть проект, написанный на Java. Это проект maven, который имеет jsp-страницы и много java-кода:
- для обработки пользовательских запросов и обработки ответов.
- классы логики, используемые сервлетами для обработки требуемой логики.
- классы генераторов SQL, используемых для подключения к базе данных и выполнения конкретных запросов, требуемых логикой.
Ну, мы смотрим на Scala. Например, мы используем mappers для получения коллекции сущностей из базы данных и после этого преобразуем эту коллекцию, фильтруем ее и возвращаем в сервлет. Это похоже на хорошую работу на Java. Вопрос в том, как я могу интегрировать это в существующий проект? Могу ли я использовать в своих логических файлах, написанных на Java, некоторые классы Scala, которые снова используют файлы карт, написанные на Java?
Ответы
Ответ 1
Я работаю над смешанным проектом Java/ Scala прямо сейчас (ранее проект только для Java). Помните, что нет никакой разницы в том, что касается JVM между файлом .class, созданным из javac vs. one, созданным из scalac.
Например: я реализую Java-интерфейсы и расширяю классы Java в Scala без проблем. Я также создаю Java beans и Scala 'spring beans вместе в одном файле определения (с Scala beans с зависимостями от java beans и наоборот), и у меня есть оба Java и Scala beans сосуществуют вместе в конвейере обмена сообщениями spring.
Два языка взаимодействуют достаточно хорошо, хотя в тех случаях, когда они собраны, вы, вероятно, захотите взглянуть на Scala JavaConversions и JavaConverters объекты.
Для построения мы используем Ant (я лично предпочел бы SBT для нового проекта, но если вы имеете дело с ранее существующим проектом java, который использует ant, это, вероятно, будет больше проблем, чем это стоит изменить системы сборки). Чтобы настроить Ant для компиляции файлов Scala, просмотрите этот вопрос.
Ответ 2
Я вижу, что никто не упомянул Дэвид Бернард scala-maven-plugin, ранее maven- scala -plugin, упомянутый в @richard-close ответе. У меня нет большого опыта работы с ним, но у меня был непосредственный успех с двумя проектами Java (один довольно большой, один маленький), поэтому я решил, что стоит опубликовать это здесь — даже несмотря на то, что вопрос несколько устарел сейчас; как я пришел к этому вопросу через Google.
Страница Смешанная страница Java/ Scala должна быть в состоянии заставить вас двигаться, хотя есть и другие интересные страницы документации. Просто добавьте соответствующие разделы, показанные здесь, и попытайтесь скомпилировать свой проект. Не делайте ошибку, которую я сделал, и пытайтесь использовать другие конфигурации, описанные в другом месте, с этой первой: просто следуйте этим минимальным изменениям конфигурации в вашем pom.xml верхнего уровня (или что имеет смысл, если Scala будет иметь ограниченную область действия в вашем проект). Go здесь для более легкого копирования и вставки текста (нет '+ показов дополнений).
<dependencies>
+ <dependency>
+ <groupId>org.scala-lang</groupId>
+ <artifactId>scala-library</artifactId>
+ <version>2.11.7</version>
+ </dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
+ <plugin>
+ <groupId>net.alchim31.maven</groupId>
+ <artifactId>scala-maven-plugin</artifactId>
+ <version>3.2.1</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.0.2</version>
+ </plugin>
</plugins>
</pluginManagement>
<plugins>
+ <plugin>
+ <groupId>net.alchim31.maven</groupId>
+ <artifactId>scala-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>scala-compile-first</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>add-source</goal>
+ <goal>compile</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>scala-test-compile</id>
+ <phase>process-test-resources</phase>
+ <goals>
+ <goal>testCompile</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
Обязательно используйте обновленную версию Scala выше, если вы используете Java 8 (т.е. Scala 2.11.x); некоторые официальные документы могут слегка оспариваться.
Одна вещь, я заметил, что документы говорят, что вам нужно делать, но, видимо, этого не нужно: вам не нужно иметь ваши источники Scala в отдельном каталоге и, возможно, оставить их под существующей java каталог вашего проекта. Это удобно и, похоже, работает, но я не знаю, есть ли побочные эффекты.
Заметки IntelliJ
Если вы используете IntelliJ, не забудьте щелкнуть правой кнопкой мыши модуль maven в представлении вашего проекта и "Добавить поддержку Framework...", чтобы добавить Scala Framework в проект. Вероятно, вам нужно будет добавить фреймворк к каждому подмодулю, который вы собираетесь использовать Scala, если вы используете многомодульный проект, а не только модуль верхнего уровня. Затем вы сможете автоконвертировать файлы Java в файлы Scala, доступные через меню Refactor (хотя вам понадобятся некоторые исправления вручную). Это может дать вам быстрый способ протестировать конфигурацию, особенно если есть небольшой Java-класс, который вы можете попробовать в первую очередь.
Предостережения
@james-adam комментарии о JavaConversions также очень важны для понимания.
Одна из проблем, которые я осознал при попытке интегрировать Scala с другим языком JVM (Kotlin) в одном проекте, заключается в том, что все может быть не так гладко из-за того, как каждый язык обрабатывает коллекции: они оба предназначены для эффективной работы с Java, но не обязательно друг с другом. Я не знаю деталей, но в любом случае это немного касательно вопроса.
Ответ 3
Это: http://scala-tools.org/mvnsites/maven-scala-plugin выглядит как хороший способ интегрировать ваш код Scala в вашу сборку Maven, хотя я не пробовал Это. (Я использую SBT, который прекрасно сочетает Scala/Java, а также создание проекта IDE (Idea и Eclipse) с помощью плагинов. Однако вы не захотите изменять весь процесс сборки).
Ответ 4
Да, вы можете иметь взаимные зависимости между Java и Scala без проблем.