web-dev-qa-db-ja.com

ScalaをJavaの既存のプロジェクトに統合する

javaで書かれたプロジェクトがあります。これはMavenプロジェクトであり、jspページと多くのJavaコード:

  • ユーザー要求を処理し、応答を処理するためのサーブレット。
  • 必要なロジックを処理するためにサーブレットが使用するロジックのクラス。
  • データベースに接続し、ロジックに必要な特定のクエリを実行するために使用されるSQLジェネレーターのクラス。

さて、私たちはScalaに目を向けています。たとえば、データベースからエンティティのコレクションを取得するためにマッパーを使用し、その後このコレクションを変換した後、それをフィルタリングしてサーブレットに戻ります。これは、Javaで行うには良いことのようです。問題は、それを既存のプロジェクトに統合するにはどうすればよいですか? Java some Scala Javaで書かれたマッパーファイルを再び使用するクラス)で書かれたロジックファイルで使用できますか?

24
SPIRiT_1984

現在、Java/Scala混合プロジェクト(以前はJavaのみのプロジェクト)に取り組んでいます。 JVMがjavacから生成された.classファイルとscalacから生成された.classファイルの間に関係がある限り、違いはありません。

例:Javaインターフェースを実装し、JavaクラスをScalaで問題なく拡張します。また、インスタンス化するJava Beanと 'Scala' Spring Beanを同じ定義ファイルにまとめた(scala BeanはJava Beanおよびその逆に依存関係があるその逆)、そして私は両方のJavaとScala BeanがSpring統合メッセージングパイプラインで共存しています。

2つの言語は非常にうまく相互運用できますが、コレクションについては、Scalaの JavaConversions および JavaConverters オブジェクトを確認することをお勧めします。

ビルドには、Antを使用します(個人的には、新しいプロジェクトにはSBTを使用しますが、既存のJava antを使用するプロジェクトを処理している場合は、さらに問題が発生する可能性がありますビルドシステムを変更するよりも価値があります。scalaファイルをコンパイルするようにantを構成するには、 この質問 をご覧ください。

22
James Adam

David Bernardscala-maven-plugin については誰も言及していないようです。以前はmarich-scala-pluginでしたが、@ richard-closeの回答で言及しています。私はそれについての豊富な経験はありませんが、2つのJavaプロジェクト(1つはかなり大きく、1つは小さい))ですぐに成功したので、ここに投稿する価値があると考えました—質問の日付は少し古いですが、Google経由でこの質問にたどり着きました。

Mixed Java/Scala Projects ページは、他の興味深いドキュメントページもありますが、うまくいくはずです。ここに示す関連セクションを追加して、プロジェクトをコンパイルしてみてください。私が間違えたのではなく、他の場所に文書化されている他の構成を最初に使ってみてください。最上位のpom.xmlでこれらの最小限の構成変更に従ってください(またはScala =プロジェクト内の範囲は制限されます。テキストをコピーして貼り付けるのが簡単になるように ここ に移動します(追加を表示する「+」はありません)。

<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 8(ie Java 2.11.x)を使用している場合は、上記のScalaを更新してください。 ;一部の公式ドキュメントは少し古臭いかもしれません。

ドキュメントであなたがする必要があるようですが、明らかにそうする必要はないと言うことに気づきました:Scalaソースを別のディレクトリに置く必要はなく、おそらくそれらを残すことができますプロジェクトの既存のJavaディレクトリの下にあります。これは便利であり、機能しているようですが、副作用があるかどうかはわかりません。

IntelliJノート

IntelliJを使用している場合は、プロジェクトビューでmavenモジュールを右クリックし、[フレームワークサポートを追加...]をクリックしてScala Frameworkをプロジェクトに追加することを忘れないでください。おそらく、使用する各サブモジュールにフレームワークを追加する必要がありますScalaで、最上位モジュールだけでなく、マルチモジュールプロジェクトを使用している場合。次に、自動変換できる必要がありますJavaファイルをScalaファイル、リファクタリングメニューからアクセス可能(ただし、手動で修正する必要があります。)これにより、特にJavaクラスを最初に試すことができる場合)は、構成を簡単にテストできます。

注意事項

JavaConversionsに関する@ james-adamのコメントも知っておくことが非常に重要です。 1つのプロジェクトでScalaを別のJVM言語(Kotlin)と統合しようとしたときに気づいた1つの問題は、各言語がコレクションを処理する方法が原因で物事がそれほどスムーズではない可能性があるということです。どちらもJavaで適切に機能するように設計されていますが、必ずしも相互に機能しているわけではありません。詳細はわかりませんが、これはいずれにしても、この質問には少し正接です。

9
bbarker

これ: http://scala-tools.org/mvnsites/maven-scala-plugin は、ScalaコードをMavenビルドに統合する良い方法のように見えますが、まだ試していませんが(SBTを使用しています。SBTはScala/Javaの統合を適切に実行します。また、IDEプロジェクトの作成(アイデアとEclipse))をプラグイン経由で行います。ただし、ビルドプロセス全体を変更してください)。

3
Richard Close

はい、JavaとScala)の間に相互依存関係は問題なくできます。

1
Alexey Romanov