使用maven加速开发3

时间:2011-02-17 14:17:57

标签: java compilation maven-3

到目前为止,我找到了两种使用maven3运行程序的方法:

  1. $ mvn exec:exec -Dexec.args='...'
  2. $ mvn assembly:assembly && java -cp all-with-dependecies.jar example.Main ...
  3. 前者使用mvn的JVM来捕获异常并且启动非常慢。后者也很慢,因为它必须构建一个大罐并运行测试。

    我喜欢$ mvn compile && java -cp $CLASSPATH example.Main。由于通常CLASSPATH在运行之间是恒定的,我只需要担心它一次。

    我的问题是你如何在开发周期变化,编译,测试中加快编译?

8 个答案:

答案 0 :(得分:3)

您可以尝试Maven Shell。模糊说:

  

“Maven Shell是Maven的CLI界面,可以实现更快的周转,以及与存储库和项目的更多智能交互。使用Maven Shell,您将能够加快构建速度,因为项目信息和Maven插件被加载到一个总是就绪的JVM实例中,该实例可以执行Maven构建。“

答案 1 :(得分:2)

不经常使用mvn命令行,而是使用像 Eclipse 这样的IDE来快速测试增量更改。

Eclipse逐步构建,即它只构建更改,因此速度更快。

答案 2 :(得分:2)

您可以使用Maven Dependency Plugin构建类路径,然后重复使用它:

$ mvn dependency:build-classpath -Dmdep.outputFile=cp.txt
$ export CLASSPATH=target/classes:`cat cp.txt`
...
$ mvn compile && java -cp $CLASSPATH example.Main

答案 3 :(得分:0)

您可以通过以下选项跳过测试:-Dmaven.test.skip=true

为什么你认为启动一个新的JVM比在Maven的JVM中运行程序要快?它更可能恰恰相反。

编辑:另一种加快开发周期的简单方法:使用--offline选项,除非您更改依赖项。

答案 4 :(得分:0)

我最后一次创建命令行工具时,我使用依赖插件将所有依赖项jar复制到目录(例如target / dist / lib),在Manifest文件中配置了classpath和main类(Maven Jar插件) 。然后我可以用:

执行应用程序

java -jar myJar.jar

答案 5 :(得分:0)

Eclipse之外的另一个选择是使用JRebel,这将有效地热交换您的代码,这样您就可以保持程序一直运行。

不幸的是JRebel除非你的开源或使用Scala,否则不是免费的。

如果您使用Eclipse(或IntelliJ)并在调试模式下运行程序,您也可以热插拔代码,但不能添加或删除方法。

如果您想立即获得反馈,我发现这两种方法在Java环境中效率最高。

最后一个选项是配置Maven to use the Eclipse compiler,它比openjdk编译器更快(假设)。

答案 6 :(得分:0)

如果您需要实现命令行工具,请查看maven appassembler plugi n,这在这种情况下非常有用。与maven-assembly有关,您可以创建一个.tar.gz / zip存档,可以解压缩并启动应用程序。

答案 7 :(得分:0)

  • 为所有构建时依赖项创建单个模块(注释,嵌入式tomcat,代码生成器等。构建一次并附加到编译器插件,使它们位于所有模块的构建路径上

  • 创建一个小的共享配置并在构建时在每个模块中解压缩(检查样式配置,记录配置等)

  • 将maven插件放入他们自己的个人配置文件中,可根据需要及时引入。例如检查样式,findbugs,JavaDoc,surefire,故障安全,代码签名等。您的正常构建应该使用尽可能少的插件。这确实有助于排除故障,因为任何插件都可以使用-P命令行选项单独启用

  • 避免编译器插件上的fork配置,它可以使你的构建时间加倍。如果你需要-parameters,那么只需要为需要它的类分叉一次。

  • 编写测试以便它们可以并行运行。没有测试应该花费超过一秒钟。

  • 使用-T 1C选项并行构建

  • 使用嵌入式版本的tomcat而不是tomcat插件来启动tomcat进行集成测试。避免多次启动tomcat。

  • 排除任何不需要在tomcat配置属性中扫描的jar。

  • 将您的项目构建为在其父pom下的平衡树分组相关组件。

最重要的是您的BOM POM模块,共享资源模块,共享构建路径模块。一旦你把所有事情都组织起来,你很少建立这些。

接下来是您的热门应用pom,其中包含以下父母poms

- 没有依赖关系的低级别模块。

-Gateway模块,包括http客户端库和接口模块。

-Biz服务模块

-Containers - tomcat,Spring,DropWizzard等。

-Packages - ubber jars,zips

-Runtimes - Rpms,可执行的jar

Poms依赖项应始终指向更高级别的poms以避免循环依赖

较慢的构建工件应该是最后的,这样您就可以在不必等待慢速打包的情况下工作。

你应该能够在大约5秒钟内构建任何组,在5秒内构建你的战争,在10秒内用弹簧启动tomcat,最糟糕的情况是20秒迭代。

  • maven编译器是快速且增量的,因此尽量避免生成任何强制重新编译的代码

  • 为您的测试创建一个小型DSL和解释器。我们已经看到这种方法的运行速度是junit的两倍。

我只是使用这些技术将我们的大型完整版本从5分钟到45秒。这是很多工程,但值得。这种方法适用于标准maven发布插件,使故障排除更加容易。

祝你好运。 它永远不够快

PS PCIe SSD也是一个很大的帮助