Подтвердить что ты не робот

Интеграция Scala в существующий проект в Java

у нас есть проект, написанный на Java. Это проект maven, который имеет jsp-страницы и много java-кода:

  • для обработки пользовательских запросов и обработки ответов.
  • классы логики, используемые сервлетами для обработки требуемой логики.
  • классы генераторов SQL, используемых для подключения к базе данных и выполнения конкретных запросов, требуемых логикой.

Ну, мы смотрим на Scala. Например, мы используем mappers для получения коллекции сущностей из базы данных и после этого преобразуем эту коллекцию, фильтруем ее и возвращаем в сервлет. Это похоже на хорошую работу на Java. Вопрос в том, как я могу интегрировать это в существующий проект? Могу ли я использовать в своих логических файлах, написанных на Java, некоторые классы Scala, которые снова используют файлы карт, написанные на Java?

4b9b3361

Ответ 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 без проблем.