在Vaadin项目中使用web.xml

时间:2016-05-26 15:40:38

标签: maven vaadin vaadin7

我有一个基于Maven的Vaadin项目。它基于Maven vaadin-archetype-application-multimodule原型(link)。

这意味着我有一个像这样的结构:

parent
   myapp-ui
   myapp-production
   myapp-widgetset

在我的项目中,我必须自定义web.xml,因为我不需要以编程方式或注释方式完成。不喜欢它,但它就是这样。

我遇到的问题是,似乎我必须在两个地方维护web.xml:在 myapp-ui 模块中,然后在 myapp-production 模块。真??

我想只在{1}}保留一次。怎么做?

对于那些不了解Vaadin的人:web.xml的两个版本之间的唯一区别是生产模块中的那个必须添加以下内容:

web.xml

2 个答案:

答案 0 :(得分:2)

这被证明是一个Maven问题,而不仅仅是Vaadin问题。我仍然会在Vaadin的背景下回答这个问题。

回顾:我想只保留一个web.xml。这应该是我的-ui模块中的那个,因为所有源代码通常都驻留在那里,并且-production模块中应该没有源代码。

问题:maven-war-plugin的叠加功能不会将web.xml中的web.xml复制或合并到目标中。

我已经通过几个步骤解决了这个问题。首先,我使用以下内容增强了-ui模块中的web.xml:

 ...
   <context-param>
      <description>Vaadin turn debugging mode on/off</description>
      <param-name>productionMode</param-name>
      <param-value>${vaadin.productionmode}</param-value>
   </context-param>
 ...

然后在-u模块的pom.xml中我添加了:

<properties>
     ...
    <vaadin.productionmode>false</vaadin.productionmode>
</properties>

并在-production模块的pom.xml中添加:

 <profiles>
    <profile>
        <id>production</id>
        <properties>
            <vaadin.productionmode>true</vaadin.productionmode>
        </properties>
        ...

现在我们有一个Maven属性vaadin.productionmode,默认情况下它的值为false,除非生产配置文件处于活动状态,在这种情况下值为true。我们还为Maven过滤准备了web.xml。但我们还需要激活过滤(-ui模块的POM):

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
       ...
       <!-- Do filtering on web.xml -->    
       <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
    </configuration>

(除非您设置此配置参数,否则Maven WAR插件不会对web.xml文件进行过滤)

您还需要在-production模块的POM上激活web.xml过滤:

 <profiles>
    <profile>
        <id>production</id>
        ...
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    ...
                    <configuration>
                        <!-- Do filtering on web.xml -->    
                        <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>

                        <!-- Use web.xml from UI module -->
                        <webXml>../myapp-ui/src/main/webapp/WEB-INF/web.xml</webXml>

                        <overlays>
                           ...

最后,正如您在上面的XML中所看到的,我告诉-production模块它应该使用-ui项目中的web.xml。而这才是真正的伎俩!您现在可以从-production模块中删除web.xml文件,因为它已不再使用。

取得的成就:

  1. 使用Maven过滤功能,web.xml的内容已变为可变内容。当生产配置文件在Maven中处于活动状态时,变量vaadin.productionmode的设置方式不同。
  2. -production模块现在不再拥有自己的web.xml。而是从-ui模块复制文件(在复制后正确过滤)。

答案 1 :(得分:1)

productionMode = false只是一种关闭调试功能的方法。没有必要有两个web.xml - 如果你使用注释,你可以完全摆脱web.xml。

可以在您的应用程序代码上使用@VaadinServletConfiguration注释,在这种情况下,不能通过web.xml来关闭调试模式。

请在此处查看最新的官方文档:https://vaadin.com/docs/-/part/framework/advanced/advanced-debug.html

这里的示例代码显示了如何使用@WebServlet和@VaadinServletConfiguration注释来注释vaadin servlet。

https://github.com/vaadin/serverside-elements/blob/master/elements-demo/src/main/java/org/vaadin/elements/demo/Demo.java

如果您试图摆脱web.xml,它取决于您,但是每个Web应用程序实际上并不需要多于一个,如果您使用最近的servlet容器,那么它应该是#39如果没有web.xml,你可以做很多事情。