如何将Vaadin作为WildFly模块使用?WAR瘦身及编译问题求助
Vaadin 14.6.1作为WildFly 24.0.1模块部署的解决方案
针对你遇到的WAR包过大、设provided后前端编译失败的问题,以下是可行的分步解决方案:
一、解决Maven前端编译依赖问题
当Vaadin依赖设为provided时,前端构建插件无法在编译期找到Vaadin类,导致报错。可以通过两种方式处理:
方式1:编译保留依赖,打包时排除
使用Maven插件在编译阶段保留Vaadin依赖的compile scope,打包阶段自动排除这些JAR:
在pom.xml中添加如下插件配置:
<build> <plugins> <!-- 复制Vaadin依赖到临时目录,方便后续制作WildFly模块 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-vaadin-deps</id> <phase>prepare-package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <includeGroupIds>com.vaadin,com.vaadin.flow</includeGroupIds> <outputDirectory>${project.build.directory}/vaadin-libs</outputDirectory> </configuration> </execution> </executions> </plugin> <!-- 打包WAR时排除Vaadin相关JAR --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <packagingExcludes>WEB-INF/lib/com.vaadin*.jar,WEB-INF/lib/com.vaadin.flow*.jar</packagingExcludes> </configuration> </plugin> </plugins> </build>
这样编译时Vaadin依赖在classpath中,能正常执行build-frontend目标,最终WAR包不会包含这些JAR。
方式2:为前端插件单独添加依赖
将主Vaadin依赖设为provided,同时在vaadin-maven-plugin中添加Vaadin依赖,确保插件执行时能访问所需类:
<dependencies> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-core</artifactId> <version>14.6.1</version> <scope>provided</scope> </dependency> <!-- 其他Vaadin依赖同理设为provided --> </dependencies> <build> <plugins> <plugin> <groupId>com.vaadin</groupId> <artifactId>vaadin-maven-plugin</artifactId> <version>14.6.1</version> <executions> <execution> <goals> <goal>build-frontend</goal> </goals> </execution> </executions> <dependencies> <!-- 插件自身需要的Vaadin依赖 --> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-core</artifactId> <version>14.6.1</version> </dependency> </dependencies> </plugin> <!-- 同样添加war插件排除配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <packagingExcludes>WEB-INF/lib/com.vaadin*.jar,WEB-INF/lib/com.vaadin.flow*.jar</packagingExcludes> </configuration> </plugin> </plugins> </build>
二、创建WildFly Vaadin模块
- 在WildFly安装目录下,创建模块目录:
modules/system/layers/base/com/vaadin/main(路径不存在则逐层新建)。 - 将所有Vaadin相关JAR包(包括项目依赖的transitive JAR,比如从
target/vaadin-libs目录复制)放到这个目录。 - 创建
module.xml文件,定义模块信息和依赖:
<?xml version="1.0" encoding="UTF-8"?> <module name="com.vaadin" xmlns="urn:jboss:module:1.9"> <resources> <!-- 列出所有Vaadin相关JAR,示例如下,根据实际依赖补充 --> <resource-root path="vaadin-core-14.6.1.jar"/> <resource-root path="vaadin-flow-server-14.6.1.jar"/> <resource-root path="vaadin-flow-client-14.6.1.jar"/> <resource-root path="vaadin-spring-boot-starter-14.6.1.jar"/> <!-- 其他依赖JAR如jackson、slf4j等如果需要也可添加,或依赖WildFly已有模块 --> </resources> <dependencies> <!-- 必须的WildFly核心模块依赖 --> <module name="javax.api"/> <module name="javax.servlet.api"/> <module name="javax.annotation.api"/> <module name="javax.validation.api"/> <module name="org.slf4j"/> <module name="com.fasterxml.jackson.core.jackson-databind"/> <module name="org.springframework.spring-core" optional="true"/> <!-- 如果用了Spring --> <!-- 根据Vaadin依赖的其他模块补充 --> </dependencies> </module>
注意:如果Vaadin依赖的某些JAR已经是WildFly的内置模块(比如jackson),不需要重复添加,直接依赖对应模块即可。
三、配置WAR包引用WildFly模块
在项目的src/main/webapp/WEB-INF目录下创建jboss-deployment-structure.xml,告诉WildFly当前WAR需要依赖Vaadin模块:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies> <module name="com.vaadin" export="true"/> <!-- export确保模块类能被应用访问 --> </dependencies> </deployment> </jboss-deployment-structure>
确保Maven打包时将这个文件包含到WAR中,可通过war插件的webResources配置确认(如果之前没加,可补充到war插件配置里)。
四、验证部署
- 执行
mvn clean package,检查生成的WAR包,确认WEB-INF/lib下没有Vaadin相关JAR。 - 将WAR包部署到WildFly,启动服务器后测试应用功能。如果出现
ClassNotFoundException,说明module.xml中遗漏了JAR或模块依赖,需要补充对应内容。
内容的提问来源于stack exchange,提问作者Inercio Belton
相关产品推荐
相关产品推荐

