【问题标题】:Using web.xml in Vaadin project在 Vaadin 项目中使用 web.xml
【发布时间】:2016-05-26 15:40:37
【问题描述】:

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

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

parent
   myapp-ui
   myapp-production
   myapp-widgetset

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

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

我想只在一次地方维护web.xml。该怎么做?

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

<context-param>
  <param-name>productionMode</param-name>
  <param-value>true</param-value>
</context-param>

【问题讨论】:

    标签: maven vaadin vaadin7


    【解决方案1】:

    结果证明这是一个 Maven 问题,而不是 Vaadin 问题。我还是会在 Vaadin 的背景下回答这个问题。

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

    问题:maven-war-plugin 的覆盖功能不会将覆盖中的 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>
     ...
    

    然后在我添加的 -ui 模块的 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 模块复制文件(在复制后进行适当的过滤)。

    【讨论】:

    • Maven 很强大,Maven 很棘手。您可以使用 Maven 配置文件进一步配置您的解决方案。当您使用 -P 开关激活特定配置文件时,您可以非常轻松地打开和关闭生产模式。 maven.apache.org/guides/introduction/…
    【解决方案2】:

    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 容器,不应该有太多您不能做的事情不用 web.xml。

    【讨论】:

    • Can't use annotations as annotations 没有支持 any web.xml 功能,当然不是我想要的。此外,当我为生产构建时,我自然希望productionMode=true 在那里。
    • IMO:当有人在帮助你时,对答案的评分对我来说是轻率的,也不是很有建设性。对于 web.xml 和注释,已经有问题可以帮助您转发 stackoverflow.com/questions/17236743/…
    • 没有给你打分! (不明白为什么有人这样做)
    • “如果你使用注释,你可以完全摆脱 web.xml”。不是这样。有些事情不能通过注释来完成。像form based auth&lt;login-config&gt;&lt;auth-method&gt; 一样不能通过注解来完成。
    • 我给了你一个赞成票,以反对给你一个不公平的反对票的人。感谢您的输入。赞赏。
    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多