我有一个基于 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
文件,因为它不再使用。
已完成的工作:
- 使用 Maven 过滤功能,web.xml 的内容已变得可变。当 Maven 中的生产配置文件处于事件状态时,变量
vaadin.productionmode
的设置会有所不同。 - -生产模块现在不再有自己的 web.xml。相反,它从 -ui 模块复制文件(复制后进行适当的过滤)。
关于maven - 在 Vaadin 项目中使用 web.xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37465411/