我有一个基于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
答案 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
文件,因为它已不再使用。
取得的成就:
vaadin.productionmode
的设置方式不同。答案 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。
如果您试图摆脱web.xml,它取决于您,但是每个Web应用程序实际上并不需要多于一个,如果您使用最近的servlet容器,那么它应该是#39如果没有web.xml,你可以做很多事情。