2015-11-20 23 views
9

Bugün hem Java hem de Scala kodunu içeren bir maven projesi kurmak için uygun bir çözüm bulmaya çalışıyorum (aralarında iki yönlü bağımlılıklar var). 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/, resmi scala:Maven: Bir projede Java ve Scala'yı karıştırma

çözümler Ben varsayılan ayar maven derleyici eklenti önce (örneklere çalışacak şekilde process-resources fazda Scala-maven-eklentisi veya maven-Scala-eklentisi çağırma oluşur genellikle buldum -maven-eklenti sayfası: http://davidb.github.io/scala-maven-plugin/example_java.html). şöyle çözüme götürür

:

<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> 

Bu çözümlerin iyi çalışıyor - Scala derleme process-resources fazda çağrılır ve Java ve Scala kod böylece .class dosyaları hem zaman hepsi hazır derler maven derleyici eklentisi compile fazında çalışır. Sorun şu ki bu çözüm bana temiz görünmüyor. Derleme aşamasından önce Scala derleme sürecini başlatmak için sadece maven derleyici eklentisi "hacky" görünmeden önce çalıştığından emin olun.

Scala derleyicisi Java sınıflarını zaten derler, bu yüzden varsayılan maven derleyici eklentisini tamamen kapatabilirim ve Scala derleyicisinin compile aşamasında çalışabildiğini düşündüm. Bu yapılandırma olmasına rağmen bana daha temiz görünüyor biraz daha uzun: Bu çözüm blog yayınlarında veya resmi eklenti sayfasında tavsiye biri değil neden

<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> 

merak ediyorum. Bu yaklaşımın herhangi bir olumsuz tarafı var mı? İlk çözüm yerine ikinci çözümleri kullanmayı beklemem gereken herhangi bir sorun var mı?

cevap

8
  • Evet, çözüm "hacky" ama maven-derleyici-eklentisi daima derleme aşamasında çalışan ilk eklentidir (sert maven içine kodlanmış gibi oluyor).
  • Scala 2.11 ile test etmedim, ancak scalac'ın önceki sürümü .java'yı .class'a derlemediler (yalnızca ayrıştırırlar). ve scala-maven-plugin 2.7'den beri "her scala sürümü" ile çalışacak şekilde üretilmiştir.
+0

Teşekkürler, eklenti yazarının kendisinden bir cevap almak çok güzel :-) Geriye dönük uyumluluğu hesaba katmadım. Scala derleyicisi, Scala 2.7.2'den beri (http://www.codecommit.com/blog/scala/joint-compilation-of-scala-and-java-sources) Java dosyalarını derler. 'Benim' çözümümüzü farklı Scala sürümleriyle test ettim ve yalnızca Scala> = 2.7.2 ile çalıştığını doğruladım. –

+2

Sanırım makaleyi okuyorsunuz, scalac java derlemiyor ama okuyabiliyor. (ve sadece bir .scala tarafından kullanılan sınıf için iirc). Her neyse, eğer şimdi çalışıyorsa, bilmek güzel. (Kısa çözüm ve java derleme seçeneğini tanımlama yeteneğini tercih ederim) –

+0

Haklısınız, bir makaleyi yanlış okudum ve ayrıca testlerim doğru olmadı (herhangi bir hata atmadığı için işe yaradığını düşündüm ama Çünkü scala derleyicisi, dediğiniz gibi java dosyalarını ayrıştırabilir ve API'lerini okuyabilir). Çözüm, yalnızca \t \t eklentisinin incremental olarak yapılandırıldığı zaman bağımsız bir çinko derleyiciyi kullanmasıyla iyi çalışır. Çinko hem java hem de scala derleyebildi gibi görünüyor ve bu yüzden en azından en yeni scala sürümleriyle çalışıyor. Senin nişan için teşekkürler ve karışıklık için özür dilerim :-) –

İlgili konular