maven - 在 Vaadin 项目中使用 web.xml

标签 maven vaadin vaadin7

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

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

parent
   myapp-ui
   myapp-production
   myapp-widgetset

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

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

我只想将 web.xml 维护在一个地方。如何做到这一点?

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

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

最佳答案

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

回顾:我只想维护一个 web.xml。这应该是我的 -ui 模块中的一个,因为所有源代码通常都驻留在此处,并且 -product 模块中实际上不应该有源代码。

问题: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>

在 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 文件进行过滤)

您还需要在生产模块的 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 中看到的,我告诉 -product 模块它应该使用 -ui 项目中的 web.xml。这才是真正的技巧!您现在可以从 -生产模块中删除 web.xml 文件,因为它不再使用。

已完成的工作:

  1. 使用 Maven 过滤功能,web.xml 的内容已变得可变。当 Maven 中的生产配置文件处于事件状态时,变量 vaadin.productionmode 的设置会有所不同。
  2. -生产模块现在不再有自己的 web.xml。相反,它从 -ui 模块复制文件(复制后进行适当的过滤)。

关于maven - 在 Vaadin 项目中使用 web.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37465411/

相关文章:

java - 仅导入使用 maven 构建的库的一个配置文件

clojure - 将Clojure与Vaadin结合使用

grails - 如何在用GGTS/Eclipse创建的Grails项目中替换依赖项?

css - 如何在整个 Vaadin 7 应用程序中设置自定义字体

java - 是否可以将自定义数据添加到通知正文(链接、按钮等)

java - Vaadin 中的 session 未过期

java - 使用 BeanItemContainer 添加表列

java - @远程JNDI通信: Wildfly to JBoss AS 5. 1.0.GA

java - 如何在你的库中使用 Spring-Data 以及如何在你的项目中使用这个库?

eclipse - 自动 Maven 项目使用 Eclipse 更改分辨率