2015-11-20 8 views
9

Heute habe ich versucht, eine richtige Lösung zu finden, um ein Maven-Projekt zu erstellen, das sowohl Java- als auch Scala-Code enthält (mit Zwei-Wege-Abhängigkeiten zwischen ihnen).Maven: Mischen von Java und Scala in einem Projekt

Die Lösungen Ich habe in der Regel besteht aus Aufrufen scala-Maven-Plugin oder Maven-scala-Plugin in der so process-resources Phase festgestellt, dass es vor den Compiler-Plugin Standard-Maven läuft (Beispiele: http://www.hascode.com/2012/03/snippet-mixing-scala-java-in-a-maven-project/, https://itellity.wordpress.com/2014/08/21/mixing-scala-and-java-in-a-maven-project/, die offizielle scala -maven-plugin Seite: http://davidb.github.io/scala-maven-plugin/example_java.html).

, die zur Lösung führt, die wie folgt aussieht:

<build> 
    <plugins> 
     <plugin> 
      <groupId>net.alchim31.maven</groupId> 
      <artifactId>scala-maven-plugin</artifactId> 
      <recompileMode>incremental</recompileMode> 
      <executions> 
       <execution> 
        <id>scala-compile</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> 
    </plugins> 
</build> 

Diese Lösung funktioniert gut - Scala Kompilation in der process-resources Phase aufgerufen wird und es kompiliert Java und Scala Code so .class-Dateien alle bereit sind, wenn Das Maven Compiler Plugin läuft in der compile Phase.

Das Problem ist, dass diese Lösung für mich nicht sauber aussieht. Der Aufruf des Scala-Kompilierungsprozesses vor der Kompilierungsphase, nur um sicherzustellen, dass er vor dem Maven-Compiler-Plugin ausgeführt wird, scheint "hacky" zu sein.

Scala-Compiler kompiliert sowieso Java-Klassen, also dachte ich, ich könnte einfach das Standard-Maven-Compiler-Plugin ausschalten und dann könnte der Scala-Compiler in der compile-Phase laufen. Es sieht viel sauberer mir obwohl die Konfiguration ein wenig länger ist:

<build> 
    <plugins> 
     <plugin> 
      <groupId>net.alchim31.maven</groupId> 
      <artifactId>scala-maven-plugin</artifactId> 
      <recompileMode>incremental</recompileMode> 
      <executions> 
       <execution> 
        <id>scala-compile</id> 
        <phase>compile</phase> 
        <goals> 
         <goal>add-source</goal> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>scala-test-compile</id> 
        <phase>test-compile</phase> 
        <goals> 
         <goal>testCompile</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>default-compile</id> 
        <phase>none</phase> 
       </execution> 
       <execution> 
        <id>default-testCompile</id> 
        <phase>none</phase> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Ich frage mich, warum diese Lösung nicht die in Blog-Posts oder auf der offiziellen Plugin Seite geraten ist. Gibt es Nachteile bei diesem Ansatz? Gibt es irgendwelche Probleme, die ich mit den zweiten anstelle der ersten Lösung erwarten sollte?

Antwort

8
  • Ja, die Lösung ist "hacky", aber maven-compiler-plugin ist immer das erste Plugin, das in der Kompilierungsphase läuft (es ist wie in maven hart codiert).
  • Ich habe nicht mit scala 2.11 getestet, aber die vorherige Version von scalac kompiliert .java nicht in .class (nur parse sie). und scala-maven-plugin wird mit "jeder Version von scala" seit 2.7 ausgeführt.
+0

Danke, es ist großartig, eine Antwort vom Plugin-Autor selbst zu bekommen :-) Ich habe die Abwärtskompatibilität nicht berücksichtigt. Es sieht so aus, als würde der Scala-Compiler seit Scala 2.7.2 Java-Dateien kompilieren (http://www.codecommit.com/blog/scala/joint-compilation-of-scala-and-java-sources). Ich habe 'meine' Lösung mit verschiedenen Scala-Versionen getestet und bestätigt, dass es nur mit Scala> = 2.7.2 gut funktioniert. –

+2

Ich denke, Sie vermissen den Artikel lesen, scalac kompiliert Java nicht, kann es aber lesen. (und iirc nur für Klasse, die von einer .scala verwendet wird). Wenn es jetzt funktioniert, ist es gut zu wissen. (Ich bevorzuge die kürzere Lösung und die Möglichkeit Java zu kompilieren) –

+0

Du hast recht, ich habe einen Artikel falsch gelesen und auch meine Tests waren nicht korrekt (ich dachte es funktioniert, weil es keine Fehler geworfen hat, aber das war es weil der scala Compiler, wie Sie gesagt haben, Java-Dateien parsen und ihre APIs lesen kann). Es sieht so aus, als ob die Lösung nur dann gut funktioniert, wenn \t \t das Plugin auf incremental konfiguriert ist, so dass es einen eigenständigen Zink-Compiler verwendet. Zink scheint in der Lage zu sein, sowohl Java als auch Scala zu kompilieren und deshalb funktioniert es zumindest mit den neuesten Scala-Versionen. Danke für deine Verlobung und Entschuldigung für die Verwirrung :-) –

Verwandte Themen