多模块Maven应用在OpenLiberty开发模式下依赖路径错误求助
你的思路是对的——OpenLiberty应该以EAR作为核心部署单元来加载依赖,而非单独的EJB模块。下面是具体的解决步骤:
一、修正Liberty开发模式的部署目标
Liberty开发模式(mvn liberty:dev)默认会基于当前执行命令的模块加载资源,你需要确保它指向EAR模块而非EJB模块:
- 切换到EAR模块目录下执行开发模式命令:
cd ear mvn liberty:dev
- 或者在EAR模块的
pom.xml中明确配置liberty-maven-plugin,指定加载当前EAR模块:
<plugin> <groupId>io.openliberty.tools</groupId> <artifactId>liberty-maven-plugin</artifactId> <version>3.10.0</version> <configuration> <serverName>myServer</serverName> <!-- 指定要部署的EAR构件 --> <appArtifact> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> <version>${project.version}</version> <type>ear</type> </appArtifact> <!-- 可选:指定server.xml的位置 --> <serverXml>${project.basedir}/src/main/liberty/config/server.xml</serverXml> </configuration> </plugin>
二、解决
CWWKM2179W警告 这个警告是因为你手动在server.xml配置了绝对路径的EAR,但Liberty Maven插件的部署逻辑与手动配置冲突。解决方法:
推荐方案:移除
server.xml中的手动配置
删除server.xml里的<enterpriseApplication>节点,让Liberty插件自动处理EAR的部署——插件会自动将构建好的EAR部署到服务器的dropins或apps目录,同时自动生成对应的配置,避免路径冲突。如果必须保留手动配置
改用相对于Liberty服务器的路径或Maven变量,避免绝对路径:
<enterpriseApplication id="my-app" name="my-app" contextRoot="/" location="${server.config.dir}/apps/${project.artifactId}-${project.version}.ear"/>
三、解决
SRVE9967W依赖查找警告 这个警告是EJB模块的MANIFEST.MF中指定的依赖路径指向了EJB自身的目录,而非EAR的依赖目录。需要调整EJB模块的MANIFEST配置:
在EJB模块的pom.xml中配置maven-ejb-plugin,生成正确的Class-Path路径(指向EAR的lib目录):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ejb-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <!-- EJB模块打包在EAR的子目录中,依赖在EAR的lib目录,所以用相对路径../lib/ --> <classpathPrefix>../lib/</classpathPrefix> </manifest> </archive> </configuration> </plugin>
同时确保EAR模块的pom.xml正确配置maven-ear-plugin,将EJB模块和依赖打包到正确位置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ear-plugin</artifactId> <version>3.3.0</version> <configuration> <modules> <ejbModule> <groupId>${project.groupId}</groupId> <artifactId>ejb</artifactId> </ejbModule> </modules> <!-- 将第三方依赖打包到EAR的lib目录 --> <defaultLibBundleDir>lib</defaultLibBundleDir> </configuration> </plugin>
完成以上配置后,Liberty会以EAR为单元加载应用,所有依赖会从EAR的lib目录或EJB模块中正确读取,不再出现路径错误的警告。
内容的提问来源于stack exchange,提问作者John Deverall
相关产品推荐
相关产品推荐

