【问题标题】:GWT Compilation Time Performance ImprovementGWT 编译时间性能改进
【发布时间】:2012-09-04 06:07:42
【问题描述】:

我们在当前项目中使用 GWT 2.4 版。在服务器端,我们使用 Spring & Custom JDBC 框架。

我们使用 Maven 作为我们的构建工具。该应用程序正在 JBOSS 7 服务器上部署。

目前,我们将所有内容都放在一个 Eclipse 项目中。表示一个 Application.gwt.xml 文件和一个用于 spring 的 ApplicationContext.xml。我们有大约 2000 个 Java 文件,其中大约 1500 个用于 GWT 相关的源文件。

随着源文件的增多,该项目仍在增长。

我们对 Java 到 Javac [类文件] 编译时间的时间安排很好。但是当涉及到 Java 到 JavaScript 时,这是一个问题。

我们已经使用了 GWT 论坛中提到的所有 hack。

喜欢。

  1. 仅为一个本地编译
  2. 只为一个浏览器编译

但编译仍然需要 4-6 分钟。有时甚至需要 7 分钟。

关于这个问题,我想知道可以改进的选项。

我们正在考虑以这种方式拆分项目:

  • 模块 1(JAR 构建)
  • 模块 2(JAR 构建)
  • 主模块(WAR 构建)。这将包含 Application.gwt.xml 文件 这将继承模块 1 和模块 2。

现在问题来了:

1) 这会帮助我们缩短编译时间吗?

2) 如果我们只更改模块 2,然后编译模块 Main,GWT 是否仍会编译模块 1,因为它是由模块 Main 继承的?

请分享您对上述情况的看法。我们甚至尝试了 GWT 2.5 选项,但对性能改进没有帮助。

谢谢,尼拉吉·萨洛特。

【问题讨论】:

  • 你必须在这里隔离问题。完整编译需要 4-6 分钟吗?还是只是 GWT 一个?请在您的问题中分离GWT 模块和Maven 模块的概念。
  • 完整编译需要 4-6 分钟。表示使用构建 WAR 文件进行编译。

标签: gwt compilation performance


【解决方案1】:

我将首先回答您的第二个问题,因为它不是 GWT 特定的。考虑到您的项目是这样构成的:

project-root    
  |- module1 (jar)
  |- module2 (jar)
  L moduleMain (gwt + war)

如果您在module2 中进行了一些更改,并且不想重新编译module1,您可以使用选项-pl 将其从构建过程中跳过(从project-root 文件夹启动的命令):

mvn clean install -pl module2,moduleMain

这将重新编译module2,然后是moduleMain,而不重新编译module1

这会帮助我们缩短编译时间吗?

这取决于module1module2moduleMain 相比有多大...但是我使用GWT 的经验是,通常花费大量时间将java 客户端代码编译成javascript。这个操作仍然发生在你​​的moduleMain,所以我想说将你的项目分成几个模块并不足以显着缩短编译时间。

此外,我建议您使用一个配置文件来控制moduleMaingwt-maven-plugin 的激活/停用。

moduleMain的 pom.xml 中,将 GWT 插件移动到配置文件中,这样:

<profiles>
        <profile>
            <id>GWTBuild</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>gwt-maven-plugin</artifactId>
                        <version>2.4.0</version>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>compile</goal>
                                    <goal>generateAsync</goal>
                                    <goal>test</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <runTarget>com.yoururlroot/index.html</runTarget>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

然后,如果你只是想重建你的战争,因为 module2 已经改变但没有重建 module1 并且没有重新编译所有 GWT 东西,只需启动:

mvn clean install -pl module2,moduleMain -P!GWTBuild

在这个命令中,GWT插件被停用,所以maven只会重建war。

告诉我这是否适合你。

【讨论】:

  • 请这样考虑这种情况:ModuleMain 继承了模块 1 和模块 2。 ModuleMain 包含主入口点类。模块 1 和模块 2 只是带有 .gwt.xml 文件的 JAR,没有入口点。因此,假设如果我更改 Module1,那么我需要制作 JAR 并使用 Maven 在本地存储库中安装它。然后我将为 ModuleMain 构建 WAR,因为这将为我生成最终的 WAR。在这种情况下,模块 2 会再次编译吗?或不?编译意味着不是 Java 到 Javac,而是 Java 到 Javascript...我希望这能解决我的问题。
  • "请...为我生成最终的 WAR" => 这正是我的理解。 “在这种情况下,模块 2 会再次编译吗?” => 不...如果您按照我在帖子中解释的内容进行操作。但我不明白你的断言“编译意味着不是 Java 到 Javac,而是 Java 到 Javascript”...... Module2 不包含预期在 JS 中编译的代码......或者我可能对你的 pb 没有任何理解:)...
  • Module 1和Module 2都包含需要用JS编译的代码。
  • 这行不通。 gwt 需要在战争中拥有您的客户端代码。即使它有效,您也不会显着缩短构建时间,因为您仍然需要运行“编译为 js”目标。
  • 正是...即使我将项目拆分为多个模块 [GWT Modules] ,我仍然无法缩短构建时间...就像 Java 到 JS 的生成仍然会发生,即使我构建了 JAR,并最终将 JAR 包含在 WAR 文件中,并带有继承的概念......
猜你喜欢
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
相关资源
最近更新 更多