Как я могу скомпилировать только необходимые виджеты в Vaadin 7 с Maven?

Я новичок в каркасе Vaadin, который мне очень интересен, используя eclipse и maven для разработки и создания моего приложения. Я нахожу довольно раздражающим, что каждый раз, когда я делаю mvn clean install, для создания приложения потребуется очень много времени, Я обнаружил, что это связано с тем, что он компилирует весь набор виджетов.

Даже если я использую кнопку в моем макете, это займет много времени на создание приложения.

Я исследовал некоторое время в Интернете и 2 книгах, но не могу найти достаточно информации о том, как заставить его только компилировать компоненты, которые я использую, а не весь набор.

Я создал проект, используя архетип maven:

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

Я уверен, что widgetset скомпилируется каждый раз, когда я создаю войну, когда я делаю mvn clean, он удаляет каталог:/src/main/webapp/VAADIN/widgetsets и /src/main/webapp/VAADIN/GWT -unitCache

Когда я запускаю mvn install, сборка будет длиться более 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.

web.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-client-compiled.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>

assembly.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>

web.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

Создайте его, используйте банку в качестве зависимости в своем проекте, и все готово. Это окончательно освободит вас от большой боли в том, что GWT вызывает "сборку виджетов".

Ответ 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, вы можете попробовать использовать новый проект waadin 7 plugin new project wizard, который создаст новый проект с управлением зависимостью плюща, после создания проекта, щелкните правой кнопкой мыши на проекте и удалите управление зависимостью плюща, а затем щелкнуть правой кнопкой мыши → configure → преобразовать его в проект maven, добавит управление зависимостями maven в проект.

Ответ 3

Просто не компилируйте любой виджет, используйте его по умолчанию; для этого вы должны установить следующие файлы: web.xml:

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

Или в реализации UI для вашего проекта:

/**
 * Initial view in Vaadin
 */
@Theme("valo") 
@Widgetset("com.vaadin.DefaultWidgetSet")
public class MainUI extends UI
{

Наконец, в pom.xml содержатся только эти зависимости:

    <!-- Vaadin dependencies -->
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-server</artifactId>
        <version>${vaadin.version}</version>
    </dependency> 
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-client-compiled</artifactId>
        <version>${vaadin.version}</version> 
    </dependency>   
    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-themes</artifactId>
        <version>${vaadin.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version> 
    </dependency> 

Ничего другого. Я решил с ними, надеюсь, вы тоже.

Ответ 4

Если вы устали от постоянного компиляции/перекомпиляции виджетами, Я предлагаю вам использовать CDN Viritin Magic"

Преимущества:

  • Нет @Widgetset
  • нет необходимости в maven-vaadin-plugin
  • Уменьшает время компиляции в N раз.

Примечание 1 (для пользователей загрузки Vaadin Spring):
После успешного прохода по учебному курсу (не запускайте mvn clean install еще!)
Вы должны определить еще одну вещь в классе YourAppNameApplication:

@Bean
public in.virit.WidgetSet viritinCdnInitializer() {
    return new in.virit.WidgetSet();
}

Примечание 2: Хорошо использовать вместе с spring-boot-maven-plugin