我想使用Maven打包一个消息驱动的bean。 bean具有各种依赖项(外部库),应该与它一起打包。最后,生成的软件包应该部署在应用程序服务器上(例如Wildfly)。
我尝试创建多模块Maven项目,其中我有一个带有“ear”打包的模块,该模块依赖于使用“jar”打包的实际消息驱动bean模块(我在这里也试过“ejb”)。但是,当调用消息驱动的bean时,它无法访问其依赖项(没有NoClassDefFoundError)。
我的“ear”pom的以下更改修复了此问题,因为消息驱动的bean现在可以访问依赖项。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<defaultLibBundleDir>lib</defaultLibBundleDir>
</configuration>
</plugin>
</plugins>
</build>
虽然现在基本上有效,但我觉得我做错了。我真的需要像这样改变我的pom吗?如果我必须将依赖项放在lib目录中,为什么Maven在构建EAR文件时默认不这样做。
答案 0 :(得分:0)
我认为 EAR / lib 文件夹是后来的java ee规范,maven ear插件没有更新为“java ee defaults”。
在maven-ear-plugin中使用“ defaultLibBundleDir ”将所有传递依赖项放在此声明的文件夹中。第二个是在application.xml文件夹中,maven正在配置“ library-directory ”元素。这不是必需的,因为“lib”文件夹默认加载了耳朵类加载器。
这可以通过将maven ear配置libraryDirectoryMode设置为NONE
来解决我认为最佳做法是将 fileNameMapping 用于无版本配置。这将删除文件名中的maven版本。 maven版本也在jar / META-INF / MANIFEST.MF中 这是模块的jndi名称,因为模块名称来自jar / war名称而没有文件结尾。
您的配置应如下所示:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.9.1</version>
<configuration>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<libraryDirectoryMode>NONE</libraryDirectoryMode>
<fileNameMapping>no-version</fileNameMapping>
</configuration>
</plugin>
</plugins>
</build>