如何使用 Maven 在 Vaadin 7 中只编译必要的小部件?

2022-09-04 00:46:56

我是Vaadin框架的新手,它看起来非常有趣,使用eclipse和maven来开发和构建我的应用程序,我发现很烦人,每次我进行mvn干净安装时,构建应用程序都需要很长时间,我发现这是因为它编译了整套小部件。

即使我只在布局中使用按钮,构建应用程序也需要花费很多时间。

我已经在互联网上研究了一段时间和2本书,但找不到足够的信息,关于如何使它只编译我正在使用的组件,而不是整个集合。

我使用 maven 原型创建了这个项目:

mvn archetype:generate -DarchetypeGroupId=com.vaadin -DarchetypeArtifactId=vaadin-archetype-application -DarchetypeVersion=7.1.9

我确信每次构建战争时都会编译小部件集,当我进行mvn清理时,它会删除目录:/src/main/webapp/VAADIN/widgetsets和/src/main/webapp/VAADIN/gwt-unitCache

当我运行mvn安装时,构建将持续超过3分钟:

...
[INFO]    Compiling 6 permutations
[INFO]       Compiling permutation 0...
[INFO]       Process output
[INFO]          Compiling
[INFO]             Compiling permutation 1...
[INFO]       Process output
[INFO]          Compiling
[INFO]             Compiling permutation 3...
[INFO]       Process output
[INFO]          Compiling
[INFO]             Compiling permutation 2...
[INFO]       Compiling permutation 4...
[INFO]          Compiling
[INFO]             Compiling permutation 5...
[INFO]    Compile of permutations succeeded
[INFO] Linking into /.../example/src/main/webapp/VAADIN/widgetsets/com.my.example.AppWidgetSet; Writing extras to /.../example/target/extra/com.my.example.AppWidgetSet
[INFO]    Link succeeded
[INFO]    Compilation succeeded -- 167.103s
[INFO] 
[INFO] --- maven-war-plugin:2.2:war (default-war) @ ade ---
[INFO] Packaging webapp
[INFO] Assembling webapp [example] in [/.../example/target/example-0.1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [/.../example/src/main/webapp]
[INFO] Webapp assembled in [562 msecs]
[INFO] Building war: /.../example/target/example-0.1.0-SNAPSHOT.war
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ ade ---
[INFO] Installing /.../example/target/example-0.1.0-SNAPSHOT.war to /.../example/0.1.0-SNAPSHOT/example-0.1.0-SNAPSHOT.war
[INFO] Installing /.../example/pom.xml to /.../example/0.1.0-SNAPSHOT/example-0.1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3:03.768s
[INFO] Finished at: Fri Jan 10 00:10:45 EST 2014
[INFO] Final Memory: 16M/81M
[INFO] ------------------------------------------------------------------------

在此之后,将再次生成包含以下目录的目录 /src/main/webapp/VAADIN/widgetsets:

WEB-INF             
com.my.example.AppWidgetSet

它还生成 /src/main/webapp/VAADIN/gwt-unitCache


答案 1

您是否需要自定义微件集?如果您没有使用任何小部件插件,并且由于您是Vaadin的新手,我假设您还没有创建自己的小部件(?),您可以简单地使用Vaadin提供的预编译小部件集。为此,请从项目中删除任何 xxx.gwt.xml 文件,并将 web.xml 中对该文件的引用替换为 com.vaadin.DefaultWidgetset。

网页.xml:

<init-param>
    <name>widgetset</name>
    <value>com.vaadin.DefaultWidgetSet</value>
</init-param>

pom.xml:

<dependency>
    <groupId>com.vaadin</groupId>
    <artifactId>vaadin-client-compiled</artifactId>
    <version>7.1.9</version>    <!-- or whatever version you're using -->
</dependency>

如果您确实需要一个自定义小部件集(如果您现在不需要,那么您很可能还需要一个),请帮自己一个忙,并将其放在一个单独的项目中。根据我的经验,小部件集很少变化,所以为什么要将其包含在不断变化的项目中。上面提到的默认小部件集,由Vaadin提供,是构建一个窗口小部件的完美蓝图。只需构建自己的结构,并从vaadin-client编译.jar复制其结构。你可以使用你最喜欢的maven构建助手,我的是组装。只需创建一个 maven 项目,设置 pom.xml,添加一个 xxx.gwt.xml 并确保 web.xml 包含对它的引用。我自己的设置看起来就像你在下面看到的一样。

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <name>MyWidgetset</name>
    <groupId>com.company</groupId>
    <artifactId>mywidgetset</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <vaadin.version>7.1.9</vaadin.version>
        <vaadin.plugin.version>7.1.9</vaadin.plugin.version>
    </properties>

    <dependencies>
        <!-- vaadin -->
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-client</artifactId>
            <version>${vaadin.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.vaadin</groupId>
            <artifactId>vaadin-client-compiler</artifactId>
            <version>${vaadin.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- custom widgets (NOTE: addons without a widget do not belong here) -->
        <dependency>
            <groupId>org.vaadin.addons</groupId>
            <artifactId>filteringtable</artifactId>
            <version>0.9.3.v7</version>
        </dependency>
        <dependency>
            <groupId>org.vaadin.addons</groupId>
            <artifactId>popupbutton</artifactId>
            <version>2.3.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- vaadin update widgetset -->
            <plugin>
                <groupId>com.vaadin</groupId>
                <artifactId>vaadin-maven-plugin</artifactId>
                <version>${vaadin.plugin.version}</version>

                <configuration>
                    <extraJvmArgs>-Xmx512M -Xss1024k</extraJvmArgs>
                    <webappDirectory>${basedir}/target/VAADIN/widgetsets</webappDirectory>
                    <hostedWebapp>${basedir}/target/VAADIN/widgetsets</hostedWebapp>
                    <force>false</force>
                    <strict>true</strict>
                    <noServer>true</noServer>
                    <compileReport>true</compileReport>
                    <style>OBF</style>
                    <runTarget>http://localhost:8080/</runTarget>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>resources</goal>
                            <goal>update-widgetset</goal>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>src/main/resources/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

    <repositories>
        <repository>
            <id>vaadin-addons</id>
            <url>http://maven.vaadin.com/vaadin-addons</url>
        </repository>
    </repositories>
</project>

组装.xml:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

    <id>build-my-widgetset-jar</id>
    <formats>
        <format>jar</format>
    </formats>

    <includeBaseDirectory>false</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <directory>${basedir}/target/VAADIN/widgetsets</directory>
            <outputDirectory>/VAADIN/widgetsets</outputDirectory>
            <excludes>
                <exclude>WEB-INF/</exclude>
            </excludes>
        </fileSet>
    </fileSets>
</assembly>

MyWidgetset.gwt.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC
    "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN"
    "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distro-source/core/src/gwt-module.dtd">
<module>
    <inherits name="com.vaadin.DefaultWidgetSet" />

    <inherits name="org.tepi.filtertable.gwt.FilterTableWidgetset" />

    <inherits name="org.vaadin.hene.popupbutton.widgetset.PopupbuttonWidgetset" />

</module>

网页.xml:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <display-name>MyWidgetset</display-name>

    <servlet>
        <servlet-name>MyWidgetset</servlet-name>
        <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
        <init-param>
            <param-name>ui</param-name>
            <param-value>com.company.mywidgetset.App</param-value>    <!-- use it for testing the widgetset-->
        </init-param>
        <init-param>
            <param-name>widgetset</param-name>
            <param-value>com.company.mywidgetset.MyWidgetset</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyWidgetset</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

项目结构:

|   pom.xml
|
\---src
    +---main
    |   +---java
    |   |   \---com
    |   |       \---company
    |   |           \---mywidgetset
    |   |                   App.java
    |   |                   MyWidgetset.gwt.xml
    |   |
    |   +---resources
    |   |       assembly.xml
    |   |
    |   \---webapp
    |       \---WEB-INF
    |               web.xml
    |
    \---test
        \---java

构建它,使用jar作为项目中的依赖项,然后就完成了。这将使您永久摆脱GWT称之为“widgetset编译”的大麻烦。


答案 2

要减少小部件集的编译时间,您可以并遵循 .gwt.xml 文件并取消注释 set-property 标记。

<!-- Uncomment the following to compile the widgetset for one browser only. 
    This can reduce the GWT compilation time significantly when debugging. The 
    line should be commented out before deployment to production environments. 
    Multiple browsers can be specified for GWT 1.7 as a comma separated list. 
    The supported user agents at the moment of writing were:   ie6,ie8,gecko,gecko1_8,safari,opera 
    The value gecko1_8 is used for Firefox 3 and later and safari is used for 
    webkit based browsers including Google Chrome. -->
<!-- <set-property name="user.agent" value="gecko1_8"/> -->

要创建一个新的vaadin-maven项目,你可以尝试使用vaadin 7插件新建项目向导,它将创建一个具有ivy依赖管理的新项目,创建项目后,右键单击该项目并删除常春藤依赖管理,然后右键单击-->配置-->将其转换为maven项目将向项目添加maven依赖管理。


推荐