如何使用Maven打包消息驱动的bean?

时间:2014-10-17 08:17:51

标签: java maven-3 java-ee-7 message-driven-bean

我想使用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文件时默认不这样做。

1 个答案:

答案 0 :(得分:0)

文件夹是库的默认文件夹,此文件夹中的每个* .jar文件都由ear类加载器自动加载(Java EE 7规范)

我认为 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>