[随笔] maven scala plugin 每次总是编译全部文件

ricardo 2010-03-12
maven scala plugin 每次总是编译全部文件,哪怕只更改了其中的一个文件也是如此。请问大家有什么解决方案没有?
maven version:2.2.1
java version:1.6.0_16
OS: winXP
night_stalker 2010-03-12
不完全是 maven scala plugin 的问题。主要原因是现在的 scalac 有点笨,让它编译什么就编译什么,完全无视时间戳。 2.8.0 正式发布的时候应该会修正这个问题。。。

这个问题其实很复杂 …… 因为有些文件包含的类是相互引用的。
每个 java 文件只允许 1 个 public class / interface,简化了依赖问题,编译器很容易就找到依赖关系并重新编译适当的文件。
但是 scala 允许一个文件里包含多于 1 个的 public class,这个情况就很复杂了 …… 编译器很难得知哪些类受到了影响,只好全世界重来一遍。

另外:maven 启动那 10 秒左右很烦人,用 buildr 会比 maven 快一些 ……

题外:可以用 JavaRebel 等东西使编译自动一点。
ricardo 2010-03-12
奇怪的是当我用maven 2.0.8却只会重新编译我修改过的文件。 但是mvn scala:run 运行却不正常。如下:
Maven version: 2.0.8
Java version: 1.6.0_17
OS name: "linux" version: "2.6.24-26-server" arch: "i386" Family: "unix"


[WARNING] you don't define org.scala-lang:scala-library as a dependency of the project (注:scala-library在pom.xml里,maven 2.2.1 没这个问题)
[WARNING] Exception in thread "main" java.lang.NoClassDefFoundError: scala/Application
[WARNING] at java.lang.ClassLoader.defineClass1(Native Method)
[WARNING] at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
[WARNING] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
[WARNING] at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
[WARNING] at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
[WARNING] at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
[WARNING] at java.security.AccessController.doPrivileged(Native Method)
[WARNING] at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
[WARNING] at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
[WARNING] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
[WARNING] at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
[WARNING] at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
[WARNING] at scala_example.FirstClassFunctionsApp.main(FirstClassFunctionsApp.scala)
[WARNING] Caused by: java.lang.ClassNotFoundException: scala.Application
[WARNING] at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
[WARNING] at java.security.AccessController.doPrivileged(Native Method)
[WARNING] at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
[WARNING] at java.lang.ClassLoader.loadClass(ClassLoader.java:303)
[WARNING] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
[WARNING] at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
[WARNING] at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316)
[WARNING] ... 13 more

Thanks for your answer
ricardo 2010-04-26
原来这个参数可以解决这个问题  recompileMode (all/modified-only)
Global site tag (gtag.js) - Google Analytics