2014-10-17 92 views
0

我想使用Maven打包消息驱动的bean。这个bean有各种依赖性(外部库),应该与它打包在一起。最后,生成的包应该部署在应用程序服务器上(如Wildfly)。如何使用Maven打包消息驱动的bean?

我试图创建多模块Maven项目,其中我有一个“耳朵”包装模块,它依赖于使用“jar”包装的实际消息驱动bean模块(我也在这里尝试了“ejb”)。但是,当调用消息驱动的bean时,它不能访问它的依赖项(no 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

http://www.developerscrappad.com/1272/java/java-ee/maven/building-and-deploying-java-ee-ear-with -maven-to-java-ee-application-server-part-2-where-to-your-source-codes-and -pom-xml -ejb -mdb-web-enterprise-application-client/ – 2014-10-17 08:19:59

回答

0

EAR/lib目录文件夹是库和该文件夹中的每个* .jar文件的默认文件夹会自动由耳类加载器加载(Java EE的7规格)

我认为EAR/lib文件夹是在java ee的后续规范中出现的,而maven耳塞未更新到此“java ee defaults”。

与“defaultLibBundleDir”在maven-ear-plugin中,所有的传递依赖都放在这个声明的文件夹中。第二个是在application.xml文件夹内maven正在配置“库目录”元素。这不是必需的,因为“lib”文件夹默认是用ear类加载器加载的。

这可以通过Maven的耳朵配置libraryDirectoryMode的设置为NONE

解决我想这也是使用fileNameMapping没有版本配置的最佳实践。这会从文件名中删除Maven版本。 maven版本也在jar/META-INF/MANIFEST.MF 里,因为模块名称来自jar/war名称而没有文件结尾,所以这是模块的jndi名称。

配置对子级是这样的:

<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> 
+0

感谢你有用的答案。找出插件为什么会以特定方式运行并不容易。没有及时使用最新的Java EE标准的插件是合理的(无论出于何种原因)。 – 2015-01-22 13:30:03