如何在EAR项目中部署EJB项目和JPA项目

时间:2014-11-14 11:55:41

标签: java eclipse java-ee jboss

我创建了2个项目,一个是EJB,一个是JPA。 JPA项目定义实体类和persistent.xml。 EBJ项目导入JPA项目,我定义了EJB会话bean通过实体管理器连接数据库。请参阅下面的图片了解详情。但是当在Jboss 7上运行时,会发生错误。

enter image description here

03:23:59,546 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Failed to start service jboss.deployment.subunit."TestApps.ear"."TestEJB.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."TestApps.ear"."TestEJB.jar".POST_MODULE: Failed to p
rocess phase POST_MODULE of subdeployment "TestEJB.jar" of deployment "TestApps.ear"
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:119) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) [rt.jar:1.6.0_22]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.6.0_22]
        at java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_22]
Caused by: java.lang.RuntimeException: Error getting reflective information for class com.ejb.services.LotUpdatManagerBean with ClassLoader ModuleClassLoader for Module "deployment.TestApps.ear.TestEJB.jar:main" from Service Module Loader
        at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.as.ee.metadata.MethodAnnotationAggregator.runtimeAnnotationInformation(MethodAnnotationAggregator.java:58)
        at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.handleAnnotations(InterceptorAnnotationProcessor.java:85)
        at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.processComponentConfig(InterceptorAnnotationProcessor.java:70)
        at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.deploy(InterceptorAnnotationProcessor.java:55)
        at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
        ... 5 more
Caused by: java.lang.NoClassDefFoundError: com/test/model/LotUpdates
        at java.lang.Class.getDeclaredMethods0(Native Method) [rt.jar:1.6.0_22]
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source) [rt.jar:1.6.0_22]
        at java.lang.Class.getDeclaredMethods(Unknown Source) [rt.jar:1.6.0_22]
        at org.jboss.as.server.deployment.reflect.ClassReflectionIndex.<init>(ClassReflectionIndex.java:65) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
        at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:66) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
        ... 10 more
Caused by: java.lang.ClassNotFoundException: com.test.model.LotUpdates from [Module "deployment.TestApps.ear.TestEJB.jar:main" from Service Module Loader]
        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
        at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
        ... 15 more

03:23:59,762 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS015870: Deploy of deployment "TestApps.ear" was rolled back with failure message {"JBAS014671: Failed services" => {"jboss.deployment.subunit.\"TestApps.ear\".\"TestEJB.jar\".POST_MODULE" => "org.jboss.msc.service.StartExce
ption in service jboss.deployment.subunit.\"TestApps.ear\".\"TestEJB.jar\".POST_MODULE: Failed to process phase POST_MODULE of subdeployment \"TestEJB.jar\" of deployment \"TestApps.ear\""}}
03:23:59,765 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015877: Stopped deployment TestEJB.jar in 2ms
03:23:59,767 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015877: Stopped deployment TestApps.ear in 4ms
03:23:59,768 INFO  [org.jboss.as.controller] (DeploymentScanner-threads - 2) JBAS014774: Service status report
JBAS014777:   Services which failed to start:      service jboss.deployment.subunit."TestApps.ear"."TestEJB.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.subunit."TestApps.ear"."TestEJB.jar".POST_MODULE: Failed to process phase POST_MODULE of subdeployment "TestE
JB.jar" of deployment "TestApps.ear"

我失败了。任何人都可以纠正我,告诉我部署的方式(jpa项目和ejb项目在同一个耳朵)。

3 个答案:

答案 0 :(得分:1)

您有两种可能的选择:

  • 如果您TestJpa.jar位于ear\lib文件夹中,则默认情况下该文件应在ejb模块中可见(确保EAR位于6.0版本中)
  • 在EJB项目中手动添加Deployment Assembly,JPA项目 - 应该导致EJB模块的清单文件发生更改。

如果您正确配置它,使用任何一种方法都可以在Eclipse中的EJB Module > EAR Libraries中看到JPA项目,而无需在构建路径中将其添加为项目

答案 1 :(得分:0)

作为我们在评论中讨论的后续行动,我提供了这个“答案”作为可能出错的第一个钩子。

关于EAR结构 包类型EAR,WAR和JAR的结构定义良好,必须遵循以生成以后将在JBoss等应用程序服务器上运行的企业归档(EAR)。

您将在https://docs.oracle.com/javaee/6/tutorial/doc/bnaby.html下找到有关打包的任何必要信息(请注意,这是针对Java EE 6的)。

基本上这就是要走的路,我不能帮助你更多:(

但是根据评论中的要求,我将尝试指出一些特别重要的点,即根据上述包装惯例,必须绝对正确地进行链接(我可以立即告诉您,例如我们的JPA模块位于lib文件夹也是如此)。

因此,如果我打开其中一个(工作)EAR,我会在其中看到以下内容:

  • LIB
  • META-INF
  • 我们-EJB-part.jar
  • 我们的-网站application.war
  • 我们的Web网页-application.war

我们的ejb-part.jar例如根本不包含任何Java代码。但是,它包含一个META-INF文件夹,其中包含 ejb-jar.xml 等描述符,以及properties文件夹下的一些属性文件。它还定义了 MANIFEST.MF 中的类路径。 (我多年来一直没有使用JBoss - 我们目前使用IBM Websphere,因此我们在META-INF文件夹中也有-bnd.xml / -ext.xml部署描述符...我不知道Jboss是否需要类似的部署信息)。这里没有什么可看的了。

暂时忘掉这两个Web模块 - 你似乎没有.war文件形式的任何web部分(它本身必须遵循oracle文档中定义的某些包需求)。

但请注意,如果你有任何EJB或WEB模块,它们必须列在META-INF文件中的 application.xml 文件中(而不是ejb的META-INF文件夹)但是在EAR的META-INF文件夹中,它与/lib/our-ejb-part.jar等处于同一级别。另请注意,在META-INF目录中,我们再次拥有两个Websphere部署描述符以及一个空的MANIFEST.MF。

最后,我们有lib文件夹,其中包含我们所有的EAR-Dependencies(以及大多数Web-Part依赖项)所在的文件夹。这是我们保留JPA-,Commons-,Service-,Service-Implementations-等组件的模块的位置(而不是将它们放在ejb-part.jar内...但我不能考虑这是否是好的做法)。

所以回到你的情况可能会出现很多问题 - 我建议你添加一个最终* .ear文件内容的打印屏幕,而不是上面的eclipse视图,可能会得到进一步的建议。这个eclipse视图的主要问题是至少我不知道你的最终.ear文件是什么样子的(例如WEB-INF application.xml文件夹位于EAR Content下面}。

对不起,我不会从这里得到帮助,因为我没有任何JBoss知识(日志可能意味着什么是错误的更详细的水平比我可以解释...我目前只知道你的EAR可能不会包含这个类LotUpdates或者它可能在那里,但没有正确地添加到类路径中)

答案 2 :(得分:0)

我在Ubuntu上使用eclipse做了同样的事情。 EAR文件包含ejb.jar和jpa.jar,其中jpa.jar位于* .ear / lib /中。 Jboss 7可以部署耳塞。我认为根本原因是jpa类是在jpa.jar中构建和打包的,因此ejb.jar可以加载它。