Java 编译速度

Java Compilation Speed

我有一个 Java 项目,大约 2400 类。它们主要是使用来自 XML 模式的 XJC 生成的,带有一些扩展。

编译需要很长时间,大约 20 分钟,我想知道我是否可以做些什么来改进它?

一个类似的项目有大约一半的生成数 类,但有几个手写的 类,总共约 3000 个 类。这会在 2-5 分钟内完成编译。

我正在使用 Java 8(Windows 上的 1.8.0_92)进行编译,但使用的是源版本和目标版本 6(因此问题不在于慢类型系统Java 8).使用 Maven-compiler-plugin 3.5.1 使用 Maven 3.3.3 完成编译。我正在从 Maven 中分叉编译器并使用 maxmem 2048m。

生成的 类 通常很小,但我有一个巨大的访问者接触了所有生成的 类 (因此存在一对一的依赖关系和所有对一的依赖关系)。我对此无能为力。

从 "mvn clean install" 切换到 "mvn install"(或只是 "mvn compile")会有所帮助,但这并不总是一个选项(基本上,Eclipse 会处理已编译的文件,所以可以肯定测试 运行 好的,我需要清理 运行ning 测试,就像提交之前一样。

我没有任何监视编译单元文件的后台进程(如 Eclipse/SourceTree),但我有一个病毒扫描程序(我无法关闭)。好像大部分时间都花在javac上了。

javac 中是否有某些东西在相互依赖的数量上是超线性的类?或者有什么办法可以绕过这些编译时间吗?

E: 我得到了 运行ning Maven 多线程的建议;不幸的是我已经尝试过了,但它并没有真正帮助,因为它是一个有很多相互依赖的单模块项目 类.

E2:我将项目拆分为一个仅包含 JAXB 代码的模块和另一个包含主要代码的模块。事实证明,JAXB 代码不是罪魁祸首。我 运行 Tesla Maven Profiler 并且它只是确认编译是问题;相关部分:

org.apache.maven.plugins:maven-compiler-plugin:3.5.1 (default-compile) 18m 48s
org.apache.maven.plugins:maven-compiler-plugin:3.5.1 (default-testCompile) 14s 770ms
org.apache.maven.plugins:maven-surefire-plugin:2.12.4 (default-test) 1m 51s
org.apache.maven.plugins:maven-war-plugin:2.0.1 (default-war) 14s 635ms

我对最后三个的持续时间完全满意。

这只是 1000 个 Java 类,所有这些都继承自使用 JAXB 生成的普通访问者。我的编译配置:

              <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>
                    <configuration>         
                          <fork>true</compiler>
                          <source>${compileSource}</source>
                          <target>${compileSource}</target>
                          <meminitial>512m</meminitial>
                          <maxmem>2048m</mexmem>
                          <encoding>UTF-8<eencoding>
                    </configuration>
              </plugin>

(编译源为 1.6)

您可以使用从 3 开始引入的多线程选项,不确定它如何改进您的情况,因为您只有一个模块,可能是您的测试运行速度更快一些,但您可以使用此选项进行检查

mvn clean install -T5C

这里是 link 解释并行构建

解决你的问题的一种方法,可能是拆分你的maven项目,只为生成的类创建一个,这个不需要每次都重建,只有当xsd改变时.并让它成为另一个项目的依赖。

事实证明,问题确实出在 javac 中。 Javac 不能很好地处理 class 具有大量重载方法的 es (http://mail.openjdk.java.net/pipermail/compiler-dev/2013-May/006339.html)。

我正在生成一个访问者,它为每个 class (1100+) 生成一个 visit(...) 方法,导致编译每个导数需要几秒钟。因为我有数百种这样的方法,所以这些都加起来了。

我的访客是使用 jaxb-visitor (https://github.com/massfords/jaxb-visitor) and fixed the issue by including the typename in generated methods using my own fork of the code (https://github.com/klafbang/jaxb-visitor) 生成的。

编译时间从 40 分钟缩短到 2 分钟。