Intégration de Scala dans un projet existant en Java
nous avons un projet écrit en Java. C'est un projet maven, qui a des pages jsp et beaucoup de code java:
- servlets pour le traitement des demandes de l'utilisateur et de traiter des réponses.
- classes de logique utilisées par les servlets pour traiter la logique requise.
- classes de générateurs SQL utilisées pour se connecter à la base de données et effectuer les requêtes spécifiques requises par la logique.
Eh bien, nous sommes à la recherche vers Scala. Par exemple, nous utilisons mappers afin d'obtenir une collection d'entités à partir de la base de données et ensuite transformer cette collection, filtrer et retourner au servlet. Cela semble être une bonne chose à faire en Java. La question Est de savoir comment l'intégrer dans un projet existant. Puis-je utiliser dans Mes fichiers logiques écrits en Java des classes Scala qui utilisent à nouveau les fichiers mapper écrits en Java?
4 réponses
je travaille actuellement sur un projet mixte Java/Scala (auparavant un projet uniquement Java). N'oubliez pas, il n'y a pas de différence en ce qui concerne la JVM entre A.fichier de classe générée à partir de javac rapport généré à partir de scalac.
par exemple: j'implémente des interfaces Java et étend les classes Java dans Scala sans problème. J'instancie aussi des haricots Java et des haricots de printemps' Scala ' ensemble dans le même fichier de définition (avec des haricots scala ayant des dépendances sur java et j'ai des haricots Java et Scala coexistant ensemble dans un pipeline de messagerie d'intégration de printemps.
les deux langues interagissent assez bien, mais en ce qui concerne les collections, vous voudrez probablement jeter un oeil aux objets JavaConversions et JavaConverters de Scala.
pour la construction, nous utilisons Ant (je préférerais personnellement SBT pour un nouveau projet, mais si vous êtes face à un projet java préexistant qui utilise ant, il est probable qu'il y ait plus de problèmes qu'il n'en vaut la peine pour changer les systèmes de construction). Pour configurer ant pour compiler des fichiers scala, jetez un oeil à cette question .
je vois que personne n'a mentionné David Bernard 's scala-maven-plugin , anciennement le maven-scala-plugin, mentionné dans la réponse de @richard-close. Je n'ai pas beaucoup d'expérience avec cela, mais j'ai eu un succès immédiat avec deux projets Java (un assez grand, un petit), donc j'ai pensé qu'il valait la peine de poster ceci ici - même si la question est un peu datée maintenant - comme je suis arrivé à cette question via Google.
la page Mixed Java/Scala Projects devrait être en mesure de vous faire aller de l'avant, bien qu'il y ait d'autres pages de documentation intéressantes aussi bien. Il suffit d'ajouter les sections pertinentes ici et d'essayer de compiler votre projet. Ne faites pas l'erreur que j'ai faite et essayez d'utiliser d'autres configurations documentées ailleurs avec celle-ci d'abord: il suffit de suivre ces modifications de configuration minimales dans votre pom de niveau supérieur.xml (ou tout ce qui a du sens si Scala aura une portée limitée dans votre projet). Aller ici pour un plus facile de copier et coller du texte (pas de '+'s montrant les ajouts).
<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>
assurez-vous d'utiliser une version mise à jour de Scala ci-dessus si vous utilisez Java 8 (C.-à-d. Scala 2.11.x); certains des documents officiels peuvent être légèrement outrés.
une chose que j'ai remarqué que les docs disent que vous devez faire mais apparemment n'avez pas besoin de faire: vous n'avez pas besoin d'avoir vos sources Scala dans un répertoire séparé, et peut-être les laisser sous le répertoire java existant de votre projet. C'est pratique, et semble fonctionner, mais je ne sais pas s'il y a des effets secondaires.
IntelliJ notes
si vous utilisez IntelliJ, n'oubliez pas de cliquer avec le bouton droit de la souris sur le module maven dans votre vue de projet et D'ajouter le support du Framework ..."ajouter le cadre Scala au projet. Vous aurez probablement besoin d'ajouter le cadre à chaque sous-module que vous avez l'intention D'utiliser Scala dans Si vous utilisez un projet multi-modules, pas seulement le module de haut niveau. Ensuite, vous devrait être capable d'autoconvertir des fichiers Java vers des fichiers Scala, accessibles par le menu Refactor (bien que vous devrez vous attendre à des corrections manuelles). Cela peut vous donner un moyen rapide de tester la configuration, surtout s'il y a une petite classe Java que vous pouvez essayer en premier.
mises en garde
les commentaires de @james-adam sur JavaConversions sont aussi très importants pour être conscient de. Un problème que j'ai réalisé en essayant d'intégrer Scala avec un autre langage JVM (Kotlin) dans un seul projet, c'est que les choses peuvent ne pas être aussi fluides en raison de la façon dont chaque langue gère les collections: ils sont tous les deux conçus pour bien fonctionner avec Java, mais pas nécessairement entre eux. Je ne connais pas les détails, mais c'est un peu tangent à la question de toute façon.
This: http://scala-tools.org/mvnsites/maven-scala-plugin semble être un bon moyen d'intégrer votre code Scala dans votre construction Maven, bien que je ne l'ai pas essayé. (J'utilise SBT, qui fait très bien l'intégration Scala/Java, ainsi que la création de projets IDE (Idea & Eclipse) via des plugins. Vous ne voudriez pas changer tout votre processus de construction, cependant).
Oui, vous pouvez avoir des dépendances mutuelles entre Java et Scala sans problèmes.